[{"data":1,"prerenderedAt":3843},["ShallowReactive",2],{"navigation":3,"\u002Fconcepts\u002Fobserve\u002Fsecrets":909,"\u002Fconcepts\u002Fobserve\u002Fsecrets-surround":3838},[4,59,188,271,445,591,760,791],{"title":5,"type":6,"device":6,"path":7,"stem":8,"children":9,"page":41},"Get Started",null,"\u002Fget-started\u002F","01.get-started",[10,15,42,47,51,55],{"title":11,"path":12,"stem":13,"type":14,"device":6},"Welcome to UniteLabs","\u002Fget-started\u002Fwelcome\u002F","01.get-started\u002F00.welcome","landing",{"title":16,"type":6,"device":6,"path":17,"stem":18,"children":19,"page":41},"Setup","\u002Fget-started\u002Fsetup\u002F","01.get-started\u002F01.setup",[20,25,29,33,37],{"title":21,"path":22,"stem":23,"type":24,"device":6},"Get access","\u002Fget-started\u002Fsetup\u002Fget-access\u002F","01.get-started\u002F01.setup\u002F00.get-access","howto",{"title":26,"path":27,"stem":28,"type":24,"device":6},"GroundControl","\u002Fget-started\u002Fsetup\u002Fgroundcontrol\u002F","01.get-started\u002F01.setup\u002F10.groundcontrol",{"title":30,"path":31,"stem":32,"type":24,"device":6},"Connect to Platform","\u002Fget-started\u002Fsetup\u002Fconnect-to-platform\u002F","01.get-started\u002F01.setup\u002F20.connect-to-platform",{"title":34,"path":35,"stem":36,"type":24,"device":6},"Set up your development machine","\u002Fget-started\u002Fsetup\u002Fdeveloper-machine\u002F","01.get-started\u002F01.setup\u002F30.developer-machine",{"title":38,"path":39,"stem":40,"type":24,"device":6},"SDK installation","\u002Fget-started\u002Fsetup\u002Fsdk-installation\u002F","01.get-started\u002F01.setup\u002F40.sdk-installation",false,{"title":43,"path":44,"stem":45,"type":46,"device":6},"Control a device","\u002Fget-started\u002Fcontrol-a-device\u002F","01.get-started\u002F02.control-a-device","tutorial",{"title":48,"path":49,"stem":50,"type":46,"device":6},"Liquid handling as code","\u002Fget-started\u002Fliquid-handling-as-code\u002F","01.get-started\u002F03.liquid-handling-as-code",{"title":52,"path":53,"stem":54,"type":46,"device":6},"Automate your workflows","\u002Fget-started\u002Fautomate-your-workflows\u002F","01.get-started\u002F04.automate-your-workflows",{"title":56,"path":57,"stem":58,"type":6,"device":6},"Self-Paced Setup Guide","\u002Fget-started\u002Fself-onboarding\u002F","01.get-started\u002F90.self-onboarding",{"title":60,"type":6,"device":6,"path":61,"stem":62,"children":63,"page":41},"How-to","\u002Fhow-to\u002F","02.how-to",[64,118,163,180],{"title":65,"type":6,"device":6,"path":66,"stem":67,"children":68,"page":41},"Connectors and devices","\u002Fhow-to\u002Fintegrate\u002F","02.how-to\u002F02.integrate",[69,102],{"title":70,"type":6,"device":6,"path":71,"stem":72,"children":73,"page":41},"Connect a device","\u002Fhow-to\u002Fintegrate\u002Fconnect-a-device\u002F","02.how-to\u002F02.integrate\u002F20.connect-a-device",[74,78,82,86,90,94,98],{"title":75,"path":76,"stem":77,"type":24,"device":6},"Connector Configuration","\u002Fhow-to\u002Fintegrate\u002Fconnect-a-device\u002Fconnector-configuration\u002F","02.how-to\u002F02.integrate\u002F20.connect-a-device\u002F10.connector-configuration",{"title":79,"path":80,"stem":81,"type":24,"device":6},"With an executable","\u002Fhow-to\u002Fintegrate\u002Fconnect-a-device\u002Fwith-an-executable\u002F","02.how-to\u002F02.integrate\u002F20.connect-a-device\u002F20.with-an-executable",{"title":83,"path":84,"stem":85,"type":24,"device":6},"From source","\u002Fhow-to\u002Fintegrate\u002Fconnect-a-device\u002Ffrom-source\u002F","02.how-to\u002F02.integrate\u002F20.connect-a-device\u002F30.from-source",{"title":87,"path":88,"stem":89,"type":24,"device":6},"Build your own","\u002Fhow-to\u002Fintegrate\u002Fconnect-a-device\u002Fbuild-yourself\u002F","02.how-to\u002F02.integrate\u002F20.connect-a-device\u002F40.build-yourself",{"title":91,"path":92,"stem":93,"type":24,"device":6},"Headless install","\u002Fhow-to\u002Fintegrate\u002Fconnect-a-device\u002Fheadless-install\u002F","02.how-to\u002F02.integrate\u002F20.connect-a-device\u002F50.headless-install",{"title":95,"path":96,"stem":97,"type":24,"device":6},"Raspberry Pi","\u002Fhow-to\u002Fintegrate\u002Fconnect-a-device\u002Fraspberry-pi\u002F","02.how-to\u002F02.integrate\u002F20.connect-a-device\u002F55.raspberry-pi",{"title":99,"path":100,"stem":101,"type":24,"device":6},"Multi-device Networking","\u002Fhow-to\u002Fintegrate\u002Fconnect-a-device\u002Fmultiple-devices\u002F","02.how-to\u002F02.integrate\u002F20.connect-a-device\u002F60.multiple-devices",{"title":103,"type":6,"device":6,"path":104,"stem":105,"children":106,"page":41},"Use a device","\u002Fhow-to\u002Fintegrate\u002Fuse-a-device\u002F","02.how-to\u002F02.integrate\u002F30.use-a-device",[107,110,114],{"title":26,"path":108,"stem":109,"type":24,"device":6},"\u002Fhow-to\u002Fintegrate\u002Fuse-a-device\u002Fgroundcontrol\u002F","02.how-to\u002F02.integrate\u002F30.use-a-device\u002F10.groundcontrol",{"title":111,"path":112,"stem":113,"type":24,"device":6},"Platform","\u002Fhow-to\u002Fintegrate\u002Fuse-a-device\u002Fplatform\u002F","02.how-to\u002F02.integrate\u002F30.use-a-device\u002F20.platform",{"title":115,"path":116,"stem":117,"type":24,"device":6},"UniteLabs SDK & REST API","\u002Fhow-to\u002Fintegrate\u002Fuse-a-device\u002Fpython\u002F","02.how-to\u002F02.integrate\u002F30.use-a-device\u002F30.python",{"title":119,"type":6,"device":6,"path":120,"stem":121,"children":122,"page":41},"Workflows","\u002Fhow-to\u002Fautomate\u002F","02.how-to\u002F07.automate",[123,127,131,135,139,143,147,151,155,159],{"title":124,"path":125,"stem":126,"type":24,"device":6},"Deploy a workflow","\u002Fhow-to\u002Fautomate\u002Fdeploy-a-workflow\u002F","02.how-to\u002F07.automate\u002F30.deploy-a-workflow",{"title":128,"path":129,"stem":130,"type":24,"device":6},"Run a workflow","\u002Fhow-to\u002Fautomate\u002Frun-a-workflow\u002F","02.how-to\u002F07.automate\u002F35.run-a-workflow",{"title":132,"path":133,"stem":134,"type":24,"device":6},"CI\u002FCD for workflows","\u002Fhow-to\u002Fautomate\u002Fcicd-for-workflows\u002F","02.how-to\u002F07.automate\u002F40.cicd-for-workflows",{"title":136,"path":137,"stem":138,"type":24,"device":6},"HITL basics","\u002Fhow-to\u002Fautomate\u002Fbasic-hitl\u002F","02.how-to\u002F07.automate\u002F50.basic-hitl",{"title":140,"path":141,"stem":142,"type":24,"device":6},"Slack notifications and operator confirmation","\u002Fhow-to\u002Fautomate\u002Fslack-notifications\u002F","02.how-to\u002F07.automate\u002F52.slack-notifications",{"title":144,"path":145,"stem":146,"type":24,"device":6},"Typed operator inputs","\u002Fhow-to\u002Fautomate\u002Ftyped-operator-inputs\u002F","02.how-to\u002F07.automate\u002F55.typed-operator-inputs",{"title":148,"path":149,"stem":150,"type":24,"device":6},"Pause and resume a run","\u002Fhow-to\u002Fautomate\u002Fpause-and-resume\u002F","02.how-to\u002F07.automate\u002F57.pause-and-resume",{"title":152,"path":153,"stem":154,"type":24,"device":6},"Error recovery","\u002Fhow-to\u002Fautomate\u002Fbasic-error-handling\u002F","02.how-to\u002F07.automate\u002F60.basic-error-handling",{"title":156,"path":157,"stem":158,"type":24,"device":6},"Advanced error handling","\u002Fhow-to\u002Fautomate\u002Fadvanced-error-handling\u002F","02.how-to\u002F07.automate\u002F70.advanced-error-handling",{"title":160,"path":161,"stem":162,"type":24,"device":6},"Emit lineage events","\u002Fhow-to\u002Fautomate\u002Femitting-lineage-events\u002F","02.how-to\u002F07.automate\u002F90.emitting-lineage-events",{"title":164,"type":6,"device":6,"path":165,"stem":166,"children":167,"page":41},"Data","\u002Fhow-to\u002Fobserve\u002F","02.how-to\u002F08.observe",[168,172,176],{"title":169,"path":170,"stem":171,"type":24,"device":6},"File System Connector","\u002Fhow-to\u002Fobserve\u002Ffilesystem-connector\u002F","02.how-to\u002F08.observe\u002F10.filesystem-connector",{"title":173,"path":174,"stem":175,"type":24,"device":6},"Building an ETL","\u002Fhow-to\u002Fobserve\u002Fbuilding-an-etl\u002F","02.how-to\u002F08.observe\u002F20.building-an-etl",{"title":177,"path":178,"stem":179,"type":24,"device":6},"Read lineage events","\u002Fhow-to\u002Fobserve\u002Freading-lineage-events\u002F","02.how-to\u002F08.observe\u002F30.reading-lineage-events",{"title":111,"type":6,"device":6,"path":181,"stem":182,"children":183,"page":41},"\u002Fhow-to\u002Fplatform\u002F","02.how-to\u002F09.platform",[184],{"title":185,"path":186,"stem":187,"type":24,"device":6},"UniteLabs Desktop","\u002Fhow-to\u002Fplatform\u002Funitelabs-desktop\u002F","02.how-to\u002F09.platform\u002F10.unitelabs-desktop",{"title":189,"type":6,"device":6,"path":190,"stem":191,"children":192},"Technical Reference","\u002Ftechnical-reference\u002F","03.technical-reference",[193,196,201,213,226,235,244,253,262],{"title":194,"path":190,"stem":195,"type":14,"device":6},"Overview","03.technical-reference\u002Findex",{"title":197,"path":198,"stem":199,"type":200,"device":6},"REST API","\u002Ftechnical-reference\u002Frest-api\u002F","03.technical-reference\u002F01.rest-api","reference",{"title":119,"type":6,"device":6,"path":202,"stem":203,"children":204,"page":41},"\u002Ftechnical-reference\u002Fautomate\u002F","03.technical-reference\u002F07.automate",[205,209],{"title":206,"path":207,"stem":208,"type":200,"device":6},"Workflow template","\u002Ftechnical-reference\u002Fautomate\u002Fworkflow-template\u002F","03.technical-reference\u002F07.automate\u002F05.workflow-template",{"title":210,"path":211,"stem":212,"type":200,"device":6},"Workflows REST API","\u002Ftechnical-reference\u002Fautomate\u002Fworkflows-api\u002F","03.technical-reference\u002F07.automate\u002F80.workflows-api",{"title":26,"type":6,"device":6,"path":214,"stem":215,"children":216},"\u002Ftechnical-reference\u002Fgroundcontrol\u002F","03.technical-reference\u002F10.groundcontrol\u002Findex",[217,218,222],{"title":194,"path":214,"stem":215,"type":14,"device":6},{"title":219,"path":220,"stem":221,"type":200,"device":6},"Network requirements","\u002Ftechnical-reference\u002Fgroundcontrol\u002Fnetwork-requirements\u002F","03.technical-reference\u002F10.groundcontrol\u002F10.network-requirements",{"title":223,"path":224,"stem":225,"type":200,"device":6},"Changelog","\u002Ftechnical-reference\u002Fgroundcontrol\u002Fchangelog\u002F","03.technical-reference\u002F10.groundcontrol\u002F20.changelog",{"title":227,"type":6,"device":6,"path":228,"stem":229,"children":230},"UniteLabs SDK","\u002Ftechnical-reference\u002Fpython-sdk\u002F","03.technical-reference\u002F20.python-sdk\u002Findex",[231,232],{"title":194,"path":228,"stem":229,"type":14,"device":6},{"title":223,"path":233,"stem":234,"type":200,"device":6},"\u002Ftechnical-reference\u002Fpython-sdk\u002Fchangelog\u002F","03.technical-reference\u002F20.python-sdk\u002F20.changelog",{"title":236,"type":6,"device":6,"path":237,"stem":238,"children":239},"Liquid Handling SDK","\u002Ftechnical-reference\u002Fpython-liquid-handling-sdk\u002F","03.technical-reference\u002F30.python-liquid-handling-sdk\u002Findex",[240,241],{"title":194,"path":237,"stem":238,"type":14,"device":6},{"title":223,"path":242,"stem":243,"type":200,"device":6},"\u002Ftechnical-reference\u002Fpython-liquid-handling-sdk\u002Fchangelog\u002F","03.technical-reference\u002F30.python-liquid-handling-sdk\u002F20.changelog",{"title":245,"type":6,"device":6,"path":246,"stem":247,"children":248},"Labware","\u002Ftechnical-reference\u002Flabware\u002F","03.technical-reference\u002F40.labware\u002Findex",[249,250],{"title":194,"path":246,"stem":247,"type":14,"device":6},{"title":223,"path":251,"stem":252,"type":200,"device":6},"\u002Ftechnical-reference\u002Flabware\u002Fchangelog\u002F","03.technical-reference\u002F40.labware\u002F20.changelog",{"title":254,"type":6,"device":6,"path":255,"stem":256,"children":257},"Python Omnibus","\u002Ftechnical-reference\u002Fpython-omnibus\u002F","03.technical-reference\u002F50.python-omnibus\u002Findex",[258,259],{"title":194,"path":255,"stem":256,"type":14,"device":6},{"title":223,"path":260,"stem":261,"type":200,"device":6},"\u002Ftechnical-reference\u002Fpython-omnibus\u002Fchangelog\u002F","03.technical-reference\u002F50.python-omnibus\u002F20.changelog",{"title":263,"type":6,"device":6,"path":264,"stem":265,"children":266},"Python CDK","\u002Ftechnical-reference\u002Fpython-cdk\u002F","03.technical-reference\u002F60.python-cdk\u002Findex",[267,268],{"title":194,"path":264,"stem":265,"type":14,"device":6},{"title":223,"path":269,"stem":270,"type":200,"device":6},"\u002Ftechnical-reference\u002Fpython-cdk\u002Fchangelog\u002F","03.technical-reference\u002F60.python-cdk\u002F20.changelog",{"title":272,"type":6,"device":6,"path":273,"stem":274,"children":275,"page":41},"Concepts","\u002Fconcepts\u002F","04.concepts",[276,315,339,383,422],{"title":277,"type":6,"device":6,"path":278,"stem":279,"children":280,"page":41},"Labs as code","\u002Fconcepts\u002Flabs-as-code\u002F","04.concepts\u002F01.labs-as-code",[281,286,290],{"title":282,"path":283,"stem":284,"type":285,"device":6},"Lab as Code","\u002Fconcepts\u002Flabs-as-code\u002Fwhy-code\u002F","04.concepts\u002F01.labs-as-code\u002F00.why-code","explanation",{"title":287,"path":288,"stem":289,"type":285,"device":6},"How it works","\u002Fconcepts\u002Flabs-as-code\u002Fhow-it-works\u002F","04.concepts\u002F01.labs-as-code\u002F01.how-it-works",{"title":291,"type":6,"device":6,"path":292,"stem":293,"children":294,"page":41},"Use Cases","\u002Fconcepts\u002Flabs-as-code\u002Fuse-cases\u002F","04.concepts\u002F01.labs-as-code\u002F02.use-cases",[295,299,303,307,311],{"title":296,"path":297,"stem":298,"type":285,"device":6},"Instrument Control","\u002Fconcepts\u002Flabs-as-code\u002Fuse-cases\u002Flow-level-instrument-control\u002F","04.concepts\u002F01.labs-as-code\u002F02.use-cases\u002F10.low-level-instrument-control",{"title":300,"path":301,"stem":302,"type":285,"device":6},"Multi-device Control","\u002Fconcepts\u002Flabs-as-code\u002Fuse-cases\u002Fmulti-device-control\u002F","04.concepts\u002F01.labs-as-code\u002F02.use-cases\u002F20.multi-device-control",{"title":304,"path":305,"stem":306,"type":285,"device":6},"Workflow Orchestration","\u002Fconcepts\u002Flabs-as-code\u002Fuse-cases\u002Fworkflow-orchestration\u002F","04.concepts\u002F01.labs-as-code\u002F02.use-cases\u002F30.workflow-orchestration",{"title":308,"path":309,"stem":310,"type":285,"device":6},"Custom Apps and LIMS Integration","\u002Fconcepts\u002Flabs-as-code\u002Fuse-cases\u002Fcustom-apps-lims\u002F","04.concepts\u002F01.labs-as-code\u002F02.use-cases\u002F40.custom-apps-lims",{"title":312,"path":313,"stem":314,"type":285,"device":6},"Scale and Fleet Management","\u002Fconcepts\u002Flabs-as-code\u002Fuse-cases\u002Fscale-and-fleet\u002F","04.concepts\u002F01.labs-as-code\u002F02.use-cases\u002F50.scale-and-fleet",{"title":65,"type":6,"device":6,"path":316,"stem":317,"children":318,"page":41},"\u002Fconcepts\u002Fintegrate\u002F","04.concepts\u002F02.integrate",[319,323,327,331,335],{"title":320,"path":321,"stem":322,"type":285,"device":6},"Device","\u002Fconcepts\u002Fintegrate\u002Fdevice\u002F","04.concepts\u002F02.integrate\u002F05.device",{"title":324,"path":325,"stem":326,"type":285,"device":6},"Connector","\u002Fconcepts\u002Fintegrate\u002Fconnector\u002F","04.concepts\u002F02.integrate\u002F10.connector",{"title":328,"path":329,"stem":330,"type":285,"device":6},"Module","\u002Fconcepts\u002Fintegrate\u002Fmodule\u002F","04.concepts\u002F02.integrate\u002F20.module",{"title":332,"path":333,"stem":334,"type":285,"device":6},"Action","\u002Fconcepts\u002Fintegrate\u002Faction\u002F","04.concepts\u002F02.integrate\u002F30.action",{"title":336,"path":337,"stem":338,"type":285,"device":6},"Subscription","\u002Fconcepts\u002Fintegrate\u002Fsubscription\u002F","04.concepts\u002F02.integrate\u002F40.subscription",{"title":340,"type":6,"device":6,"path":341,"stem":342,"children":343,"page":41},"Liquid handling and robots","\u002Fconcepts\u002Foperate\u002F","04.concepts\u002F03.operate",[344,348,352,356,359,363,367,371,375,379],{"title":345,"path":346,"stem":347,"type":285,"device":6},"Liquid Handling","\u002Fconcepts\u002Foperate\u002Fliquid-handling\u002F","04.concepts\u002F03.operate\u002F10.liquid-handling",{"title":349,"path":350,"stem":351,"type":285,"device":6},"Modules","\u002Fconcepts\u002Foperate\u002Fmodules\u002F","04.concepts\u002F03.operate\u002F20.modules",{"title":353,"path":354,"stem":355,"type":285,"device":6},"Deck","\u002Fconcepts\u002Foperate\u002Fdeck\u002F","04.concepts\u002F03.operate\u002F30.deck",{"title":245,"path":357,"stem":358,"type":285,"device":6},"\u002Fconcepts\u002Foperate\u002Flabware\u002F","04.concepts\u002F03.operate\u002F40.labware",{"title":360,"path":361,"stem":362,"type":285,"device":6},"Liquids","\u002Fconcepts\u002Foperate\u002Fliquids\u002F","04.concepts\u002F03.operate\u002F50.liquids",{"title":364,"path":365,"stem":366,"type":285,"device":6},"Liquid Classes","\u002Fconcepts\u002Foperate\u002Fliquid-classes\u002F","04.concepts\u002F03.operate\u002F60.liquid-classes",{"title":368,"path":369,"stem":370,"type":285,"device":6},"Parameter Sets","\u002Fconcepts\u002Foperate\u002Fparameter-sets\u002F","04.concepts\u002F03.operate\u002F65.parameter-sets",{"title":372,"path":373,"stem":374,"type":285,"device":6},"Tips and Tip Tracking","\u002Fconcepts\u002Foperate\u002Ftips\u002F","04.concepts\u002F03.operate\u002F70.tips",{"title":376,"path":377,"stem":378,"type":285,"device":6},"Simulation","\u002Fconcepts\u002Foperate\u002Fsimulation\u002F","04.concepts\u002F03.operate\u002F80.simulation",{"title":380,"path":381,"stem":382,"type":285,"device":6},"Error Handling","\u002Fconcepts\u002Foperate\u002Ferror-handling\u002F","04.concepts\u002F03.operate\u002F90.error-handling",{"title":119,"type":6,"device":6,"path":384,"stem":385,"children":386,"page":41},"\u002Fconcepts\u002Fautomate\u002F","04.concepts\u002F07.automate",[387,391,395,399,403,407,411,415,419],{"title":388,"path":389,"stem":390,"type":285,"device":6},"Workflow","\u002Fconcepts\u002Fautomate\u002Fworkflow\u002F","04.concepts\u002F07.automate\u002F10.workflow",{"title":392,"path":393,"stem":394,"type":285,"device":6},"Phase","\u002Fconcepts\u002Fautomate\u002Fphase\u002F","04.concepts\u002F07.automate\u002F20.phase",{"title":396,"path":397,"stem":398,"type":285,"device":6},"Step","\u002Fconcepts\u002Fautomate\u002Fstep\u002F","04.concepts\u002F07.automate\u002F30.step",{"title":400,"path":401,"stem":402,"type":285,"device":6},"Runs","\u002Fconcepts\u002Fautomate\u002Fruns\u002F","04.concepts\u002F07.automate\u002F40.runs",{"title":404,"path":405,"stem":406,"type":285,"device":6},"Input","\u002Fconcepts\u002Fautomate\u002Finput\u002F","04.concepts\u002F07.automate\u002F50.input",{"title":408,"path":409,"stem":410,"type":285,"device":6},"Artifacts","\u002Fconcepts\u002Fautomate\u002Fartifacts\u002F","04.concepts\u002F07.automate\u002F60.artifacts",{"title":412,"path":413,"stem":414,"type":285,"device":6},"Logs","\u002Fconcepts\u002Fautomate\u002Flogs\u002F","04.concepts\u002F07.automate\u002F70.logs",{"title":416,"path":417,"stem":418,"type":285,"device":6},"Human in the Loop","\u002Fconcepts\u002Fautomate\u002Fhuman-in-the-loop\u002F","04.concepts\u002F07.automate\u002F80.human-in-the-loop",{"title":380,"path":420,"stem":421,"type":285,"device":6},"\u002Fconcepts\u002Fautomate\u002Ferror-handling\u002F","04.concepts\u002F07.automate\u002F90.error-handling",{"title":164,"type":6,"device":6,"path":423,"stem":424,"children":425,"page":41},"\u002Fconcepts\u002Fobserve\u002F","04.concepts\u002F08.observe",[426,429,433,437,441],{"title":194,"path":427,"stem":428,"type":14,"device":6},"\u002Fconcepts\u002Fobserve\u002Foverview\u002F","04.concepts\u002F08.observe\u002F10.overview",{"title":430,"path":431,"stem":432,"type":285,"device":6},"Object Storage","\u002Fconcepts\u002Fobserve\u002Fstorage\u002F","04.concepts\u002F08.observe\u002F10.storage",{"title":434,"path":435,"stem":436,"type":285,"device":6},"Secrets","\u002Fconcepts\u002Fobserve\u002Fsecrets\u002F","04.concepts\u002F08.observe\u002F20.secrets",{"title":438,"path":439,"stem":440,"type":285,"device":6},"Data sources","\u002Fconcepts\u002Fobserve\u002Fdata-sources\u002F","04.concepts\u002F08.observe\u002F30.data-sources",{"title":442,"path":443,"stem":444,"type":285,"device":6},"Data lineage","\u002Fconcepts\u002Fobserve\u002Fdata-lineage\u002F","04.concepts\u002F08.observe\u002F40.data-lineage",{"title":446,"type":6,"device":6,"path":447,"stem":448,"children":449,"page":41},"Devices","\u002Fdevices\u002F","05.devices",[450,453,501,514,530,567],{"title":194,"path":451,"stem":452,"type":14,"device":6},"\u002Fdevices\u002Foverview\u002F","05.devices\u002F00.overview",{"title":454,"path":455,"page":41,"children":456},"Heater-shakers","\u002Fdevices\u002Fheater-shakers\u002F",[457,478,488],{"title":458,"path":459,"stem":460,"type":200,"device":461},"QInstruments BioShake","\u002Fdevices\u002Fqinstruments-bioshake\u002F","05.devices\u002F10.qinstruments-bioshake",{"slug":462,"vendor":463,"category":464,"connector":462,"package":465,"models":466,"communication":473,"vendor_software":6,"os":474},"qinstruments-bioshake","QInstruments","Plate Shakers & Temperature Control","unitelabs-qinstruments-bioshake",[467,468,469,470,471,472],"BioShake 3000 \u002F 3000 elm \u002F 3000 elm DWP","BioShake 3000-T \u002F 3000-T elm","BioShake 5000 elm","BioShake D30 \u002F D30 elm \u002F D30-T \u002F D30-T elm","BioShake Q1 \u002F Q1 (1.2 mm) \u002F Q1 (3.0 mm) \u002F Q2","HeatPlate","serial (RS-232 over USB)",[475,476,477],"windows","linux","macos",{"title":479,"path":480,"stem":481,"type":200,"device":482},"QInstruments ColdPlate","\u002Fdevices\u002Fqinstruments-coldplate\u002F","05.devices\u002F20.qinstruments-coldplate",{"slug":483,"vendor":463,"category":464,"connector":462,"package":465,"models":484,"communication":473,"vendor_software":6,"os":487},"qinstruments-coldplate",[485,486],"ColdPlate","ColdPlate slim",[475,476,477],{"title":489,"path":490,"stem":491,"type":200,"device":492},"Inheco Thermoshake","\u002Fdevices\u002Finheco-thermoshake\u002F","05.devices\u002F30.inheco-thermoshake",{"slug":493,"vendor":494,"category":464,"connector":495,"models":496},"inheco-thermoshake","Inheco","inheco-tec-controller",[497,498,499,500],"Thermoshake AC","Thermoshake AC LC","Thermoshake Classic","Thermoshake RM",{"title":502,"path":503,"page":41,"children":504},"Incubation","\u002Fdevices\u002Fincubation\u002F",[505],{"title":506,"path":507,"stem":508,"type":200,"device":509},"Inheco SCILA","\u002Fdevices\u002Finheco-scila\u002F","05.devices\u002F40.inheco-scila",{"slug":510,"vendor":494,"category":502,"connector":510,"models":511},"inheco-scila",[512,513],"SCILA","SCILA MIX 2-gas mixing device",{"title":515,"path":516,"page":41,"children":517},"Thermal cyclers","\u002Fdevices\u002Fthermal-cyclers\u002F",[518],{"title":519,"path":520,"stem":521,"type":200,"device":522},"Inheco ODTC","\u002Fdevices\u002Finheco-odtc\u002F","05.devices\u002F50.inheco-odtc",{"slug":523,"vendor":494,"category":524,"connector":523,"models":525},"inheco-odtc","Thermal Cycler",[526,527,528,529],"ODTC 96","ODTC 96XL","ODTC 384","ODTC 384XL",{"title":531,"path":532,"page":41,"children":533},"Readers","\u002Fdevices\u002Freaders\u002F",[534,543,552],{"title":535,"path":536,"stem":537,"type":200,"device":538},"Agilent Biotek Gen5","\u002Fdevices\u002Fbiotek-gen5\u002F","05.devices\u002F60.biotek-gen5",{"slug":539,"vendor":540,"category":541,"connector":542},"biotek-gen5","Agilent","Readers & Imagers","gen5",{"title":544,"path":545,"stem":546,"type":200,"device":547},"Biotek Synergy H1","\u002Fdevices\u002Fbiotek-synergy-h1\u002F","05.devices\u002F70.biotek-synergy-h1",{"slug":548,"vendor":540,"category":541,"connector":549,"models":550},"biotek-synergy-h1","agilent-synergy-h1",[551],"BioTek Synergy H1",{"title":553,"path":554,"stem":555,"type":200,"device":556},"Tecan Infinite 200","\u002Fdevices\u002Ftecan-infinite-200\u002F","05.devices\u002F75.tecan-infinite-200",{"slug":557,"vendor":558,"category":541,"connector":557,"package":559,"models":560,"communication":564,"vendor_software":565,"os":566},"tecan-infinite-200","Tecan","unitelabs-tecan-infinite-200",[561,562,563],"Infinite F200","Infinite M200","Infinite M200 Pro","USB","i-control on Windows only, for its USB driver",[475,476,477],{"title":568,"path":569,"page":41,"children":570},"Tilt & turn","\u002Fdevices\u002Ftilt-and-turn\u002F",[571,581],{"title":572,"path":573,"stem":574,"type":200,"device":575},"QInstruments TiltStation","\u002Fdevices\u002Fqinstruments-tiltstation\u002F","05.devices\u002F80.qinstruments-tiltstation",{"slug":576,"vendor":463,"category":577,"connector":462,"package":465,"models":578,"communication":473,"vendor_software":6,"os":580},"qinstruments-tiltstation","Plate Tilting",[579],"TiltStation",[475,476,477],{"title":582,"path":583,"stem":584,"type":200,"device":585},"QInstruments TurnStation","\u002Fdevices\u002Fqinstruments-turnstation\u002F","05.devices\u002F90.qinstruments-turnstation",{"slug":586,"vendor":463,"category":587,"connector":462,"package":465,"models":588,"communication":473,"vendor_software":6,"os":590},"qinstruments-turnstation","Plate Rotating",[589],"TurnStation",[475,476,477],{"title":592,"type":6,"device":6,"path":593,"stem":594,"children":595,"page":41},"Liquid Handling and Robots","\u002Fliquid-handling-and-robots\u002F","06.liquid-handling-and-robots",[596,599,611,635,638,679,704,721,738],{"title":194,"path":597,"stem":598,"type":14,"device":6},"\u002Fliquid-handling-and-robots\u002Foverview\u002F","06.liquid-handling-and-robots\u002F00.overview",{"title":353,"type":6,"device":6,"path":600,"stem":601,"children":602,"page":41},"\u002Fliquid-handling-and-robots\u002Fdeck\u002F","06.liquid-handling-and-robots\u002F10.deck",[603,607],{"title":604,"path":605,"stem":606,"type":24,"device":6},"Building a Deck","\u002Fliquid-handling-and-robots\u002Fdeck\u002Fbuilding-a-deck\u002F","06.liquid-handling-and-robots\u002F10.deck\u002F10.building-a-deck",{"title":608,"path":609,"stem":610,"type":24,"device":6},"Save\u002FLoad a Deck","\u002Fliquid-handling-and-robots\u002Fdeck\u002Fsave-load-deck\u002F","06.liquid-handling-and-robots\u002F10.deck\u002F20.save-load-deck",{"title":612,"type":6,"device":6,"path":613,"stem":614,"children":615,"page":41},"Pipetting","\u002Fliquid-handling-and-robots\u002Fpipetting\u002F","06.liquid-handling-and-robots\u002F20.pipetting",[616,620,624,628,631],{"title":617,"path":618,"stem":619,"type":24,"device":6},"Basic Pipetting","\u002Fliquid-handling-and-robots\u002Fpipetting\u002Fbasic-pipetting\u002F","06.liquid-handling-and-robots\u002F20.pipetting\u002F10.basic-pipetting",{"title":621,"path":622,"stem":623,"type":24,"device":6},"Advanced Pipetting","\u002Fliquid-handling-and-robots\u002Fpipetting\u002Fadvanced-pipetting\u002F","06.liquid-handling-and-robots\u002F20.pipetting\u002F20.advanced-pipetting",{"title":625,"path":626,"stem":627,"type":24,"device":6},"Tip Handling","\u002Fliquid-handling-and-robots\u002Fpipetting\u002Ftip-handling\u002F","06.liquid-handling-and-robots\u002F20.pipetting\u002F30.tip-handling",{"title":364,"path":629,"stem":630,"type":24,"device":6},"\u002Fliquid-handling-and-robots\u002Fpipetting\u002Fliquid-classes\u002F","06.liquid-handling-and-robots\u002F20.pipetting\u002F40.liquid-classes",{"title":632,"path":633,"stem":634,"type":24,"device":6},"Labware Transport","\u002Fliquid-handling-and-robots\u002Fpipetting\u002Flabware-transport\u002F","06.liquid-handling-and-robots\u002F20.pipetting\u002F50.labware-transport",{"title":376,"path":636,"stem":637,"type":24,"device":6},"\u002Fliquid-handling-and-robots\u002Fsimulation\u002F","06.liquid-handling-and-robots\u002F30.simulation",{"title":639,"type":6,"device":6,"path":640,"stem":641,"children":642,"page":41},"Hamilton STAR","\u002Fliquid-handling-and-robots\u002Fhamilton-star\u002F","06.liquid-handling-and-robots\u002F41.hamilton-star",[643,647,651,655,659,663,667,671,675],{"title":644,"path":645,"stem":646,"type":24,"device":6},"Positioning & Movement","\u002Fliquid-handling-and-robots\u002Fhamilton-star\u002Fpositioning\u002F","06.liquid-handling-and-robots\u002F41.hamilton-star\u002F10.positioning",{"title":648,"path":649,"stem":650,"type":24,"device":6},"Gripper Module","\u002Fliquid-handling-and-robots\u002Fhamilton-star\u002Fcore-gripper\u002F","06.liquid-handling-and-robots\u002F41.hamilton-star\u002F20.core-gripper",{"title":652,"path":653,"stem":654,"type":24,"device":6},"iSWAP Module","\u002Fliquid-handling-and-robots\u002Fhamilton-star\u002Fiswap\u002F","06.liquid-handling-and-robots\u002F41.hamilton-star\u002F30.iswap",{"title":656,"path":657,"stem":658,"type":24,"device":6},"Using TADM","\u002Fliquid-handling-and-robots\u002Fhamilton-star\u002Ftadm\u002F","06.liquid-handling-and-robots\u002F41.hamilton-star\u002F40.tadm",{"title":660,"path":661,"stem":662,"type":24,"device":6},"Autoload Module","\u002Fliquid-handling-and-robots\u002Fhamilton-star\u002Fautoload\u002F","06.liquid-handling-and-robots\u002F41.hamilton-star\u002F50.autoload",{"title":664,"path":665,"stem":666,"type":24,"device":6},"Waste Block","\u002Fliquid-handling-and-robots\u002Fhamilton-star\u002Fwaste-block\u002F","06.liquid-handling-and-robots\u002F41.hamilton-star\u002F60.waste-block",{"title":668,"path":669,"stem":670,"type":24,"device":6},"Complex Mixing","\u002Fliquid-handling-and-robots\u002Fhamilton-star\u002Fcomplex-mixing\u002F","06.liquid-handling-and-robots\u002F41.hamilton-star\u002F66.complex-mixing",{"title":672,"path":673,"stem":674,"type":24,"device":6},"Teaching Gripper Paddle Positions","\u002Fliquid-handling-and-robots\u002Fhamilton-star\u002Fgripper-positions\u002F","06.liquid-handling-and-robots\u002F41.hamilton-star\u002F70.gripper-positions",{"title":676,"path":677,"stem":678,"type":24,"device":6},"Training a Custom Deck Position With the iSWAP","\u002Fliquid-handling-and-robots\u002Fhamilton-star\u002Fcustom-deck-position\u002F","06.liquid-handling-and-robots\u002F41.hamilton-star\u002F75.custom-deck-position",{"title":680,"type":6,"device":6,"path":681,"stem":682,"children":683,"page":41},"Hamilton Vantage","\u002Fliquid-handling-and-robots\u002Fhamilton-vantage\u002F","06.liquid-handling-and-robots\u002F42.hamilton-vantage",[684,688,692,696,700],{"title":685,"path":686,"stem":687,"type":24,"device":6},"Waste Configuration","\u002Fliquid-handling-and-robots\u002Fhamilton-vantage\u002Fwaste-configuration\u002F","06.liquid-handling-and-robots\u002F42.hamilton-vantage\u002F05.waste-configuration",{"title":689,"path":690,"stem":691,"type":24,"device":6},"Covers and Lights","\u002Fliquid-handling-and-robots\u002Fhamilton-vantage\u002Fcovers-and-lights\u002F","06.liquid-handling-and-robots\u002F42.hamilton-vantage\u002F10.covers-and-lights",{"title":693,"path":694,"stem":695,"type":24,"device":6},"IDL Module","\u002Fliquid-handling-and-robots\u002Fhamilton-vantage\u002Fidl\u002F","06.liquid-handling-and-robots\u002F42.hamilton-vantage\u002F20.idl",{"title":697,"path":698,"stem":699,"type":24,"device":6},"IPG Module","\u002Fliquid-handling-and-robots\u002Fhamilton-vantage\u002Fipg\u002F","06.liquid-handling-and-robots\u002F42.hamilton-vantage\u002F30.ipg",{"title":701,"path":702,"stem":703,"type":24,"device":6},"XL Pipettes","\u002Fliquid-handling-and-robots\u002Fhamilton-vantage\u002Fxl-channels\u002F","06.liquid-handling-and-robots\u002F42.hamilton-vantage\u002F40.xl-channels",{"title":705,"type":6,"device":6,"path":706,"stem":707,"children":708,"page":41},"Agilent Bravo","\u002Fliquid-handling-and-robots\u002Fagilent-bravo\u002F","06.liquid-handling-and-robots\u002F43.agilent-bravo",[709,712,715,718],{"title":625,"path":710,"stem":711,"type":24,"device":6},"\u002Fliquid-handling-and-robots\u002Fagilent-bravo\u002Ftip-handling\u002F","06.liquid-handling-and-robots\u002F43.agilent-bravo\u002F10.tip-handling",{"title":617,"path":713,"stem":714,"type":24,"device":6},"\u002Fliquid-handling-and-robots\u002Fagilent-bravo\u002Fbasic-pipetting\u002F","06.liquid-handling-and-robots\u002F43.agilent-bravo\u002F20.basic-pipetting",{"title":364,"path":716,"stem":717,"type":24,"device":6},"\u002Fliquid-handling-and-robots\u002Fagilent-bravo\u002Fliquid-classes\u002F","06.liquid-handling-and-robots\u002F43.agilent-bravo\u002F25.liquid-classes",{"title":648,"path":719,"stem":720,"type":24,"device":6},"\u002Fliquid-handling-and-robots\u002Fagilent-bravo\u002Fusing-the-gripper\u002F","06.liquid-handling-and-robots\u002F43.agilent-bravo\u002F30.using-the-gripper",{"title":722,"type":6,"device":6,"path":723,"stem":724,"children":725,"page":41},"Tecan FluentControl","\u002Fliquid-handling-and-robots\u002Ftecan-fluentcontrol\u002F","06.liquid-handling-and-robots\u002F44.tecan-fluentcontrol",[726,730,734],{"title":727,"path":728,"stem":729,"type":24,"device":6},"Connect & Run a Method","\u002Fliquid-handling-and-robots\u002Ftecan-fluentcontrol\u002Fconnect-and-run\u002F","06.liquid-handling-and-robots\u002F44.tecan-fluentcontrol\u002F10.connect-and-run",{"title":731,"path":732,"stem":733,"type":24,"device":6},"Sending XML Commands","\u002Fliquid-handling-and-robots\u002Ftecan-fluentcontrol\u002Fsending-xml-commands\u002F","06.liquid-handling-and-robots\u002F44.tecan-fluentcontrol\u002F20.sending-xml-commands",{"title":735,"path":736,"stem":737,"type":24,"device":6},"Full Workflow Example","\u002Fliquid-handling-and-robots\u002Ftecan-fluentcontrol\u002Ffull-workflow-example\u002F","06.liquid-handling-and-robots\u002F44.tecan-fluentcontrol\u002F30.full-workflow-example",{"title":739,"type":6,"device":6,"path":740,"stem":741,"children":742,"page":41},"Tecan Freedom EVO","\u002Fliquid-handling-and-robots\u002Ftecan-freedom-evo\u002F","06.liquid-handling-and-robots\u002F45.tecan-freedom-evo",[743,747,750,753,757],{"title":744,"path":745,"stem":746,"type":24,"device":6},"Deck & Carriers","\u002Fliquid-handling-and-robots\u002Ftecan-freedom-evo\u002Fdeck-and-carriers\u002F","06.liquid-handling-and-robots\u002F45.tecan-freedom-evo\u002F10.deck-and-carriers",{"title":625,"path":748,"stem":749,"type":24,"device":6},"\u002Fliquid-handling-and-robots\u002Ftecan-freedom-evo\u002Ftip-handling\u002F","06.liquid-handling-and-robots\u002F45.tecan-freedom-evo\u002F20.tip-handling",{"title":617,"path":751,"stem":752,"type":24,"device":6},"\u002Fliquid-handling-and-robots\u002Ftecan-freedom-evo\u002Fbasic-pipetting\u002F","06.liquid-handling-and-robots\u002F45.tecan-freedom-evo\u002F30.basic-pipetting",{"title":754,"path":755,"stem":756,"type":24,"device":6},"Using the Gripper (RoMa)","\u002Fliquid-handling-and-robots\u002Ftecan-freedom-evo\u002Fusing-the-gripper\u002F","06.liquid-handling-and-robots\u002F45.tecan-freedom-evo\u002F40.using-the-gripper",{"title":364,"path":758,"stem":759,"type":24,"device":6},"\u002Fliquid-handling-and-robots\u002Ftecan-freedom-evo\u002Fliquid-classes\u002F","06.liquid-handling-and-robots\u002F45.tecan-freedom-evo\u002F50.liquid-classes",{"title":245,"type":6,"device":6,"path":761,"stem":762,"children":763,"page":41},"\u002Flabware\u002F","07.labware",[764,767,771,775,779,783,787],{"title":194,"path":765,"stem":766,"type":14,"device":6},"\u002Flabware\u002Foverview\u002F","07.labware\u002F00.overview",{"title":768,"path":769,"stem":770,"type":200,"device":6},"Standard Labware","\u002Flabware\u002Fstandard-labware\u002F","07.labware\u002F10.standard-labware",{"title":772,"path":773,"stem":774,"type":200,"device":6},"Plates","\u002Flabware\u002Fplates\u002F","07.labware\u002F20.plates",{"title":776,"path":777,"stem":778,"type":200,"device":6},"Tips and Tip Racks","\u002Flabware\u002Ftips-and-racks\u002F","07.labware\u002F30.tips-and-racks",{"title":780,"path":781,"stem":782,"type":200,"device":6},"Tubes and Tube Racks","\u002Flabware\u002Ftubes-and-tube-racks\u002F","07.labware\u002F40.tubes-and-tube-racks",{"title":784,"path":785,"stem":786,"type":200,"device":6},"Troughs","\u002Flabware\u002Ftroughs\u002F","07.labware\u002F50.troughs",{"title":788,"path":789,"stem":790,"type":200,"device":6},"Carriers and Adapters","\u002Flabware\u002Fcarriers-and-adapters\u002F","07.labware\u002F60.carriers-and-adapters",{"title":792,"type":6,"device":6,"path":793,"stem":794,"children":795},"Connector Development (CDK)","\u002Fconnector-development\u002F","20.connector-development",[796,798,822,855,863,903],{"title":194,"path":793,"stem":797,"type":14,"device":6},"20.connector-development\u002Findex",{"title":799,"path":800,"stem":801,"children":802,"page":41},"Getting Started","\u002Fconnector-development\u002Fgetting-started\u002F","20.connector-development\u002F10.getting-started",[803,806,810,814,818],{"title":194,"path":804,"stem":805,"type":285,"device":6},"\u002Fconnector-development\u002Fgetting-started\u002Foverview\u002F","20.connector-development\u002F10.getting-started\u002F10.overview",{"title":807,"path":808,"stem":809,"type":24,"device":6},"What's new","\u002Fconnector-development\u002Fgetting-started\u002Fwhats-new\u002F","20.connector-development\u002F10.getting-started\u002F20.whats-new",{"title":811,"path":812,"stem":813,"type":24,"device":6},"Installation","\u002Fconnector-development\u002Fgetting-started\u002Finstallation\u002F","20.connector-development\u002F10.getting-started\u002F30.installation",{"title":815,"path":816,"stem":817,"type":24,"device":6},"Python Environment and Project Management","\u002Fconnector-development\u002Fgetting-started\u002Fpython-environments\u002F","20.connector-development\u002F10.getting-started\u002F35.python-environments",{"title":819,"path":820,"stem":821,"type":24,"device":6},"Contributing","\u002Fconnector-development\u002Fgetting-started\u002Fcontributing\u002F","20.connector-development\u002F10.getting-started\u002F40.contributing",{"title":823,"path":824,"stem":825,"children":826,"page":41},"Tutorial","\u002Fconnector-development\u002Ftutorial\u002F","20.connector-development\u002F20.tutorial",[827,831,835,839,843,847,851],{"title":828,"path":829,"stem":830,"type":46,"device":6},"Walkthrough","\u002Fconnector-development\u002Ftutorial\u002Fwalkthrough\u002F","20.connector-development\u002F20.tutorial\u002F00.walkthrough",{"title":832,"path":833,"stem":834,"type":46,"device":6},"SiLA Endpoints","\u002Fconnector-development\u002Ftutorial\u002Fsila-endpoints\u002F","20.connector-development\u002F20.tutorial\u002F10.sila-endpoints",{"title":836,"path":837,"stem":838,"type":46,"device":6},"Data Endpoints","\u002Fconnector-development\u002Ftutorial\u002Fdata-endpoints\u002F","20.connector-development\u002F20.tutorial\u002F20.data-endpoints",{"title":840,"path":841,"stem":842,"type":46,"device":6},"Controls","\u002Fconnector-development\u002Ftutorial\u002Fcontrols\u002F","20.connector-development\u002F20.tutorial\u002F30.controls",{"title":844,"path":845,"stem":846,"type":46,"device":6},"SiLA Data Types","\u002Fconnector-development\u002Ftutorial\u002Fdata-types\u002F","20.connector-development\u002F20.tutorial\u002F40.data-types",{"title":848,"path":849,"stem":850,"type":46,"device":6},"Feature","\u002Fconnector-development\u002Ftutorial\u002Fconnector-structure\u002F","20.connector-development\u002F20.tutorial\u002F70.connector-structure",{"title":852,"path":853,"stem":854,"type":46,"device":6},"Hardware Communication","\u002Fconnector-development\u002Ftutorial\u002Fhardware-communication\u002F","20.connector-development\u002F20.tutorial\u002F90.hardware-communication",{"title":272,"type":6,"device":6,"path":856,"stem":857,"children":858,"page":41},"\u002Fconnector-development\u002Fconcepts\u002F","20.connector-development\u002F30.concepts",[859],{"title":860,"path":861,"stem":862,"type":285,"device":6},"SiLA","\u002Fconnector-development\u002Fconcepts\u002Fsila\u002F","20.connector-development\u002F30.concepts\u002Fsila",{"title":864,"path":865,"stem":866,"children":867,"page":41},"Guides","\u002Fconnector-development\u002Fguides\u002F","20.connector-development\u002F40.guides",[868,872,876,880,884,888,892,895,899],{"title":869,"path":870,"stem":871,"type":24,"device":6},"Configuration","\u002Fconnector-development\u002Fguides\u002Fconfiguration\u002F","20.connector-development\u002F40.guides\u002F20.configuration",{"title":873,"path":874,"stem":875,"type":24,"device":6},"Logging","\u002Fconnector-development\u002Fguides\u002Flogging\u002F","20.connector-development\u002F40.guides\u002F21.logging",{"title":877,"path":878,"stem":879,"type":24,"device":6},"Deployment","\u002Fconnector-development\u002Fguides\u002Fdeployment\u002F","20.connector-development\u002F40.guides\u002F30.deployment",{"title":881,"path":882,"stem":883,"type":24,"device":6},"Security","\u002Fconnector-development\u002Fguides\u002Fsecurity\u002F","20.connector-development\u002F40.guides\u002F40.security",{"title":885,"path":886,"stem":887,"type":24,"device":6},"Subscriptions","\u002Fconnector-development\u002Fguides\u002Fsubscriptions\u002F","20.connector-development\u002F40.guides\u002F45.subscriptions",{"title":889,"path":890,"stem":891,"type":24,"device":6},"Execution Modes","\u002Fconnector-development\u002Fguides\u002Fexecution-modes\u002F","20.connector-development\u002F40.guides\u002F46.execution-modes",{"title":380,"path":893,"stem":894,"type":24,"device":6},"\u002Fconnector-development\u002Fguides\u002Ferror-handling\u002F","20.connector-development\u002F40.guides\u002F50.error-handling",{"title":896,"path":897,"stem":898,"type":24,"device":6},"Serial Troubleshooting","\u002Fconnector-development\u002Fguides\u002Fserial-troubleshooting\u002F","20.connector-development\u002F40.guides\u002F70.serial-troubleshooting",{"title":900,"path":901,"stem":902,"type":24,"device":6},"Testing","\u002Fconnector-development\u002Fguides\u002Ftesting\u002F","20.connector-development\u002F40.guides\u002F80.testing",{"title":904,"path":905,"stem":906,"children":907,"type":6,"device":6},"References","\u002Fconnector-development\u002Freference\u002F","20.connector-development\u002F50.reference\u002Findex",[908],{"title":904,"path":905,"stem":906,"type":200,"device":6},{"id":910,"title":434,"body":911,"description":3832,"device":6,"extension":3833,"links":6,"meta":3834,"navigation":1073,"path":3835,"seo":3836,"stem":436,"type":285,"__hash__":3837},"docs\u002F04.concepts\u002F08.observe\u002F20.secrets.md",{"type":912,"value":913,"toc":3815},"minimark",[914,922,926,929,932,935,951,954,957,962,970,1172,1183,1195,1197,1201,1207,1329,1331,1335,1352,1450,1452,1456,1463,1547,1549,1553,1567,1849,1860,1890,1892,1896,1903,2053,2060,2129,2131,2134,2137,2256,2258,2262,2265,2428,2435,2437,2440,2443,2538,2544,2546,2550,2555,2558,2936,2940,2943,3240,3244,3247,3779,3781,3785,3811],[915,916,917],"p",{},[918,919],"img",{"alt":920,"src":921},"UniteLabs Secrets Management","\u002Fimages\u002Fplatform\u002Fplatform_secrets.webp",[923,924,194],"h1",{"id":925},"overview",[915,927,928],{},"Secrets in UniteLabs provide a secure way to store sensitive credentials—such as API keys, tokens, and passwords—that are essential for accessing external systems and instruments in your workflows.",[915,930,931],{},"Instead of hardcoding credentials or sharing them manually, you can define and manage secrets in a centralized, encrypted environment. This helps ensure security, scalability, and repeatability when running lab automation.",[915,933,934],{},"With UniteLabs Secrets, you can:",[936,937,938,942,945,948],"ul",{},[939,940,941],"li",{},"Store environment-specific credentials for APIs, devices, and services",[939,943,944],{},"Reuse secrets across multiple workflows without exposing sensitive values",[939,946,947],{},"Rotate or revoke credentials without changing workflow logic",[939,949,950],{},"Categorize secrets by type (e.g. string, JSON, connection) for structured access",[915,952,953],{},"Secrets integrate seamlessly into the workflow engine, letting scientists and engineers focus on automation logic while maintaining compliance and security across labs.",[955,956],"hr",{},[958,959,961],"h2",{"id":960},"authentication","Authentication",[915,963,964,965,969],{},"All API calls require a bearer token obtained from the UniteLabs identity provider. Replace ",[966,967,968],"code",{},"\u003Ctenant-id>"," with your organization's tenant ID:",[971,972,973,1052],"code-group",{},[974,975,981],"pre",{"className":976,"code":977,"filename":978,"language":979,"meta":980,"style":980},"language-bash shiki shiki-themes github-light-high-contrast github-light-high-contrast github-dark-default","curl -X POST \\\n  \"https:\u002F\u002Fauth.unitelabs.io\u002Frealms\u002F\u003Ctenant-id>\u002Fprotocol\u002Fopenid-connect\u002Ftoken\" \\\n  -H \"Content-Type: application\u002Fx-www-form-urlencoded\" \\\n  -d \"grant_type=client_credentials\" \\\n  -d \"client_id=\u003Cyour-client-id>\" \\\n  -d \"client_secret=\u003Cyour-client-secret>\"\n","cURL","bash","",[966,982,983,1004,1012,1023,1034,1044],{"__ignoreMap":980},[984,985,988,992,996,1000],"span",{"class":986,"line":987},"line",1,[984,989,991],{"class":990},"sNqAu","curl",[984,993,995],{"class":994},"sOiAX"," -X",[984,997,999],{"class":998},"sCx38"," POST",[984,1001,1003],{"class":1002},"sxkbv"," \\\n",[984,1005,1007,1010],{"class":986,"line":1006},2,[984,1008,1009],{"class":998},"  \"https:\u002F\u002Fauth.unitelabs.io\u002Frealms\u002F\u003Ctenant-id>\u002Fprotocol\u002Fopenid-connect\u002Ftoken\"",[984,1011,1003],{"class":1002},[984,1013,1015,1018,1021],{"class":986,"line":1014},3,[984,1016,1017],{"class":994},"  -H",[984,1019,1020],{"class":998}," \"Content-Type: application\u002Fx-www-form-urlencoded\"",[984,1022,1003],{"class":1002},[984,1024,1026,1029,1032],{"class":986,"line":1025},4,[984,1027,1028],{"class":994},"  -d",[984,1030,1031],{"class":998}," \"grant_type=client_credentials\"",[984,1033,1003],{"class":1002},[984,1035,1037,1039,1042],{"class":986,"line":1036},5,[984,1038,1028],{"class":994},[984,1040,1041],{"class":998}," \"client_id=\u003Cyour-client-id>\"",[984,1043,1003],{"class":1002},[984,1045,1047,1049],{"class":986,"line":1046},6,[984,1048,1028],{"class":994},[984,1050,1051],{"class":998}," \"client_secret=\u003Cyour-client-secret>\"\n",[974,1053,1058],{"className":1054,"code":1055,"filename":1056,"language":1057,"meta":980,"style":980},"language-python shiki shiki-themes github-light-high-contrast github-light-high-contrast github-dark-default","import httpx\n\nresponse = httpx.post(\n    \"https:\u002F\u002Fauth.unitelabs.io\u002Frealms\u002F\u003Ctenant-id>\u002Fprotocol\u002Fopenid-connect\u002Ftoken\",\n    data={\n        \"grant_type\": \"client_credentials\",\n        \"client_id\": \"\u003Cyour-client-id>\",\n        \"client_secret\": \"\u003Cyour-client-secret>\",\n    },\n)\ntoken = response.json()[\"access_token\"]\n","Python","python",[966,1059,1060,1069,1075,1086,1094,1104,1117,1130,1143,1149,1155],{"__ignoreMap":980},[984,1061,1062,1065],{"class":986,"line":987},[984,1063,1064],{"class":1002},"import",[984,1066,1068],{"class":1067},"sc-9e"," httpx\n",[984,1070,1071],{"class":986,"line":1006},[984,1072,1074],{"emptyLinePlaceholder":1073},true,"\n",[984,1076,1077,1080,1083],{"class":986,"line":1014},[984,1078,1079],{"class":1067},"response ",[984,1081,1082],{"class":1002},"=",[984,1084,1085],{"class":1067}," httpx.post(\n",[984,1087,1088,1091],{"class":986,"line":1025},[984,1089,1090],{"class":998},"    \"https:\u002F\u002Fauth.unitelabs.io\u002Frealms\u002F\u003Ctenant-id>\u002Fprotocol\u002Fopenid-connect\u002Ftoken\"",[984,1092,1093],{"class":1067},",\n",[984,1095,1096,1099,1101],{"class":986,"line":1036},[984,1097,1098],{"class":990},"    data",[984,1100,1082],{"class":1002},[984,1102,1103],{"class":1067},"{\n",[984,1105,1106,1109,1112,1115],{"class":986,"line":1046},[984,1107,1108],{"class":998},"        \"grant_type\"",[984,1110,1111],{"class":1067},": ",[984,1113,1114],{"class":998},"\"client_credentials\"",[984,1116,1093],{"class":1067},[984,1118,1120,1123,1125,1128],{"class":986,"line":1119},7,[984,1121,1122],{"class":998},"        \"client_id\"",[984,1124,1111],{"class":1067},[984,1126,1127],{"class":998},"\"\u003Cyour-client-id>\"",[984,1129,1093],{"class":1067},[984,1131,1133,1136,1138,1141],{"class":986,"line":1132},8,[984,1134,1135],{"class":998},"        \"client_secret\"",[984,1137,1111],{"class":1067},[984,1139,1140],{"class":998},"\"\u003Cyour-client-secret>\"",[984,1142,1093],{"class":1067},[984,1144,1146],{"class":986,"line":1145},9,[984,1147,1148],{"class":1067},"    },\n",[984,1150,1152],{"class":986,"line":1151},10,[984,1153,1154],{"class":1067},")\n",[984,1156,1158,1161,1163,1166,1169],{"class":986,"line":1157},11,[984,1159,1160],{"class":1067},"token ",[984,1162,1082],{"class":1002},[984,1164,1165],{"class":1067}," response.json()[",[984,1167,1168],{"class":998},"\"access_token\"",[984,1170,1171],{"class":1067},"]\n",[915,1173,1174,1175,1178,1179,1182],{},"Use the returned ",[966,1176,1177],{},"access_token"," as ",[966,1180,1181],{},"Authorization: Bearer \u003Ctoken>"," on every subsequent request.",[1184,1185,1188],"callout",{"color":1186,"icon":1187},"info","i-heroicons-information-circle",[915,1189,1190,1191,1194],{},"Inside workflows, use the UniteLabs SDK (",[966,1192,1193],{},"unitelabs-sdk",") — it handles token acquisition and refresh automatically. See the examples below.",[955,1196],{},[958,1198,1200],{"id":1199},"endpoints","Endpoints",[915,1202,1203,1204],{},"Base URL: ",[966,1205,1206],{},"http:\u002F\u002Funitelabs-api.\u003Ctenant-id>.svc",[1208,1209,1210,1226],"table",{},[1211,1212,1213],"thead",{},[1214,1215,1216,1220,1223],"tr",{},[1217,1218,1219],"th",{},"Method",[1217,1221,1222],{},"Path",[1217,1224,1225],{},"Description",[1227,1228,1229,1245,1259,1273,1287,1301,1315],"tbody",{},[1214,1230,1231,1237,1242],{},[1232,1233,1234],"td",{},[966,1235,1236],{},"GET",[1232,1238,1239],{},[966,1240,1241],{},"\u002Fv1\u002Fsecrets\u002Ftypes",[1232,1243,1244],{},"List available secret types",[1214,1246,1247,1251,1256],{},[1232,1248,1249],{},[966,1250,1236],{},[1232,1252,1253],{},[966,1254,1255],{},"\u002Fv1\u002Fsecrets\u002Fschemas\u002F{slug}",[1232,1257,1258],{},"Get the JSON schema for a secret type",[1214,1260,1261,1265,1270],{},[1232,1262,1263],{},[966,1264,1236],{},[1232,1266,1267],{},[966,1268,1269],{},"\u002Fv1\u002Fsecrets",[1232,1271,1272],{},"List secrets (filter by name)",[1214,1274,1275,1279,1284],{},[1232,1276,1277],{},[966,1278,1236],{},[1232,1280,1281],{},[966,1282,1283],{},"\u002Fv1\u002Fsecrets\u002F{id}",[1232,1285,1286],{},"Get a secret by ID",[1214,1288,1289,1294,1298],{},[1232,1290,1291],{},[966,1292,1293],{},"POST",[1232,1295,1296],{},[966,1297,1269],{},[1232,1299,1300],{},"Create a new secret",[1214,1302,1303,1308,1312],{},[1232,1304,1305],{},[966,1306,1307],{},"PATCH",[1232,1309,1310],{},[966,1311,1283],{},[1232,1313,1314],{},"Update an existing secret",[1214,1316,1317,1322,1326],{},[1232,1318,1319],{},[966,1320,1321],{},"DELETE",[1232,1323,1324],{},[966,1325,1283],{},[1232,1327,1328],{},"Delete a secret",[955,1330],{},[958,1332,1334],{"id":1333},"list-secret-types","List secret types",[915,1336,1337,1338,1341,1342,1341,1345,1341,1348,1351],{},"Returns the available secret types (e.g. ",[966,1339,1340],{},"string",", ",[966,1343,1344],{},"json",[966,1346,1347],{},"aws-s3",[966,1349,1350],{},"postgres",").",[971,1353,1354,1384],{},[974,1355,1357],{"className":976,"code":1356,"filename":978,"language":979,"meta":980,"style":980},"curl -X GET \\\n  \"http:\u002F\u002Funitelabs-api.\u003Ctenant-id>.svc\u002Fv1\u002Fsecrets\u002Ftypes\" \\\n  -H \"Authorization: Bearer \u003Ctoken>\"\n",[966,1358,1359,1370,1377],{"__ignoreMap":980},[984,1360,1361,1363,1365,1368],{"class":986,"line":987},[984,1362,991],{"class":990},[984,1364,995],{"class":994},[984,1366,1367],{"class":998}," GET",[984,1369,1003],{"class":1002},[984,1371,1372,1375],{"class":986,"line":1006},[984,1373,1374],{"class":998},"  \"http:\u002F\u002Funitelabs-api.\u003Ctenant-id>.svc\u002Fv1\u002Fsecrets\u002Ftypes\"",[984,1376,1003],{"class":1002},[984,1378,1379,1381],{"class":986,"line":1014},[984,1380,1017],{"class":994},[984,1382,1383],{"class":998}," \"Authorization: Bearer \u003Ctoken>\"\n",[974,1385,1388],{"className":1054,"code":1386,"filename":1387,"language":1057,"meta":980,"style":980},"from unitelabs.sdk import AsyncApiClient\n\nasync with AsyncApiClient() as client:\n    types = await client.get(\"\u002Fsecrets\u002Ftypes\")\n    print(types)\n","Python (SDK)",[966,1389,1390,1403,1407,1424,1442],{"__ignoreMap":980},[984,1391,1392,1395,1398,1400],{"class":986,"line":987},[984,1393,1394],{"class":1002},"from",[984,1396,1397],{"class":1067}," unitelabs.sdk ",[984,1399,1064],{"class":1002},[984,1401,1402],{"class":1067}," AsyncApiClient\n",[984,1404,1405],{"class":986,"line":1006},[984,1406,1074],{"emptyLinePlaceholder":1073},[984,1408,1409,1412,1415,1418,1421],{"class":986,"line":1014},[984,1410,1411],{"class":1002},"async",[984,1413,1414],{"class":1002}," with",[984,1416,1417],{"class":1067}," AsyncApiClient() ",[984,1419,1420],{"class":1002},"as",[984,1422,1423],{"class":1067}," client:\n",[984,1425,1426,1429,1431,1434,1437,1440],{"class":986,"line":1025},[984,1427,1428],{"class":1067},"    types ",[984,1430,1082],{"class":1002},[984,1432,1433],{"class":1002}," await",[984,1435,1436],{"class":1067}," client.get(",[984,1438,1439],{"class":998},"\"\u002Fsecrets\u002Ftypes\"",[984,1441,1154],{"class":1067},[984,1443,1444,1447],{"class":986,"line":1036},[984,1445,1446],{"class":994},"    print",[984,1448,1449],{"class":1067},"(types)\n",[955,1451],{},[958,1453,1455],{"id":1454},"get-schema-for-a-secret-type","Get schema for a secret type",[915,1457,1458,1459,1462],{},"Returns the JSON schema describing the required fields for a given secret type ",[966,1460,1461],{},"slug",".",[971,1464,1465,1493],{},[974,1466,1468],{"className":976,"code":1467,"filename":978,"language":979,"meta":980,"style":980},"curl -X GET \\\n  \"http:\u002F\u002Funitelabs-api.\u003Ctenant-id>.svc\u002Fv1\u002Fsecrets\u002Fschemas\u002Faws-s3\" \\\n  -H \"Authorization: Bearer \u003Ctoken>\"\n",[966,1469,1470,1480,1487],{"__ignoreMap":980},[984,1471,1472,1474,1476,1478],{"class":986,"line":987},[984,1473,991],{"class":990},[984,1475,995],{"class":994},[984,1477,1367],{"class":998},[984,1479,1003],{"class":1002},[984,1481,1482,1485],{"class":986,"line":1006},[984,1483,1484],{"class":998},"  \"http:\u002F\u002Funitelabs-api.\u003Ctenant-id>.svc\u002Fv1\u002Fsecrets\u002Fschemas\u002Faws-s3\"",[984,1486,1003],{"class":1002},[984,1488,1489,1491],{"class":986,"line":1014},[984,1490,1017],{"class":994},[984,1492,1383],{"class":998},[974,1494,1496],{"className":1054,"code":1495,"filename":1387,"language":1057,"meta":980,"style":980},"from unitelabs.sdk import AsyncApiClient\n\nasync with AsyncApiClient() as client:\n    schema = await client.get(\"\u002Fsecrets\u002Fschemas\u002Faws-s3\")\n    print(schema)\n",[966,1497,1498,1508,1512,1524,1540],{"__ignoreMap":980},[984,1499,1500,1502,1504,1506],{"class":986,"line":987},[984,1501,1394],{"class":1002},[984,1503,1397],{"class":1067},[984,1505,1064],{"class":1002},[984,1507,1402],{"class":1067},[984,1509,1510],{"class":986,"line":1006},[984,1511,1074],{"emptyLinePlaceholder":1073},[984,1513,1514,1516,1518,1520,1522],{"class":986,"line":1014},[984,1515,1411],{"class":1002},[984,1517,1414],{"class":1002},[984,1519,1417],{"class":1067},[984,1521,1420],{"class":1002},[984,1523,1423],{"class":1067},[984,1525,1526,1529,1531,1533,1535,1538],{"class":986,"line":1025},[984,1527,1528],{"class":1067},"    schema ",[984,1530,1082],{"class":1002},[984,1532,1433],{"class":1002},[984,1534,1436],{"class":1067},[984,1536,1537],{"class":998},"\"\u002Fsecrets\u002Fschemas\u002Faws-s3\"",[984,1539,1154],{"class":1067},[984,1541,1542,1544],{"class":986,"line":1036},[984,1543,1446],{"class":994},[984,1545,1546],{"class":1067},"(schema)\n",[955,1548],{},[958,1550,1552],{"id":1551},"create-a-secret","Create a secret",[915,1554,1555,1556,1559,1560,1562,1563,1566],{},"Creates a new secret. The ",[966,1557,1558],{},"type"," field must be a valid slug from ",[966,1561,1241],{},". The ",[966,1564,1565],{},"parameters"," object must match the schema for that type.",[971,1568,1569,1676],{},[974,1570,1572],{"className":976,"code":1571,"filename":978,"language":979,"meta":980,"style":980},"curl -X POST \\\n  \"http:\u002F\u002Funitelabs-api.\u003Ctenant-id>.svc\u002Fv1\u002Fsecrets\" \\\n  -H \"Authorization: Bearer \u003Ctoken>\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"name\": \"datalake-admin\",\n    \"type\": \"aws-s3\",\n    \"parameters\": {\n      \"minio_root_user\": \"my-access-key\",\n      \"minio_root_password\": \"my-secret-key\",\n      \"aws_client_parameters\": {\n        \"endpoint_url\": \"http:\u002F\u002Fminio.svc:9000\",\n        \"bucket_name\": \"lab-data\"\n      }\n    }\n  }'\n",[966,1573,1574,1584,1591,1600,1609,1616,1621,1626,1631,1636,1641,1646,1652,1658,1664,1670],{"__ignoreMap":980},[984,1575,1576,1578,1580,1582],{"class":986,"line":987},[984,1577,991],{"class":990},[984,1579,995],{"class":994},[984,1581,999],{"class":998},[984,1583,1003],{"class":1002},[984,1585,1586,1589],{"class":986,"line":1006},[984,1587,1588],{"class":998},"  \"http:\u002F\u002Funitelabs-api.\u003Ctenant-id>.svc\u002Fv1\u002Fsecrets\"",[984,1590,1003],{"class":1002},[984,1592,1593,1595,1598],{"class":986,"line":1014},[984,1594,1017],{"class":994},[984,1596,1597],{"class":998}," \"Authorization: Bearer \u003Ctoken>\"",[984,1599,1003],{"class":1002},[984,1601,1602,1604,1607],{"class":986,"line":1025},[984,1603,1017],{"class":994},[984,1605,1606],{"class":998}," \"Content-Type: application\u002Fjson\"",[984,1608,1003],{"class":1002},[984,1610,1611,1613],{"class":986,"line":1036},[984,1612,1028],{"class":994},[984,1614,1615],{"class":998}," '{\n",[984,1617,1618],{"class":986,"line":1046},[984,1619,1620],{"class":998},"    \"name\": \"datalake-admin\",\n",[984,1622,1623],{"class":986,"line":1119},[984,1624,1625],{"class":998},"    \"type\": \"aws-s3\",\n",[984,1627,1628],{"class":986,"line":1132},[984,1629,1630],{"class":998},"    \"parameters\": {\n",[984,1632,1633],{"class":986,"line":1145},[984,1634,1635],{"class":998},"      \"minio_root_user\": \"my-access-key\",\n",[984,1637,1638],{"class":986,"line":1151},[984,1639,1640],{"class":998},"      \"minio_root_password\": \"my-secret-key\",\n",[984,1642,1643],{"class":986,"line":1157},[984,1644,1645],{"class":998},"      \"aws_client_parameters\": {\n",[984,1647,1649],{"class":986,"line":1648},12,[984,1650,1651],{"class":998},"        \"endpoint_url\": \"http:\u002F\u002Fminio.svc:9000\",\n",[984,1653,1655],{"class":986,"line":1654},13,[984,1656,1657],{"class":998},"        \"bucket_name\": \"lab-data\"\n",[984,1659,1661],{"class":986,"line":1660},14,[984,1662,1663],{"class":998},"      }\n",[984,1665,1667],{"class":986,"line":1666},15,[984,1668,1669],{"class":998},"    }\n",[984,1671,1673],{"class":986,"line":1672},16,[984,1674,1675],{"class":998},"  }'\n",[974,1677,1679],{"className":1054,"code":1678,"filename":1387,"language":1057,"meta":980,"style":980},"from unitelabs.sdk import AsyncApiClient\n\nasync with AsyncApiClient() as client:\n    secret = await client.post(\"\u002Fsecrets\", json={\n        \"name\": \"datalake-admin\",\n        \"type\": \"aws-s3\",\n        \"parameters\": {\n            \"minio_root_user\": \"my-access-key\",\n            \"minio_root_password\": \"my-secret-key\",\n            \"aws_client_parameters\": {\n                \"endpoint_url\": \"http:\u002F\u002Fminio.svc:9000\",\n                \"bucket_name\": \"lab-data\",\n            },\n        },\n    })\n    print(secret[\"id\"])  # store this ID for updates\u002Fdeletes\n",[966,1680,1681,1691,1695,1707,1730,1742,1754,1762,1774,1786,1793,1805,1817,1822,1827,1832],{"__ignoreMap":980},[984,1682,1683,1685,1687,1689],{"class":986,"line":987},[984,1684,1394],{"class":1002},[984,1686,1397],{"class":1067},[984,1688,1064],{"class":1002},[984,1690,1402],{"class":1067},[984,1692,1693],{"class":986,"line":1006},[984,1694,1074],{"emptyLinePlaceholder":1073},[984,1696,1697,1699,1701,1703,1705],{"class":986,"line":1014},[984,1698,1411],{"class":1002},[984,1700,1414],{"class":1002},[984,1702,1417],{"class":1067},[984,1704,1420],{"class":1002},[984,1706,1423],{"class":1067},[984,1708,1709,1712,1714,1716,1719,1722,1724,1726,1728],{"class":986,"line":1025},[984,1710,1711],{"class":1067},"    secret ",[984,1713,1082],{"class":1002},[984,1715,1433],{"class":1002},[984,1717,1718],{"class":1067}," client.post(",[984,1720,1721],{"class":998},"\"\u002Fsecrets\"",[984,1723,1341],{"class":1067},[984,1725,1344],{"class":990},[984,1727,1082],{"class":1002},[984,1729,1103],{"class":1067},[984,1731,1732,1735,1737,1740],{"class":986,"line":1036},[984,1733,1734],{"class":998},"        \"name\"",[984,1736,1111],{"class":1067},[984,1738,1739],{"class":998},"\"datalake-admin\"",[984,1741,1093],{"class":1067},[984,1743,1744,1747,1749,1752],{"class":986,"line":1046},[984,1745,1746],{"class":998},"        \"type\"",[984,1748,1111],{"class":1067},[984,1750,1751],{"class":998},"\"aws-s3\"",[984,1753,1093],{"class":1067},[984,1755,1756,1759],{"class":986,"line":1119},[984,1757,1758],{"class":998},"        \"parameters\"",[984,1760,1761],{"class":1067},": {\n",[984,1763,1764,1767,1769,1772],{"class":986,"line":1132},[984,1765,1766],{"class":998},"            \"minio_root_user\"",[984,1768,1111],{"class":1067},[984,1770,1771],{"class":998},"\"my-access-key\"",[984,1773,1093],{"class":1067},[984,1775,1776,1779,1781,1784],{"class":986,"line":1145},[984,1777,1778],{"class":998},"            \"minio_root_password\"",[984,1780,1111],{"class":1067},[984,1782,1783],{"class":998},"\"my-secret-key\"",[984,1785,1093],{"class":1067},[984,1787,1788,1791],{"class":986,"line":1151},[984,1789,1790],{"class":998},"            \"aws_client_parameters\"",[984,1792,1761],{"class":1067},[984,1794,1795,1798,1800,1803],{"class":986,"line":1157},[984,1796,1797],{"class":998},"                \"endpoint_url\"",[984,1799,1111],{"class":1067},[984,1801,1802],{"class":998},"\"http:\u002F\u002Fminio.svc:9000\"",[984,1804,1093],{"class":1067},[984,1806,1807,1810,1812,1815],{"class":986,"line":1648},[984,1808,1809],{"class":998},"                \"bucket_name\"",[984,1811,1111],{"class":1067},[984,1813,1814],{"class":998},"\"lab-data\"",[984,1816,1093],{"class":1067},[984,1818,1819],{"class":986,"line":1654},[984,1820,1821],{"class":1067},"            },\n",[984,1823,1824],{"class":986,"line":1660},[984,1825,1826],{"class":1067},"        },\n",[984,1828,1829],{"class":986,"line":1666},[984,1830,1831],{"class":1067},"    })\n",[984,1833,1834,1836,1839,1842,1845],{"class":986,"line":1672},[984,1835,1446],{"class":994},[984,1837,1838],{"class":1067},"(secret[",[984,1840,1841],{"class":998},"\"id\"",[984,1843,1844],{"class":1067},"])  ",[984,1846,1848],{"class":1847},"sIsDC","# store this ID for updates\u002Fdeletes\n",[915,1850,1851,1855,1856,1859],{},[1852,1853,1854],"strong",{},"Response"," ",[966,1857,1858],{},"201 Created",":",[974,1861,1864],{"className":1862,"code":1863,"language":1344,"meta":980,"style":980},"language-json shiki shiki-themes github-light-high-contrast github-light-high-contrast github-dark-default","{\n  \"id\": \"a3bb189e-8bf9-3888-9912-ace4e6543002\",\n  \"name\": \"datalake-admin\",\n  \"type\": \"aws-s3\"\n}\n",[966,1865,1866,1870,1875,1880,1885],{"__ignoreMap":980},[984,1867,1868],{"class":986,"line":987},[984,1869,1103],{},[984,1871,1872],{"class":986,"line":1006},[984,1873,1874],{},"  \"id\": \"a3bb189e-8bf9-3888-9912-ace4e6543002\",\n",[984,1876,1877],{"class":986,"line":1014},[984,1878,1879],{},"  \"name\": \"datalake-admin\",\n",[984,1881,1882],{"class":986,"line":1025},[984,1883,1884],{},"  \"type\": \"aws-s3\"\n",[984,1886,1887],{"class":986,"line":1036},[984,1888,1889],{},"}\n",[955,1891],{},[958,1893,1895],{"id":1894},"list-secrets","List secrets",[915,1897,1898,1899,1902],{},"Returns all secrets matching the ",[966,1900,1901],{},"name"," query parameter. Pass a partial name to search, or an exact name to fetch a specific secret.",[971,1904,1905,1938],{},[974,1906,1908],{"className":976,"code":1907,"filename":978,"language":979,"meta":980,"style":980},"# List all secrets with a name starting with \"datalake\"\ncurl -X GET \\\n  \"http:\u002F\u002Funitelabs-api.\u003Ctenant-id>.svc\u002Fv1\u002Fsecrets?name=datalake\" \\\n  -H \"Authorization: Bearer \u003Ctoken>\"\n",[966,1909,1910,1915,1925,1932],{"__ignoreMap":980},[984,1911,1912],{"class":986,"line":987},[984,1913,1914],{"class":1847},"# List all secrets with a name starting with \"datalake\"\n",[984,1916,1917,1919,1921,1923],{"class":986,"line":1006},[984,1918,991],{"class":990},[984,1920,995],{"class":994},[984,1922,1367],{"class":998},[984,1924,1003],{"class":1002},[984,1926,1927,1930],{"class":986,"line":1014},[984,1928,1929],{"class":998},"  \"http:\u002F\u002Funitelabs-api.\u003Ctenant-id>.svc\u002Fv1\u002Fsecrets?name=datalake\"",[984,1931,1003],{"class":1002},[984,1933,1934,1936],{"class":986,"line":1025},[984,1935,1017],{"class":994},[984,1937,1383],{"class":998},[974,1939,1941],{"className":1054,"code":1940,"filename":1387,"language":1057,"meta":980,"style":980},"from unitelabs.sdk import AsyncApiClient\n\nasync with AsyncApiClient() as client:\n    secrets = await client.get(\"\u002Fsecrets\")\n\n# Find a specific secret by name\ndatalake = next(s for s in secrets if s[\"name\"] == \"datalake-admin\")\nparams = datalake[\"parameters\"]\n",[966,1942,1943,1953,1957,1969,1984,1988,1993,2038],{"__ignoreMap":980},[984,1944,1945,1947,1949,1951],{"class":986,"line":987},[984,1946,1394],{"class":1002},[984,1948,1397],{"class":1067},[984,1950,1064],{"class":1002},[984,1952,1402],{"class":1067},[984,1954,1955],{"class":986,"line":1006},[984,1956,1074],{"emptyLinePlaceholder":1073},[984,1958,1959,1961,1963,1965,1967],{"class":986,"line":1014},[984,1960,1411],{"class":1002},[984,1962,1414],{"class":1002},[984,1964,1417],{"class":1067},[984,1966,1420],{"class":1002},[984,1968,1423],{"class":1067},[984,1970,1971,1974,1976,1978,1980,1982],{"class":986,"line":1025},[984,1972,1973],{"class":1067},"    secrets ",[984,1975,1082],{"class":1002},[984,1977,1433],{"class":1002},[984,1979,1436],{"class":1067},[984,1981,1721],{"class":998},[984,1983,1154],{"class":1067},[984,1985,1986],{"class":986,"line":1036},[984,1987,1074],{"emptyLinePlaceholder":1073},[984,1989,1990],{"class":986,"line":1046},[984,1991,1992],{"class":1847},"# Find a specific secret by name\n",[984,1994,1995,1998,2000,2003,2006,2009,2012,2015,2018,2021,2024,2027,2030,2033,2036],{"class":986,"line":1119},[984,1996,1997],{"class":1067},"datalake ",[984,1999,1082],{"class":1002},[984,2001,2002],{"class":994}," next",[984,2004,2005],{"class":1067},"(s ",[984,2007,2008],{"class":1002},"for",[984,2010,2011],{"class":1067}," s ",[984,2013,2014],{"class":1002},"in",[984,2016,2017],{"class":1067}," secrets ",[984,2019,2020],{"class":1002},"if",[984,2022,2023],{"class":1067}," s[",[984,2025,2026],{"class":998},"\"name\"",[984,2028,2029],{"class":1067},"] ",[984,2031,2032],{"class":1002},"==",[984,2034,2035],{"class":998}," \"datalake-admin\"",[984,2037,1154],{"class":1067},[984,2039,2040,2043,2045,2048,2051],{"class":986,"line":1132},[984,2041,2042],{"class":1067},"params ",[984,2044,1082],{"class":1002},[984,2046,2047],{"class":1067}," datalake[",[984,2049,2050],{"class":998},"\"parameters\"",[984,2052,1171],{"class":1067},[915,2054,2055,1855,2057,1859],{},[1852,2056,1854],{},[966,2058,2059],{},"200 OK",[974,2061,2063],{"className":1862,"code":2062,"language":1344,"meta":980,"style":980},"[\n  {\n    \"id\": \"a3bb189e-8bf9-3888-9912-ace4e6543002\",\n    \"name\": \"datalake-admin\",\n    \"type\": \"aws-s3\",\n    \"parameters\": {\n      \"minio_root_user\": \"my-access-key\",\n      \"minio_root_password\": \"my-secret-key\",\n      \"aws_client_parameters\": {\n        \"endpoint_url\": \"http:\u002F\u002Fminio.svc:9000\",\n        \"bucket_name\": \"lab-data\"\n      }\n    }\n  }\n]\n",[966,2064,2065,2070,2075,2080,2084,2088,2092,2096,2100,2104,2108,2112,2116,2120,2125],{"__ignoreMap":980},[984,2066,2067],{"class":986,"line":987},[984,2068,2069],{},"[\n",[984,2071,2072],{"class":986,"line":1006},[984,2073,2074],{},"  {\n",[984,2076,2077],{"class":986,"line":1014},[984,2078,2079],{},"    \"id\": \"a3bb189e-8bf9-3888-9912-ace4e6543002\",\n",[984,2081,2082],{"class":986,"line":1025},[984,2083,1620],{},[984,2085,2086],{"class":986,"line":1036},[984,2087,1625],{},[984,2089,2090],{"class":986,"line":1046},[984,2091,1630],{},[984,2093,2094],{"class":986,"line":1119},[984,2095,1635],{},[984,2097,2098],{"class":986,"line":1132},[984,2099,1640],{},[984,2101,2102],{"class":986,"line":1145},[984,2103,1645],{},[984,2105,2106],{"class":986,"line":1151},[984,2107,1651],{},[984,2109,2110],{"class":986,"line":1157},[984,2111,1657],{},[984,2113,2114],{"class":986,"line":1648},[984,2115,1663],{},[984,2117,2118],{"class":986,"line":1654},[984,2119,1669],{},[984,2121,2122],{"class":986,"line":1660},[984,2123,2124],{},"  }\n",[984,2126,2127],{"class":986,"line":1666},[984,2128,1171],{},[955,2130],{},[958,2132,1286],{"id":2133},"get-a-secret-by-id",[915,2135,2136],{},"Fetch a single secret by its UUID.",[971,2138,2139,2167],{},[974,2140,2142],{"className":976,"code":2141,"filename":978,"language":979,"meta":980,"style":980},"curl -X GET \\\n  \"http:\u002F\u002Funitelabs-api.\u003Ctenant-id>.svc\u002Fv1\u002Fsecrets\u002Fa3bb189e-8bf9-3888-9912-ace4e6543002\" \\\n  -H \"Authorization: Bearer \u003Ctoken>\"\n",[966,2143,2144,2154,2161],{"__ignoreMap":980},[984,2145,2146,2148,2150,2152],{"class":986,"line":987},[984,2147,991],{"class":990},[984,2149,995],{"class":994},[984,2151,1367],{"class":998},[984,2153,1003],{"class":1002},[984,2155,2156,2159],{"class":986,"line":1006},[984,2157,2158],{"class":998},"  \"http:\u002F\u002Funitelabs-api.\u003Ctenant-id>.svc\u002Fv1\u002Fsecrets\u002Fa3bb189e-8bf9-3888-9912-ace4e6543002\"",[984,2160,1003],{"class":1002},[984,2162,2163,2165],{"class":986,"line":1014},[984,2164,1017],{"class":994},[984,2166,1383],{"class":998},[974,2168,2170],{"className":1054,"code":2169,"filename":1387,"language":1057,"meta":980,"style":980},"from unitelabs.sdk import AsyncApiClient\n\nSECRET_ID = \"a3bb189e-8bf9-3888-9912-ace4e6543002\"\n\nasync with AsyncApiClient() as client:\n    secret = await client.get(f\"\u002Fsecrets\u002F{SECRET_ID}\")\n    params = secret[\"parameters\"]\n",[966,2171,2172,2182,2186,2197,2201,2213,2242],{"__ignoreMap":980},[984,2173,2174,2176,2178,2180],{"class":986,"line":987},[984,2175,1394],{"class":1002},[984,2177,1397],{"class":1067},[984,2179,1064],{"class":1002},[984,2181,1402],{"class":1067},[984,2183,2184],{"class":986,"line":1006},[984,2185,1074],{"emptyLinePlaceholder":1073},[984,2187,2188,2191,2194],{"class":986,"line":1014},[984,2189,2190],{"class":994},"SECRET_ID",[984,2192,2193],{"class":1002}," =",[984,2195,2196],{"class":998}," \"a3bb189e-8bf9-3888-9912-ace4e6543002\"\n",[984,2198,2199],{"class":986,"line":1025},[984,2200,1074],{"emptyLinePlaceholder":1073},[984,2202,2203,2205,2207,2209,2211],{"class":986,"line":1036},[984,2204,1411],{"class":1002},[984,2206,1414],{"class":1002},[984,2208,1417],{"class":1067},[984,2210,1420],{"class":1002},[984,2212,1423],{"class":1067},[984,2214,2215,2217,2219,2221,2223,2226,2229,2232,2234,2237,2240],{"class":986,"line":1046},[984,2216,1711],{"class":1067},[984,2218,1082],{"class":1002},[984,2220,1433],{"class":1002},[984,2222,1436],{"class":1067},[984,2224,2225],{"class":1002},"f",[984,2227,2228],{"class":998},"\"\u002Fsecrets\u002F",[984,2230,2231],{"class":1002},"{",[984,2233,2190],{"class":994},[984,2235,2236],{"class":1002},"}",[984,2238,2239],{"class":998},"\"",[984,2241,1154],{"class":1067},[984,2243,2244,2247,2249,2252,2254],{"class":986,"line":1119},[984,2245,2246],{"class":1067},"    params ",[984,2248,1082],{"class":1002},[984,2250,2251],{"class":1067}," secret[",[984,2253,2050],{"class":998},[984,2255,1171],{"class":1067},[955,2257],{},[958,2259,2261],{"id":2260},"update-a-secret","Update a secret",[915,2263,2264],{},"Partial update — only include fields you want to change. Useful for rotating credentials without recreating the secret or updating any workflow code that references it by name.",[971,2266,2267,2328],{},[974,2268,2270],{"className":976,"code":2269,"filename":978,"language":979,"meta":980,"style":980},"curl -X PATCH \\\n  \"http:\u002F\u002Funitelabs-api.\u003Ctenant-id>.svc\u002Fv1\u002Fsecrets\u002Fa3bb189e-8bf9-3888-9912-ace4e6543002\" \\\n  -H \"Authorization: Bearer \u003Ctoken>\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"parameters\": {\n      \"minio_root_password\": \"new-rotated-secret-key\"\n    }\n  }'\n",[966,2271,2272,2283,2289,2297,2305,2311,2315,2320,2324],{"__ignoreMap":980},[984,2273,2274,2276,2278,2281],{"class":986,"line":987},[984,2275,991],{"class":990},[984,2277,995],{"class":994},[984,2279,2280],{"class":998}," PATCH",[984,2282,1003],{"class":1002},[984,2284,2285,2287],{"class":986,"line":1006},[984,2286,2158],{"class":998},[984,2288,1003],{"class":1002},[984,2290,2291,2293,2295],{"class":986,"line":1014},[984,2292,1017],{"class":994},[984,2294,1597],{"class":998},[984,2296,1003],{"class":1002},[984,2298,2299,2301,2303],{"class":986,"line":1025},[984,2300,1017],{"class":994},[984,2302,1606],{"class":998},[984,2304,1003],{"class":1002},[984,2306,2307,2309],{"class":986,"line":1036},[984,2308,1028],{"class":994},[984,2310,1615],{"class":998},[984,2312,2313],{"class":986,"line":1046},[984,2314,1630],{"class":998},[984,2316,2317],{"class":986,"line":1119},[984,2318,2319],{"class":998},"      \"minio_root_password\": \"new-rotated-secret-key\"\n",[984,2321,2322],{"class":986,"line":1132},[984,2323,1669],{"class":998},[984,2325,2326],{"class":986,"line":1145},[984,2327,1675],{"class":998},[974,2329,2331],{"className":1054,"code":2330,"filename":1387,"language":1057,"meta":980,"style":980},"from unitelabs.sdk import AsyncApiClient\n\nSECRET_ID = \"a3bb189e-8bf9-3888-9912-ace4e6543002\"\n\nasync with AsyncApiClient() as client:\n    updated = await client.patch(f\"\u002Fsecrets\u002F{SECRET_ID}\", json={\n        \"parameters\": {\n            \"minio_root_password\": \"new-rotated-secret-key\",\n        },\n    })\n",[966,2332,2333,2343,2347,2355,2359,2371,2403,2409,2420,2424],{"__ignoreMap":980},[984,2334,2335,2337,2339,2341],{"class":986,"line":987},[984,2336,1394],{"class":1002},[984,2338,1397],{"class":1067},[984,2340,1064],{"class":1002},[984,2342,1402],{"class":1067},[984,2344,2345],{"class":986,"line":1006},[984,2346,1074],{"emptyLinePlaceholder":1073},[984,2348,2349,2351,2353],{"class":986,"line":1014},[984,2350,2190],{"class":994},[984,2352,2193],{"class":1002},[984,2354,2196],{"class":998},[984,2356,2357],{"class":986,"line":1025},[984,2358,1074],{"emptyLinePlaceholder":1073},[984,2360,2361,2363,2365,2367,2369],{"class":986,"line":1036},[984,2362,1411],{"class":1002},[984,2364,1414],{"class":1002},[984,2366,1417],{"class":1067},[984,2368,1420],{"class":1002},[984,2370,1423],{"class":1067},[984,2372,2373,2376,2378,2380,2383,2385,2387,2389,2391,2393,2395,2397,2399,2401],{"class":986,"line":1046},[984,2374,2375],{"class":1067},"    updated ",[984,2377,1082],{"class":1002},[984,2379,1433],{"class":1002},[984,2381,2382],{"class":1067}," client.patch(",[984,2384,2225],{"class":1002},[984,2386,2228],{"class":998},[984,2388,2231],{"class":1002},[984,2390,2190],{"class":994},[984,2392,2236],{"class":1002},[984,2394,2239],{"class":998},[984,2396,1341],{"class":1067},[984,2398,1344],{"class":990},[984,2400,1082],{"class":1002},[984,2402,1103],{"class":1067},[984,2404,2405,2407],{"class":986,"line":1119},[984,2406,1758],{"class":998},[984,2408,1761],{"class":1067},[984,2410,2411,2413,2415,2418],{"class":986,"line":1132},[984,2412,1778],{"class":998},[984,2414,1111],{"class":1067},[984,2416,2417],{"class":998},"\"new-rotated-secret-key\"",[984,2419,1093],{"class":1067},[984,2421,2422],{"class":986,"line":1145},[984,2423,1826],{"class":1067},[984,2425,2426],{"class":986,"line":1151},[984,2427,1831],{"class":1067},[915,2429,2430,1855,2432,2434],{},[1852,2431,1854],{},[966,2433,2059],{}," — returns the full updated secret object.",[955,2436],{},[958,2438,1328],{"id":2439},"delete-a-secret",[915,2441,2442],{},"Permanently removes a secret. Workflows that reference it by name will fail until a replacement is created.",[971,2444,2445,2473],{},[974,2446,2448],{"className":976,"code":2447,"filename":978,"language":979,"meta":980,"style":980},"curl -X DELETE \\\n  \"http:\u002F\u002Funitelabs-api.\u003Ctenant-id>.svc\u002Fv1\u002Fsecrets\u002Fa3bb189e-8bf9-3888-9912-ace4e6543002\" \\\n  -H \"Authorization: Bearer \u003Ctoken>\"\n",[966,2449,2450,2461,2467],{"__ignoreMap":980},[984,2451,2452,2454,2456,2459],{"class":986,"line":987},[984,2453,991],{"class":990},[984,2455,995],{"class":994},[984,2457,2458],{"class":998}," DELETE",[984,2460,1003],{"class":1002},[984,2462,2463,2465],{"class":986,"line":1006},[984,2464,2158],{"class":998},[984,2466,1003],{"class":1002},[984,2468,2469,2471],{"class":986,"line":1014},[984,2470,1017],{"class":994},[984,2472,1383],{"class":998},[974,2474,2476],{"className":1054,"code":2475,"filename":1387,"language":1057,"meta":980,"style":980},"from unitelabs.sdk import AsyncApiClient\n\nSECRET_ID = \"a3bb189e-8bf9-3888-9912-ace4e6543002\"\n\nasync with AsyncApiClient() as client:\n    await client.delete(f\"\u002Fsecrets\u002F{SECRET_ID}\")\n",[966,2477,2478,2488,2492,2500,2504,2516],{"__ignoreMap":980},[984,2479,2480,2482,2484,2486],{"class":986,"line":987},[984,2481,1394],{"class":1002},[984,2483,1397],{"class":1067},[984,2485,1064],{"class":1002},[984,2487,1402],{"class":1067},[984,2489,2490],{"class":986,"line":1006},[984,2491,1074],{"emptyLinePlaceholder":1073},[984,2493,2494,2496,2498],{"class":986,"line":1014},[984,2495,2190],{"class":994},[984,2497,2193],{"class":1002},[984,2499,2196],{"class":998},[984,2501,2502],{"class":986,"line":1025},[984,2503,1074],{"emptyLinePlaceholder":1073},[984,2505,2506,2508,2510,2512,2514],{"class":986,"line":1036},[984,2507,1411],{"class":1002},[984,2509,1414],{"class":1002},[984,2511,1417],{"class":1067},[984,2513,1420],{"class":1002},[984,2515,1423],{"class":1067},[984,2517,2518,2521,2524,2526,2528,2530,2532,2534,2536],{"class":986,"line":1046},[984,2519,2520],{"class":1002},"    await",[984,2522,2523],{"class":1067}," client.delete(",[984,2525,2225],{"class":1002},[984,2527,2228],{"class":998},[984,2529,2231],{"class":1002},[984,2531,2190],{"class":994},[984,2533,2236],{"class":1002},[984,2535,2239],{"class":998},[984,2537,1154],{"class":1067},[915,2539,2540,1855,2542,1462],{},[1852,2541,1854],{},[966,2543,2059],{},[955,2545],{},[958,2547,2549],{"id":2548},"common-use-cases","Common use cases",[2551,2552,2554],"h3",{"id":2553},"load-credentials-in-a-workflow","Load credentials in a workflow",[915,2556,2557],{},"The most common pattern: load all secrets at the start of a Prefect task and extract the ones you need by name.",[971,2559,2560,2588],{},[974,2561,2563],{"className":976,"code":2562,"filename":978,"language":979,"meta":980,"style":980},"curl -X GET \\\n  \"http:\u002F\u002Funitelabs-api.\u003Ctenant-id>.svc\u002Fv1\u002Fsecrets?name=warehouse-admin\" \\\n  -H \"Authorization: Bearer \u003Ctoken>\"\n",[966,2564,2565,2575,2582],{"__ignoreMap":980},[984,2566,2567,2569,2571,2573],{"class":986,"line":987},[984,2568,991],{"class":990},[984,2570,995],{"class":994},[984,2572,1367],{"class":998},[984,2574,1003],{"class":1002},[984,2576,2577,2580],{"class":986,"line":1006},[984,2578,2579],{"class":998},"  \"http:\u002F\u002Funitelabs-api.\u003Ctenant-id>.svc\u002Fv1\u002Fsecrets?name=warehouse-admin\"",[984,2581,1003],{"class":1002},[984,2583,2584,2586],{"class":986,"line":1014},[984,2585,1017],{"class":994},[984,2587,1383],{"class":998},[974,2589,2591],{"className":1054,"code":2590,"filename":1387,"language":1057,"meta":980,"style":980},"from unitelabs.sdk import AsyncApiClient\n\n\nasync def load_credentials() -> dict:\n    \"\"\"Load all platform secrets and return by name.\"\"\"\n    async with AsyncApiClient() as client:\n        secrets = await client.get(\"\u002Fsecrets\")\n\n    return {s[\"name\"]: s[\"parameters\"] for s in secrets}\n\n\n# In a Prefect task or flow\nasync def my_task():\n    creds = await load_credentials()\n\n    # S3\u002FMinIO credentials\n    s3 = creds[\"datalake-admin\"]\n    access_key = s3[\"minio_root_user\"]\n    secret_key = s3[\"minio_root_password\"]\n    endpoint = s3[\"aws_client_parameters\"][\"endpoint_url\"]\n\n    # Warehouse credentials\n    db = creds[\"warehouse-admin\"]\n    db_url = (\n        f\"postgresql+asyncpg:\u002F\u002F{db['username']}:{db['password']}\"\n        f\"@{db['host']}:{db['port']}\u002F{db['database']}\"\n    )\n",[966,2592,2593,2603,2607,2611,2631,2636,2649,2664,2668,2694,2698,2702,2707,2719,2731,2735,2740,2755,2771,2786,2807,2812,2818,2833,2844,2882,2930],{"__ignoreMap":980},[984,2594,2595,2597,2599,2601],{"class":986,"line":987},[984,2596,1394],{"class":1002},[984,2598,1397],{"class":1067},[984,2600,1064],{"class":1002},[984,2602,1402],{"class":1067},[984,2604,2605],{"class":986,"line":1006},[984,2606,1074],{"emptyLinePlaceholder":1073},[984,2608,2609],{"class":986,"line":1014},[984,2610,1074],{"emptyLinePlaceholder":1073},[984,2612,2613,2615,2618,2622,2625,2628],{"class":986,"line":1025},[984,2614,1411],{"class":1002},[984,2616,2617],{"class":1002}," def",[984,2619,2621],{"class":2620},"s4qFZ"," load_credentials",[984,2623,2624],{"class":1067},"() -> ",[984,2626,2627],{"class":994},"dict",[984,2629,2630],{"class":1067},":\n",[984,2632,2633],{"class":986,"line":1036},[984,2634,2635],{"class":998},"    \"\"\"Load all platform secrets and return by name.\"\"\"\n",[984,2637,2638,2641,2643,2645,2647],{"class":986,"line":1046},[984,2639,2640],{"class":1002},"    async",[984,2642,1414],{"class":1002},[984,2644,1417],{"class":1067},[984,2646,1420],{"class":1002},[984,2648,1423],{"class":1067},[984,2650,2651,2654,2656,2658,2660,2662],{"class":986,"line":1119},[984,2652,2653],{"class":1067},"        secrets ",[984,2655,1082],{"class":1002},[984,2657,1433],{"class":1002},[984,2659,1436],{"class":1067},[984,2661,1721],{"class":998},[984,2663,1154],{"class":1067},[984,2665,2666],{"class":986,"line":1132},[984,2667,1074],{"emptyLinePlaceholder":1073},[984,2669,2670,2673,2676,2678,2681,2683,2685,2687,2689,2691],{"class":986,"line":1145},[984,2671,2672],{"class":1002},"    return",[984,2674,2675],{"class":1067}," {s[",[984,2677,2026],{"class":998},[984,2679,2680],{"class":1067},"]: s[",[984,2682,2050],{"class":998},[984,2684,2029],{"class":1067},[984,2686,2008],{"class":1002},[984,2688,2011],{"class":1067},[984,2690,2014],{"class":1002},[984,2692,2693],{"class":1067}," secrets}\n",[984,2695,2696],{"class":986,"line":1151},[984,2697,1074],{"emptyLinePlaceholder":1073},[984,2699,2700],{"class":986,"line":1157},[984,2701,1074],{"emptyLinePlaceholder":1073},[984,2703,2704],{"class":986,"line":1648},[984,2705,2706],{"class":1847},"# In a Prefect task or flow\n",[984,2708,2709,2711,2713,2716],{"class":986,"line":1654},[984,2710,1411],{"class":1002},[984,2712,2617],{"class":1002},[984,2714,2715],{"class":2620}," my_task",[984,2717,2718],{"class":1067},"():\n",[984,2720,2721,2724,2726,2728],{"class":986,"line":1660},[984,2722,2723],{"class":1067},"    creds ",[984,2725,1082],{"class":1002},[984,2727,1433],{"class":1002},[984,2729,2730],{"class":1067}," load_credentials()\n",[984,2732,2733],{"class":986,"line":1666},[984,2734,1074],{"emptyLinePlaceholder":1073},[984,2736,2737],{"class":986,"line":1672},[984,2738,2739],{"class":1847},"    # S3\u002FMinIO credentials\n",[984,2741,2743,2746,2748,2751,2753],{"class":986,"line":2742},17,[984,2744,2745],{"class":1067},"    s3 ",[984,2747,1082],{"class":1002},[984,2749,2750],{"class":1067}," creds[",[984,2752,1739],{"class":998},[984,2754,1171],{"class":1067},[984,2756,2758,2761,2763,2766,2769],{"class":986,"line":2757},18,[984,2759,2760],{"class":1067},"    access_key ",[984,2762,1082],{"class":1002},[984,2764,2765],{"class":1067}," s3[",[984,2767,2768],{"class":998},"\"minio_root_user\"",[984,2770,1171],{"class":1067},[984,2772,2774,2777,2779,2781,2784],{"class":986,"line":2773},19,[984,2775,2776],{"class":1067},"    secret_key ",[984,2778,1082],{"class":1002},[984,2780,2765],{"class":1067},[984,2782,2783],{"class":998},"\"minio_root_password\"",[984,2785,1171],{"class":1067},[984,2787,2789,2792,2794,2796,2799,2802,2805],{"class":986,"line":2788},20,[984,2790,2791],{"class":1067},"    endpoint ",[984,2793,1082],{"class":1002},[984,2795,2765],{"class":1067},[984,2797,2798],{"class":998},"\"aws_client_parameters\"",[984,2800,2801],{"class":1067},"][",[984,2803,2804],{"class":998},"\"endpoint_url\"",[984,2806,1171],{"class":1067},[984,2808,2810],{"class":986,"line":2809},21,[984,2811,1074],{"emptyLinePlaceholder":1073},[984,2813,2815],{"class":986,"line":2814},22,[984,2816,2817],{"class":1847},"    # Warehouse credentials\n",[984,2819,2821,2824,2826,2828,2831],{"class":986,"line":2820},23,[984,2822,2823],{"class":1067},"    db ",[984,2825,1082],{"class":1002},[984,2827,2750],{"class":1067},[984,2829,2830],{"class":998},"\"warehouse-admin\"",[984,2832,1171],{"class":1067},[984,2834,2836,2839,2841],{"class":986,"line":2835},24,[984,2837,2838],{"class":1067},"    db_url ",[984,2840,1082],{"class":1002},[984,2842,2843],{"class":1067}," (\n",[984,2845,2847,2850,2853,2855,2858,2861,2864,2866,2868,2870,2872,2875,2877,2879],{"class":986,"line":2846},25,[984,2848,2849],{"class":1002},"        f",[984,2851,2852],{"class":998},"\"postgresql+asyncpg:\u002F\u002F",[984,2854,2231],{"class":1002},[984,2856,2857],{"class":1067},"db[",[984,2859,2860],{"class":998},"'username'",[984,2862,2863],{"class":1067},"]",[984,2865,2236],{"class":1002},[984,2867,1859],{"class":998},[984,2869,2231],{"class":1002},[984,2871,2857],{"class":1067},[984,2873,2874],{"class":998},"'password'",[984,2876,2863],{"class":1067},[984,2878,2236],{"class":1002},[984,2880,2881],{"class":998},"\"\n",[984,2883,2885,2887,2890,2892,2894,2897,2899,2901,2903,2905,2907,2910,2912,2914,2917,2919,2921,2924,2926,2928],{"class":986,"line":2884},26,[984,2886,2849],{"class":1002},[984,2888,2889],{"class":998},"\"@",[984,2891,2231],{"class":1002},[984,2893,2857],{"class":1067},[984,2895,2896],{"class":998},"'host'",[984,2898,2863],{"class":1067},[984,2900,2236],{"class":1002},[984,2902,1859],{"class":998},[984,2904,2231],{"class":1002},[984,2906,2857],{"class":1067},[984,2908,2909],{"class":998},"'port'",[984,2911,2863],{"class":1067},[984,2913,2236],{"class":1002},[984,2915,2916],{"class":998},"\u002F",[984,2918,2231],{"class":1002},[984,2920,2857],{"class":1067},[984,2922,2923],{"class":998},"'database'",[984,2925,2863],{"class":1067},[984,2927,2236],{"class":1002},[984,2929,2881],{"class":998},[984,2931,2933],{"class":986,"line":2932},27,[984,2934,2935],{"class":1067},"    )\n",[2551,2937,2939],{"id":2938},"rotate-a-credential-without-touching-workflow-code","Rotate a credential without touching workflow code",[915,2941,2942],{},"When a key is compromised or expires, update only the secret value. Every workflow that loads credentials at runtime will pick up the new value on its next run — no code changes required.",[971,2944,2945,3027],{},[974,2946,2948],{"className":976,"code":2947,"filename":978,"language":979,"meta":980,"style":980},"# 1. Find the secret ID\ncurl -X GET \\\n  \"http:\u002F\u002Funitelabs-api.\u003Ctenant-id>.svc\u002Fv1\u002Fsecrets?name=benchling-credentials\" \\\n  -H \"Authorization: Bearer \u003Ctoken>\"\n\n# 2. Update only the API key field\ncurl -X PATCH \\\n  \"http:\u002F\u002Funitelabs-api.\u003Ctenant-id>.svc\u002Fv1\u002Fsecrets\u002F\u003Csecret-id>\" \\\n  -H \"Authorization: Bearer \u003Ctoken>\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"parameters\": {\"api_key\": \"\u003Cnew-api-key>\"}}'\n",[966,2949,2950,2955,2965,2972,2978,2982,2987,2997,3004,3012,3020],{"__ignoreMap":980},[984,2951,2952],{"class":986,"line":987},[984,2953,2954],{"class":1847},"# 1. Find the secret ID\n",[984,2956,2957,2959,2961,2963],{"class":986,"line":1006},[984,2958,991],{"class":990},[984,2960,995],{"class":994},[984,2962,1367],{"class":998},[984,2964,1003],{"class":1002},[984,2966,2967,2970],{"class":986,"line":1014},[984,2968,2969],{"class":998},"  \"http:\u002F\u002Funitelabs-api.\u003Ctenant-id>.svc\u002Fv1\u002Fsecrets?name=benchling-credentials\"",[984,2971,1003],{"class":1002},[984,2973,2974,2976],{"class":986,"line":1025},[984,2975,1017],{"class":994},[984,2977,1383],{"class":998},[984,2979,2980],{"class":986,"line":1036},[984,2981,1074],{"emptyLinePlaceholder":1073},[984,2983,2984],{"class":986,"line":1046},[984,2985,2986],{"class":1847},"# 2. Update only the API key field\n",[984,2988,2989,2991,2993,2995],{"class":986,"line":1119},[984,2990,991],{"class":990},[984,2992,995],{"class":994},[984,2994,2280],{"class":998},[984,2996,1003],{"class":1002},[984,2998,2999,3002],{"class":986,"line":1132},[984,3000,3001],{"class":998},"  \"http:\u002F\u002Funitelabs-api.\u003Ctenant-id>.svc\u002Fv1\u002Fsecrets\u002F\u003Csecret-id>\"",[984,3003,1003],{"class":1002},[984,3005,3006,3008,3010],{"class":986,"line":1145},[984,3007,1017],{"class":994},[984,3009,1597],{"class":998},[984,3011,1003],{"class":1002},[984,3013,3014,3016,3018],{"class":986,"line":1151},[984,3015,1017],{"class":994},[984,3017,1606],{"class":998},[984,3019,1003],{"class":1002},[984,3021,3022,3024],{"class":986,"line":1157},[984,3023,1028],{"class":994},[984,3025,3026],{"class":998}," '{\"parameters\": {\"api_key\": \"\u003Cnew-api-key>\"}}'\n",[974,3028,3030],{"className":1054,"code":3029,"filename":1387,"language":1057,"meta":980,"style":980},"from unitelabs.sdk import AsyncApiClient\n\n\nasync def rotate_api_key(secret_name: str, new_key: str) -> None:\n    async with AsyncApiClient() as client:\n        # Find the secret by name\n        secrets = await client.get(\"\u002Fsecrets\")\n        target = next(s for s in secrets if s[\"name\"] == secret_name)\n\n        # Patch only the changed field\n        await client.patch(f\"\u002Fsecrets\u002F{target['id']}\", json={\n            \"parameters\": {\"api_key\": new_key},\n        })\n        print(f\"Rotated '{secret_name}' successfully\")\n\n\n# asyncio.run(rotate_api_key(\"benchling-credentials\", \"sk-new-key-...\"))\n",[966,3031,3032,3042,3046,3050,3078,3090,3095,3109,3141,3145,3150,3183,3197,3202,3227,3231,3235],{"__ignoreMap":980},[984,3033,3034,3036,3038,3040],{"class":986,"line":987},[984,3035,1394],{"class":1002},[984,3037,1397],{"class":1067},[984,3039,1064],{"class":1002},[984,3041,1402],{"class":1067},[984,3043,3044],{"class":986,"line":1006},[984,3045,1074],{"emptyLinePlaceholder":1073},[984,3047,3048],{"class":986,"line":1014},[984,3049,1074],{"emptyLinePlaceholder":1073},[984,3051,3052,3054,3056,3059,3062,3065,3068,3070,3073,3076],{"class":986,"line":1025},[984,3053,1411],{"class":1002},[984,3055,2617],{"class":1002},[984,3057,3058],{"class":2620}," rotate_api_key",[984,3060,3061],{"class":1067},"(secret_name: ",[984,3063,3064],{"class":994},"str",[984,3066,3067],{"class":1067},", new_key: ",[984,3069,3064],{"class":994},[984,3071,3072],{"class":1067},") -> ",[984,3074,3075],{"class":994},"None",[984,3077,2630],{"class":1067},[984,3079,3080,3082,3084,3086,3088],{"class":986,"line":1036},[984,3081,2640],{"class":1002},[984,3083,1414],{"class":1002},[984,3085,1417],{"class":1067},[984,3087,1420],{"class":1002},[984,3089,1423],{"class":1067},[984,3091,3092],{"class":986,"line":1046},[984,3093,3094],{"class":1847},"        # Find the secret by name\n",[984,3096,3097,3099,3101,3103,3105,3107],{"class":986,"line":1119},[984,3098,2653],{"class":1067},[984,3100,1082],{"class":1002},[984,3102,1433],{"class":1002},[984,3104,1436],{"class":1067},[984,3106,1721],{"class":998},[984,3108,1154],{"class":1067},[984,3110,3111,3114,3116,3118,3120,3122,3124,3126,3128,3130,3132,3134,3136,3138],{"class":986,"line":1132},[984,3112,3113],{"class":1067},"        target ",[984,3115,1082],{"class":1002},[984,3117,2002],{"class":994},[984,3119,2005],{"class":1067},[984,3121,2008],{"class":1002},[984,3123,2011],{"class":1067},[984,3125,2014],{"class":1002},[984,3127,2017],{"class":1067},[984,3129,2020],{"class":1002},[984,3131,2023],{"class":1067},[984,3133,2026],{"class":998},[984,3135,2029],{"class":1067},[984,3137,2032],{"class":1002},[984,3139,3140],{"class":1067}," secret_name)\n",[984,3142,3143],{"class":986,"line":1145},[984,3144,1074],{"emptyLinePlaceholder":1073},[984,3146,3147],{"class":986,"line":1151},[984,3148,3149],{"class":1847},"        # Patch only the changed field\n",[984,3151,3152,3155,3157,3159,3161,3163,3166,3169,3171,3173,3175,3177,3179,3181],{"class":986,"line":1157},[984,3153,3154],{"class":1002},"        await",[984,3156,2382],{"class":1067},[984,3158,2225],{"class":1002},[984,3160,2228],{"class":998},[984,3162,2231],{"class":1002},[984,3164,3165],{"class":1067},"target[",[984,3167,3168],{"class":998},"'id'",[984,3170,2863],{"class":1067},[984,3172,2236],{"class":1002},[984,3174,2239],{"class":998},[984,3176,1341],{"class":1067},[984,3178,1344],{"class":990},[984,3180,1082],{"class":1002},[984,3182,1103],{"class":1067},[984,3184,3185,3188,3191,3194],{"class":986,"line":1648},[984,3186,3187],{"class":998},"            \"parameters\"",[984,3189,3190],{"class":1067},": {",[984,3192,3193],{"class":998},"\"api_key\"",[984,3195,3196],{"class":1067},": new_key},\n",[984,3198,3199],{"class":986,"line":1654},[984,3200,3201],{"class":1067},"        })\n",[984,3203,3204,3207,3210,3212,3215,3217,3220,3222,3225],{"class":986,"line":1660},[984,3205,3206],{"class":994},"        print",[984,3208,3209],{"class":1067},"(",[984,3211,2225],{"class":1002},[984,3213,3214],{"class":998},"\"Rotated '",[984,3216,2231],{"class":1002},[984,3218,3219],{"class":1067},"secret_name",[984,3221,2236],{"class":1002},[984,3223,3224],{"class":998},"' successfully\"",[984,3226,1154],{"class":1067},[984,3228,3229],{"class":986,"line":1666},[984,3230,1074],{"emptyLinePlaceholder":1073},[984,3232,3233],{"class":986,"line":1672},[984,3234,1074],{"emptyLinePlaceholder":1073},[984,3236,3237],{"class":986,"line":2742},[984,3238,3239],{"class":1847},"# asyncio.run(rotate_api_key(\"benchling-credentials\", \"sk-new-key-...\"))\n",[2551,3241,3243],{"id":3242},"bootstrap-secrets-for-a-new-environment","Bootstrap secrets for a new environment",[915,3245,3246],{},"Create all required secrets for a fresh deployment in one script:",[971,3248,3249,3344],{},[974,3250,3252],{"className":976,"code":3251,"filename":978,"language":979,"meta":980,"style":980},"curl -X POST \\\n  \"http:\u002F\u002Funitelabs-api.\u003Ctenant-id>.svc\u002Fv1\u002Fsecrets\" \\\n  -H \"Authorization: Bearer \u003Ctoken>\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"name\": \"warehouse-admin\",\n    \"type\": \"postgres\",\n    \"parameters\": {\n      \"host\": \"postgres.svc\",\n      \"port\": 5432,\n      \"database\": \"unitelabs\",\n      \"username\": \"warehouse_user\",\n      \"password\": \"secure-password\",\n      \"schema_name\": \"warehouse\"\n    }\n  }'\n",[966,3253,3254,3264,3270,3278,3286,3292,3297,3302,3306,3311,3316,3321,3326,3331,3336,3340],{"__ignoreMap":980},[984,3255,3256,3258,3260,3262],{"class":986,"line":987},[984,3257,991],{"class":990},[984,3259,995],{"class":994},[984,3261,999],{"class":998},[984,3263,1003],{"class":1002},[984,3265,3266,3268],{"class":986,"line":1006},[984,3267,1588],{"class":998},[984,3269,1003],{"class":1002},[984,3271,3272,3274,3276],{"class":986,"line":1014},[984,3273,1017],{"class":994},[984,3275,1597],{"class":998},[984,3277,1003],{"class":1002},[984,3279,3280,3282,3284],{"class":986,"line":1025},[984,3281,1017],{"class":994},[984,3283,1606],{"class":998},[984,3285,1003],{"class":1002},[984,3287,3288,3290],{"class":986,"line":1036},[984,3289,1028],{"class":994},[984,3291,1615],{"class":998},[984,3293,3294],{"class":986,"line":1046},[984,3295,3296],{"class":998},"    \"name\": \"warehouse-admin\",\n",[984,3298,3299],{"class":986,"line":1119},[984,3300,3301],{"class":998},"    \"type\": \"postgres\",\n",[984,3303,3304],{"class":986,"line":1132},[984,3305,1630],{"class":998},[984,3307,3308],{"class":986,"line":1145},[984,3309,3310],{"class":998},"      \"host\": \"postgres.svc\",\n",[984,3312,3313],{"class":986,"line":1151},[984,3314,3315],{"class":998},"      \"port\": 5432,\n",[984,3317,3318],{"class":986,"line":1157},[984,3319,3320],{"class":998},"      \"database\": \"unitelabs\",\n",[984,3322,3323],{"class":986,"line":1648},[984,3324,3325],{"class":998},"      \"username\": \"warehouse_user\",\n",[984,3327,3328],{"class":986,"line":1654},[984,3329,3330],{"class":998},"      \"password\": \"secure-password\",\n",[984,3332,3333],{"class":986,"line":1660},[984,3334,3335],{"class":998},"      \"schema_name\": \"warehouse\"\n",[984,3337,3338],{"class":986,"line":1666},[984,3339,1669],{"class":998},[984,3341,3342],{"class":986,"line":1672},[984,3343,1675],{"class":998},[974,3345,3347],{"className":1054,"code":3346,"filename":1387,"language":1057,"meta":980,"style":980},"from unitelabs.sdk import AsyncApiClient\n\nSECRETS = [\n    {\n        \"name\": \"datalake-admin\",\n        \"type\": \"aws-s3\",\n        \"parameters\": {\n            \"minio_root_user\": \"access-key\",\n            \"minio_root_password\": \"secret-key\",\n            \"aws_client_parameters\": {\n                \"endpoint_url\": \"http:\u002F\u002Fminio.svc:9000\",\n                \"bucket_name\": \"lab-data\",\n            },\n        },\n    },\n    {\n        \"name\": \"warehouse-admin\",\n        \"type\": \"postgres\",\n        \"parameters\": {\n            \"host\": \"postgres.svc\",\n            \"port\": 5432,\n            \"database\": \"unitelabs\",\n            \"username\": \"warehouse_user\",\n            \"password\": \"secure-password\",\n            \"schema_name\": \"warehouse\",\n        },\n    },\n]\n\n\nasync def bootstrap_secrets() -> None:\n    async with AsyncApiClient() as client:\n        existing = await client.get(\"\u002Fsecrets\")\n        existing_names = {s[\"name\"] for s in existing}\n\n        for secret in SECRETS:\n            if secret[\"name\"] in existing_names:\n                print(f\"Skipping '{secret['name']}' — already exists\")\n                continue\n            await client.post(\"\u002Fsecrets\", json=secret)\n            print(f\"Created '{secret['name']}'\")\n",[966,3348,3349,3359,3363,3373,3378,3388,3398,3404,3415,3426,3432,3442,3452,3456,3460,3464,3468,3478,3489,3495,3507,3519,3531,3543,3555,3567,3571,3575,3580,3585,3590,3606,3619,3635,3658,3663,3679,3696,3726,3732,3751],{"__ignoreMap":980},[984,3350,3351,3353,3355,3357],{"class":986,"line":987},[984,3352,1394],{"class":1002},[984,3354,1397],{"class":1067},[984,3356,1064],{"class":1002},[984,3358,1402],{"class":1067},[984,3360,3361],{"class":986,"line":1006},[984,3362,1074],{"emptyLinePlaceholder":1073},[984,3364,3365,3368,3370],{"class":986,"line":1014},[984,3366,3367],{"class":994},"SECRETS",[984,3369,2193],{"class":1002},[984,3371,3372],{"class":1067}," [\n",[984,3374,3375],{"class":986,"line":1025},[984,3376,3377],{"class":1067},"    {\n",[984,3379,3380,3382,3384,3386],{"class":986,"line":1036},[984,3381,1734],{"class":998},[984,3383,1111],{"class":1067},[984,3385,1739],{"class":998},[984,3387,1093],{"class":1067},[984,3389,3390,3392,3394,3396],{"class":986,"line":1046},[984,3391,1746],{"class":998},[984,3393,1111],{"class":1067},[984,3395,1751],{"class":998},[984,3397,1093],{"class":1067},[984,3399,3400,3402],{"class":986,"line":1119},[984,3401,1758],{"class":998},[984,3403,1761],{"class":1067},[984,3405,3406,3408,3410,3413],{"class":986,"line":1132},[984,3407,1766],{"class":998},[984,3409,1111],{"class":1067},[984,3411,3412],{"class":998},"\"access-key\"",[984,3414,1093],{"class":1067},[984,3416,3417,3419,3421,3424],{"class":986,"line":1145},[984,3418,1778],{"class":998},[984,3420,1111],{"class":1067},[984,3422,3423],{"class":998},"\"secret-key\"",[984,3425,1093],{"class":1067},[984,3427,3428,3430],{"class":986,"line":1151},[984,3429,1790],{"class":998},[984,3431,1761],{"class":1067},[984,3433,3434,3436,3438,3440],{"class":986,"line":1157},[984,3435,1797],{"class":998},[984,3437,1111],{"class":1067},[984,3439,1802],{"class":998},[984,3441,1093],{"class":1067},[984,3443,3444,3446,3448,3450],{"class":986,"line":1648},[984,3445,1809],{"class":998},[984,3447,1111],{"class":1067},[984,3449,1814],{"class":998},[984,3451,1093],{"class":1067},[984,3453,3454],{"class":986,"line":1654},[984,3455,1821],{"class":1067},[984,3457,3458],{"class":986,"line":1660},[984,3459,1826],{"class":1067},[984,3461,3462],{"class":986,"line":1666},[984,3463,1148],{"class":1067},[984,3465,3466],{"class":986,"line":1672},[984,3467,3377],{"class":1067},[984,3469,3470,3472,3474,3476],{"class":986,"line":2742},[984,3471,1734],{"class":998},[984,3473,1111],{"class":1067},[984,3475,2830],{"class":998},[984,3477,1093],{"class":1067},[984,3479,3480,3482,3484,3487],{"class":986,"line":2757},[984,3481,1746],{"class":998},[984,3483,1111],{"class":1067},[984,3485,3486],{"class":998},"\"postgres\"",[984,3488,1093],{"class":1067},[984,3490,3491,3493],{"class":986,"line":2773},[984,3492,1758],{"class":998},[984,3494,1761],{"class":1067},[984,3496,3497,3500,3502,3505],{"class":986,"line":2788},[984,3498,3499],{"class":998},"            \"host\"",[984,3501,1111],{"class":1067},[984,3503,3504],{"class":998},"\"postgres.svc\"",[984,3506,1093],{"class":1067},[984,3508,3509,3512,3514,3517],{"class":986,"line":2809},[984,3510,3511],{"class":998},"            \"port\"",[984,3513,1111],{"class":1067},[984,3515,3516],{"class":994},"5432",[984,3518,1093],{"class":1067},[984,3520,3521,3524,3526,3529],{"class":986,"line":2814},[984,3522,3523],{"class":998},"            \"database\"",[984,3525,1111],{"class":1067},[984,3527,3528],{"class":998},"\"unitelabs\"",[984,3530,1093],{"class":1067},[984,3532,3533,3536,3538,3541],{"class":986,"line":2820},[984,3534,3535],{"class":998},"            \"username\"",[984,3537,1111],{"class":1067},[984,3539,3540],{"class":998},"\"warehouse_user\"",[984,3542,1093],{"class":1067},[984,3544,3545,3548,3550,3553],{"class":986,"line":2835},[984,3546,3547],{"class":998},"            \"password\"",[984,3549,1111],{"class":1067},[984,3551,3552],{"class":998},"\"secure-password\"",[984,3554,1093],{"class":1067},[984,3556,3557,3560,3562,3565],{"class":986,"line":2846},[984,3558,3559],{"class":998},"            \"schema_name\"",[984,3561,1111],{"class":1067},[984,3563,3564],{"class":998},"\"warehouse\"",[984,3566,1093],{"class":1067},[984,3568,3569],{"class":986,"line":2884},[984,3570,1826],{"class":1067},[984,3572,3573],{"class":986,"line":2932},[984,3574,1148],{"class":1067},[984,3576,3578],{"class":986,"line":3577},28,[984,3579,1171],{"class":1067},[984,3581,3583],{"class":986,"line":3582},29,[984,3584,1074],{"emptyLinePlaceholder":1073},[984,3586,3588],{"class":986,"line":3587},30,[984,3589,1074],{"emptyLinePlaceholder":1073},[984,3591,3593,3595,3597,3600,3602,3604],{"class":986,"line":3592},31,[984,3594,1411],{"class":1002},[984,3596,2617],{"class":1002},[984,3598,3599],{"class":2620}," bootstrap_secrets",[984,3601,2624],{"class":1067},[984,3603,3075],{"class":994},[984,3605,2630],{"class":1067},[984,3607,3609,3611,3613,3615,3617],{"class":986,"line":3608},32,[984,3610,2640],{"class":1002},[984,3612,1414],{"class":1002},[984,3614,1417],{"class":1067},[984,3616,1420],{"class":1002},[984,3618,1423],{"class":1067},[984,3620,3622,3625,3627,3629,3631,3633],{"class":986,"line":3621},33,[984,3623,3624],{"class":1067},"        existing ",[984,3626,1082],{"class":1002},[984,3628,1433],{"class":1002},[984,3630,1436],{"class":1067},[984,3632,1721],{"class":998},[984,3634,1154],{"class":1067},[984,3636,3638,3641,3643,3645,3647,3649,3651,3653,3655],{"class":986,"line":3637},34,[984,3639,3640],{"class":1067},"        existing_names ",[984,3642,1082],{"class":1002},[984,3644,2675],{"class":1067},[984,3646,2026],{"class":998},[984,3648,2029],{"class":1067},[984,3650,2008],{"class":1002},[984,3652,2011],{"class":1067},[984,3654,2014],{"class":1002},[984,3656,3657],{"class":1067}," existing}\n",[984,3659,3661],{"class":986,"line":3660},35,[984,3662,1074],{"emptyLinePlaceholder":1073},[984,3664,3666,3669,3672,3674,3677],{"class":986,"line":3665},36,[984,3667,3668],{"class":1002},"        for",[984,3670,3671],{"class":1067}," secret ",[984,3673,2014],{"class":1002},[984,3675,3676],{"class":994}," SECRETS",[984,3678,2630],{"class":1067},[984,3680,3682,3685,3687,3689,3691,3693],{"class":986,"line":3681},37,[984,3683,3684],{"class":1002},"            if",[984,3686,2251],{"class":1067},[984,3688,2026],{"class":998},[984,3690,2029],{"class":1067},[984,3692,2014],{"class":1002},[984,3694,3695],{"class":1067}," existing_names:\n",[984,3697,3699,3702,3704,3706,3709,3711,3714,3717,3719,3721,3724],{"class":986,"line":3698},38,[984,3700,3701],{"class":994},"                print",[984,3703,3209],{"class":1067},[984,3705,2225],{"class":1002},[984,3707,3708],{"class":998},"\"Skipping '",[984,3710,2231],{"class":1002},[984,3712,3713],{"class":1067},"secret[",[984,3715,3716],{"class":998},"'name'",[984,3718,2863],{"class":1067},[984,3720,2236],{"class":1002},[984,3722,3723],{"class":998},"' — already exists\"",[984,3725,1154],{"class":1067},[984,3727,3729],{"class":986,"line":3728},39,[984,3730,3731],{"class":1002},"                continue\n",[984,3733,3735,3738,3740,3742,3744,3746,3748],{"class":986,"line":3734},40,[984,3736,3737],{"class":1002},"            await",[984,3739,1718],{"class":1067},[984,3741,1721],{"class":998},[984,3743,1341],{"class":1067},[984,3745,1344],{"class":990},[984,3747,1082],{"class":1002},[984,3749,3750],{"class":1067},"secret)\n",[984,3752,3754,3757,3759,3761,3764,3766,3768,3770,3772,3774,3777],{"class":986,"line":3753},41,[984,3755,3756],{"class":994},"            print",[984,3758,3209],{"class":1067},[984,3760,2225],{"class":1002},[984,3762,3763],{"class":998},"\"Created '",[984,3765,2231],{"class":1002},[984,3767,3713],{"class":1067},[984,3769,3716],{"class":998},[984,3771,2863],{"class":1067},[984,3773,2236],{"class":1002},[984,3775,3776],{"class":998},"'\"",[984,3778,1154],{"class":1067},[955,3780],{},[958,3782,3784],{"id":3783},"next-steps","Next steps",[936,3786,3787,3797,3806],{},[939,3788,3789,3792,3793,3796],{},[3790,3791,430],"a",{"href":431}," — uses the ",[966,3794,3795],{},"datalake-admin"," secret for MinIO access",[939,3798,3799,3792,3802,3805],{},[3790,3800,3801],{"href":439},"Data Sources",[966,3803,3804],{},"warehouse-admin"," secret for PostgreSQL",[939,3807,3808,3810],{},[3790,3809,173],{"href":174}," — loads both secrets at flow startup",[3812,3813,3814],"style",{},"html pre.shiki code .sNqAu, html code.shiki .sNqAu{--shiki-light:#702C00;--shiki-default:#702C00;--shiki-dark:#FFA657}html pre.shiki code .sOiAX, html code.shiki .sOiAX{--shiki-light:#023B95;--shiki-default:#023B95;--shiki-dark:#79C0FF}html pre.shiki code .sCx38, html code.shiki .sCx38{--shiki-light:#032563;--shiki-default:#032563;--shiki-dark:#A5D6FF}html pre.shiki code .sxkbv, html code.shiki .sxkbv{--shiki-light:#A0111F;--shiki-default:#A0111F;--shiki-dark:#FF7B72}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sc-9e, html code.shiki .sc-9e{--shiki-light:#0E1116;--shiki-default:#0E1116;--shiki-dark:#E6EDF3}html pre.shiki code .sIsDC, html code.shiki .sIsDC{--shiki-light:#66707B;--shiki-default:#66707B;--shiki-dark:#8B949E}html pre.shiki code .s4qFZ, html code.shiki .s4qFZ{--shiki-light:#622CBC;--shiki-default:#622CBC;--shiki-dark:#D2A8FF}",{"title":980,"searchDepth":987,"depth":1006,"links":3816},[3817,3818,3819,3820,3821,3822,3823,3824,3825,3826,3831],{"id":960,"depth":1006,"text":961},{"id":1199,"depth":1006,"text":1200},{"id":1333,"depth":1006,"text":1334},{"id":1454,"depth":1006,"text":1455},{"id":1551,"depth":1006,"text":1552},{"id":1894,"depth":1006,"text":1895},{"id":2133,"depth":1006,"text":1286},{"id":2260,"depth":1006,"text":2261},{"id":2439,"depth":1006,"text":1328},{"id":2548,"depth":1006,"text":2549,"children":3827},[3828,3829,3830],{"id":2553,"depth":1014,"text":2554},{"id":2938,"depth":1014,"text":2939},{"id":3242,"depth":1014,"text":3243},{"id":3783,"depth":1006,"text":3784},"Secure and manage credentials like API keys, tokens, and passwords for safe and reusable access in workflows.","md",{},"\u002Fconcepts\u002Fobserve\u002Fsecrets",{"title":434,"description":3832},"zjL4mfcjj-Up_YsUyvufk5PqAByruStm5TMXeY9xjps",[3839,3841],{"title":430,"description":3840,"path":431},"Store and retrieve files using UniteLabs S3-compatible object storage.",{"title":438,"description":3842,"path":439},"Connect to and manage data sources in the UniteLabs Platform.",1791294181226]