[{"data":1,"prerenderedAt":3179},["ShallowReactive",2],{"navigation":3,"\u002Fhow-to\u002Fautomate\u002Fworkflows-api":964,"\u002Fhow-to\u002Fautomate\u002Fworkflows-api-surround":3174},[4,64,201,380,544,737,785,947],{"title":5,"device":6,"path":7,"stem":8,"children":9,"page":47},"Get Started",null,"\u002Fget-started\u002F","01.get-started",[10,14,48,52,56,60],{"title":11,"path":12,"stem":13,"device":6},"Welcome to UniteLabs","\u002Fget-started\u002Fwelcome\u002F","01.get-started\u002F00.welcome",{"title":15,"device":6,"path":16,"stem":17,"children":18,"page":47},"Setup","\u002Fget-started\u002Fsetup\u002F","01.get-started\u002F01.setup",[19,23,27,31,35,39,43],{"title":20,"path":21,"stem":22,"device":6},"Get access","\u002Fget-started\u002Fsetup\u002Fget-access\u002F","01.get-started\u002F01.setup\u002F00.get-access",{"title":24,"path":25,"stem":26,"device":6},"GroundControl","\u002Fget-started\u002Fsetup\u002Fgroundcontrol\u002F","01.get-started\u002F01.setup\u002F10.groundcontrol",{"title":28,"path":29,"stem":30,"device":6},"Network requirements","\u002Fget-started\u002Fsetup\u002Fnetwork-requirements\u002F","01.get-started\u002F01.setup\u002F15.network-requirements",{"title":32,"path":33,"stem":34,"device":6},"Connect to Platform","\u002Fget-started\u002Fsetup\u002Fconnect-to-platform\u002F","01.get-started\u002F01.setup\u002F20.connect-to-platform",{"title":36,"path":37,"stem":38,"device":6},"Set up your development machine","\u002Fget-started\u002Fsetup\u002Fdeveloper-machine\u002F","01.get-started\u002F01.setup\u002F30.developer-machine",{"title":40,"path":41,"stem":42,"device":6},"SDK installation","\u002Fget-started\u002Fsetup\u002Fsdk-installation\u002F","01.get-started\u002F01.setup\u002F40.sdk-installation",{"title":44,"path":45,"stem":46,"device":6},"Connect an AI assistant to the docs","\u002Fget-started\u002Fsetup\u002Fai-assistant\u002F","01.get-started\u002F01.setup\u002F50.ai-assistant",false,{"title":49,"path":50,"stem":51,"device":6},"Control a device","\u002Fget-started\u002Fcontrol-a-device\u002F","01.get-started\u002F02.control-a-device",{"title":53,"path":54,"stem":55,"device":6},"Liquid handling as code","\u002Fget-started\u002Fliquid-handling-as-code\u002F","01.get-started\u002F03.liquid-handling-as-code",{"title":57,"path":58,"stem":59,"device":6},"Automate your workflows","\u002Fget-started\u002Fautomate-your-workflows\u002F","01.get-started\u002F04.automate-your-workflows",{"title":61,"path":62,"stem":63,"device":6},"Self-Paced Setup Guide","\u002Fget-started\u002Fself-onboarding\u002F","01.get-started\u002F90.self-onboarding",{"title":65,"device":6,"path":66,"stem":67,"children":68,"page":47},"How-to","\u002Fhow-to\u002F","02.how-to",[69,123,176,193],{"title":70,"device":6,"path":71,"stem":72,"children":73,"page":47},"Connectors and devices","\u002Fhow-to\u002Fintegrate\u002F","02.how-to\u002F02.integrate",[74,107],{"title":75,"device":6,"path":76,"stem":77,"children":78,"page":47},"Connect a device","\u002Fhow-to\u002Fintegrate\u002Fconnect-a-device\u002F","02.how-to\u002F02.integrate\u002F20.connect-a-device",[79,83,87,91,95,99,103],{"title":80,"path":81,"stem":82,"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":84,"path":85,"stem":86,"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":88,"path":89,"stem":90,"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":92,"path":93,"stem":94,"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":96,"path":97,"stem":98,"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":100,"path":101,"stem":102,"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":104,"path":105,"stem":106,"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":108,"device":6,"path":109,"stem":110,"children":111,"page":47},"Use a device","\u002Fhow-to\u002Fintegrate\u002Fuse-a-device\u002F","02.how-to\u002F02.integrate\u002F30.use-a-device",[112,115,119],{"title":24,"path":113,"stem":114,"device":6},"\u002Fhow-to\u002Fintegrate\u002Fuse-a-device\u002Fgroundcontrol\u002F","02.how-to\u002F02.integrate\u002F30.use-a-device\u002F10.groundcontrol",{"title":116,"path":117,"stem":118,"device":6},"Platform","\u002Fhow-to\u002Fintegrate\u002Fuse-a-device\u002Fplatform\u002F","02.how-to\u002F02.integrate\u002F30.use-a-device\u002F20.platform",{"title":120,"path":121,"stem":122,"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":124,"device":6,"path":125,"stem":126,"children":127,"page":47},"Workflows","\u002Fhow-to\u002Fautomate\u002F","02.how-to\u002F07.automate",[128,132,136,140,144,148,152,156,160,164,168,172],{"title":129,"path":130,"stem":131,"device":6},"Workflow template","\u002Fhow-to\u002Fautomate\u002Fworkflow-template\u002F","02.how-to\u002F07.automate\u002F10.workflow-template",{"title":133,"path":134,"stem":135,"device":6},"Deploy a workflow","\u002Fhow-to\u002Fautomate\u002Fdeploy-a-workflow\u002F","02.how-to\u002F07.automate\u002F30.deploy-a-workflow",{"title":137,"path":138,"stem":139,"device":6},"Run a workflow","\u002Fhow-to\u002Fautomate\u002Frun-a-workflow\u002F","02.how-to\u002F07.automate\u002F35.run-a-workflow",{"title":141,"path":142,"stem":143,"device":6},"Workflows REST API","\u002Fhow-to\u002Fautomate\u002Fworkflows-api\u002F","02.how-to\u002F07.automate\u002F38.workflows-api",{"title":145,"path":146,"stem":147,"device":6},"CI\u002FCD for workflows","\u002Fhow-to\u002Fautomate\u002Fcicd-for-workflows\u002F","02.how-to\u002F07.automate\u002F40.cicd-for-workflows",{"title":149,"path":150,"stem":151,"device":6},"HITL basics","\u002Fhow-to\u002Fautomate\u002Fbasic-hitl\u002F","02.how-to\u002F07.automate\u002F50.basic-hitl",{"title":153,"path":154,"stem":155,"device":6},"Slack notifications and operator confirmation","\u002Fhow-to\u002Fautomate\u002Fslack-notifications\u002F","02.how-to\u002F07.automate\u002F52.slack-notifications",{"title":157,"path":158,"stem":159,"device":6},"Typed operator inputs","\u002Fhow-to\u002Fautomate\u002Ftyped-operator-inputs\u002F","02.how-to\u002F07.automate\u002F55.typed-operator-inputs",{"title":161,"path":162,"stem":163,"device":6},"Pause and resume a run","\u002Fhow-to\u002Fautomate\u002Fpause-and-resume\u002F","02.how-to\u002F07.automate\u002F57.pause-and-resume",{"title":165,"path":166,"stem":167,"device":6},"Error recovery","\u002Fhow-to\u002Fautomate\u002Fbasic-error-handling\u002F","02.how-to\u002F07.automate\u002F60.basic-error-handling",{"title":169,"path":170,"stem":171,"device":6},"Advanced error handling","\u002Fhow-to\u002Fautomate\u002Fadvanced-error-handling\u002F","02.how-to\u002F07.automate\u002F70.advanced-error-handling",{"title":173,"path":174,"stem":175,"device":6},"Emit lineage events","\u002Fhow-to\u002Fautomate\u002Femitting-lineage-events\u002F","02.how-to\u002F07.automate\u002F90.emitting-lineage-events",{"title":177,"device":6,"path":178,"stem":179,"children":180,"page":47},"Data","\u002Fhow-to\u002Fobserve\u002F","02.how-to\u002F08.observe",[181,185,189],{"title":182,"path":183,"stem":184,"device":6},"File System Connector","\u002Fhow-to\u002Fobserve\u002Ffilesystem-connector\u002F","02.how-to\u002F08.observe\u002F10.filesystem-connector",{"title":186,"path":187,"stem":188,"device":6},"Building an ETL","\u002Fhow-to\u002Fobserve\u002Fbuilding-an-etl\u002F","02.how-to\u002F08.observe\u002F20.building-an-etl",{"title":190,"path":191,"stem":192,"device":6},"Read lineage events","\u002Fhow-to\u002Fobserve\u002Freading-lineage-events\u002F","02.how-to\u002F08.observe\u002F30.reading-lineage-events",{"title":116,"device":6,"path":194,"stem":195,"children":196,"page":47},"\u002Fhow-to\u002Fplatform\u002F","02.how-to\u002F09.platform",[197],{"title":198,"path":199,"stem":200,"device":6},"UniteLabs Desktop","\u002Fhow-to\u002Fplatform\u002Funitelabs-desktop\u002F","02.how-to\u002F09.platform\u002F10.unitelabs-desktop",{"title":202,"device":6,"path":203,"stem":204,"children":205,"page":47},"Concepts","\u002Fconcepts\u002F","04.concepts",[206,244,268,317,356],{"title":207,"device":6,"path":208,"stem":209,"children":210,"page":47},"Labs as code","\u002Fconcepts\u002Flabs-as-code\u002F","04.concepts\u002F01.labs-as-code",[211,215,219],{"title":212,"path":213,"stem":214,"device":6},"Lab as Code","\u002Fconcepts\u002Flabs-as-code\u002Fwhy-code\u002F","04.concepts\u002F01.labs-as-code\u002F00.why-code",{"title":216,"path":217,"stem":218,"device":6},"How it works","\u002Fconcepts\u002Flabs-as-code\u002Fhow-it-works\u002F","04.concepts\u002F01.labs-as-code\u002F01.how-it-works",{"title":220,"device":6,"path":221,"stem":222,"children":223,"page":47},"Use Cases","\u002Fconcepts\u002Flabs-as-code\u002Fuse-cases\u002F","04.concepts\u002F01.labs-as-code\u002F02.use-cases",[224,228,232,236,240],{"title":225,"path":226,"stem":227,"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":229,"path":230,"stem":231,"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":233,"path":234,"stem":235,"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":237,"path":238,"stem":239,"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":241,"path":242,"stem":243,"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":70,"device":6,"path":245,"stem":246,"children":247,"page":47},"\u002Fconcepts\u002Fintegrate\u002F","04.concepts\u002F02.integrate",[248,252,256,260,264],{"title":249,"path":250,"stem":251,"device":6},"Device","\u002Fconcepts\u002Fintegrate\u002Fdevice\u002F","04.concepts\u002F02.integrate\u002F05.device",{"title":253,"path":254,"stem":255,"device":6},"Connector","\u002Fconcepts\u002Fintegrate\u002Fconnector\u002F","04.concepts\u002F02.integrate\u002F10.connector",{"title":257,"path":258,"stem":259,"device":6},"Module","\u002Fconcepts\u002Fintegrate\u002Fmodule\u002F","04.concepts\u002F02.integrate\u002F20.module",{"title":261,"path":262,"stem":263,"device":6},"Action","\u002Fconcepts\u002Fintegrate\u002Faction\u002F","04.concepts\u002F02.integrate\u002F30.action",{"title":265,"path":266,"stem":267,"device":6},"Subscription","\u002Fconcepts\u002Fintegrate\u002Fsubscription\u002F","04.concepts\u002F02.integrate\u002F40.subscription",{"title":269,"device":6,"path":270,"stem":271,"children":272,"page":47},"Liquid handling and robots","\u002Fconcepts\u002Foperate\u002F","04.concepts\u002F03.operate",[273,277,281,285,289,293,297,301,305,309,313],{"title":274,"path":275,"stem":276,"device":6},"Liquid Handling","\u002Fconcepts\u002Foperate\u002Fliquid-handling\u002F","04.concepts\u002F03.operate\u002F10.liquid-handling",{"title":278,"path":279,"stem":280,"device":6},"Modules","\u002Fconcepts\u002Foperate\u002Fmodules\u002F","04.concepts\u002F03.operate\u002F20.modules",{"title":282,"path":283,"stem":284,"device":6},"Deck","\u002Fconcepts\u002Foperate\u002Fdeck\u002F","04.concepts\u002F03.operate\u002F30.deck",{"title":286,"path":287,"stem":288,"device":6},"Labware","\u002Fconcepts\u002Foperate\u002Flabware\u002F","04.concepts\u002F03.operate\u002F40.labware",{"title":290,"path":291,"stem":292,"device":6},"Liquids","\u002Fconcepts\u002Foperate\u002Fliquids\u002F","04.concepts\u002F03.operate\u002F50.liquids",{"title":294,"path":295,"stem":296,"device":6},"Liquid Classes","\u002Fconcepts\u002Foperate\u002Fliquid-classes\u002F","04.concepts\u002F03.operate\u002F60.liquid-classes",{"title":298,"path":299,"stem":300,"device":6},"Parameter Sets","\u002Fconcepts\u002Foperate\u002Fparameter-sets\u002F","04.concepts\u002F03.operate\u002F65.parameter-sets",{"title":302,"path":303,"stem":304,"device":6},"Tips and Tip Tracking","\u002Fconcepts\u002Foperate\u002Ftips\u002F","04.concepts\u002F03.operate\u002F70.tips",{"title":306,"path":307,"stem":308,"device":6},"Simulation","\u002Fconcepts\u002Foperate\u002Fsimulation\u002F","04.concepts\u002F03.operate\u002F80.simulation",{"title":310,"path":311,"stem":312,"device":6},"Error Handling","\u002Fconcepts\u002Foperate\u002Ferror-handling\u002F","04.concepts\u002F03.operate\u002F90.error-handling",{"title":314,"path":315,"stem":316,"device":6},"Robot Arms","\u002Fconcepts\u002Foperate\u002Frobot-arms\u002F","04.concepts\u002F03.operate\u002F95.robot-arms",{"title":124,"device":6,"path":318,"stem":319,"children":320,"page":47},"\u002Fconcepts\u002Fautomate\u002F","04.concepts\u002F07.automate",[321,325,329,333,337,341,345,349,353],{"title":322,"path":323,"stem":324,"device":6},"Workflow","\u002Fconcepts\u002Fautomate\u002Fworkflow\u002F","04.concepts\u002F07.automate\u002F10.workflow",{"title":326,"path":327,"stem":328,"device":6},"Phase","\u002Fconcepts\u002Fautomate\u002Fphase\u002F","04.concepts\u002F07.automate\u002F20.phase",{"title":330,"path":331,"stem":332,"device":6},"Step","\u002Fconcepts\u002Fautomate\u002Fstep\u002F","04.concepts\u002F07.automate\u002F30.step",{"title":334,"path":335,"stem":336,"device":6},"Runs","\u002Fconcepts\u002Fautomate\u002Fruns\u002F","04.concepts\u002F07.automate\u002F40.runs",{"title":338,"path":339,"stem":340,"device":6},"Input","\u002Fconcepts\u002Fautomate\u002Finput\u002F","04.concepts\u002F07.automate\u002F50.input",{"title":342,"path":343,"stem":344,"device":6},"Artifacts","\u002Fconcepts\u002Fautomate\u002Fartifacts\u002F","04.concepts\u002F07.automate\u002F60.artifacts",{"title":346,"path":347,"stem":348,"device":6},"Logs","\u002Fconcepts\u002Fautomate\u002Flogs\u002F","04.concepts\u002F07.automate\u002F70.logs",{"title":350,"path":351,"stem":352,"device":6},"Human in the Loop","\u002Fconcepts\u002Fautomate\u002Fhuman-in-the-loop\u002F","04.concepts\u002F07.automate\u002F80.human-in-the-loop",{"title":310,"path":354,"stem":355,"device":6},"\u002Fconcepts\u002Fautomate\u002Ferror-handling\u002F","04.concepts\u002F07.automate\u002F90.error-handling",{"title":177,"device":6,"path":357,"stem":358,"children":359,"page":47},"\u002Fconcepts\u002Fobserve\u002F","04.concepts\u002F08.observe",[360,364,368,372,376],{"title":361,"path":362,"stem":363,"device":6},"Overview","\u002Fconcepts\u002Fobserve\u002Foverview\u002F","04.concepts\u002F08.observe\u002F10.overview",{"title":365,"path":366,"stem":367,"device":6},"Object Storage","\u002Fconcepts\u002Fobserve\u002Fstorage\u002F","04.concepts\u002F08.observe\u002F10.storage",{"title":369,"path":370,"stem":371,"device":6},"Secrets","\u002Fconcepts\u002Fobserve\u002Fsecrets\u002F","04.concepts\u002F08.observe\u002F20.secrets",{"title":373,"path":374,"stem":375,"device":6},"Data sources","\u002Fconcepts\u002Fobserve\u002Fdata-sources\u002F","04.concepts\u002F08.observe\u002F30.data-sources",{"title":377,"path":378,"stem":379,"device":6},"Data lineage","\u002Fconcepts\u002Fobserve\u002Fdata-lineage\u002F","04.concepts\u002F08.observe\u002F40.data-lineage",{"title":381,"device":6,"path":382,"stem":383,"children":384,"page":47},"Devices","\u002Fdevices\u002F","05.devices",[385,388,436,449,465,502,526],{"title":361,"path":386,"stem":387,"device":6},"\u002Fdevices\u002Foverview\u002F","05.devices\u002F00.overview",{"title":389,"path":390,"page":47,"children":391},"Heater-shakers","\u002Fdevices\u002Fheater-shakers\u002F",[392,413,423],{"title":393,"path":394,"stem":395,"device":396},"QInstruments BioShake","\u002Fdevices\u002Fqinstruments-bioshake\u002F","05.devices\u002F10.qinstruments-bioshake",{"slug":397,"vendor":398,"category":399,"connector":397,"package":400,"models":401,"communication":408,"vendor_software":6,"os":409},"qinstruments-bioshake","QInstruments","Plate Shakers & Temperature Control","unitelabs-qinstruments-bioshake",[402,403,404,405,406,407],"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)",[410,411,412],"windows","linux","macos",{"title":414,"path":415,"stem":416,"device":417},"QInstruments ColdPlate","\u002Fdevices\u002Fqinstruments-coldplate\u002F","05.devices\u002F20.qinstruments-coldplate",{"slug":418,"vendor":398,"category":399,"connector":397,"package":400,"models":419,"communication":408,"vendor_software":6,"os":422},"qinstruments-coldplate",[420,421],"ColdPlate","ColdPlate slim",[410,411,412],{"title":424,"path":425,"stem":426,"device":427},"Inheco Thermoshake","\u002Fdevices\u002Finheco-thermoshake\u002F","05.devices\u002F30.inheco-thermoshake",{"slug":428,"vendor":429,"category":399,"connector":430,"models":431},"inheco-thermoshake","Inheco","inheco-tec-controller",[432,433,434,435],"Thermoshake AC","Thermoshake AC LC","Thermoshake Classic","Thermoshake RM",{"title":437,"path":438,"page":47,"children":439},"Incubation","\u002Fdevices\u002Fincubation\u002F",[440],{"title":441,"path":442,"stem":443,"device":444},"Inheco SCILA","\u002Fdevices\u002Finheco-scila\u002F","05.devices\u002F40.inheco-scila",{"slug":445,"vendor":429,"category":437,"connector":445,"models":446},"inheco-scila",[447,448],"SCILA","SCILA MIX 2-gas mixing device",{"title":450,"path":451,"page":47,"children":452},"Thermal cyclers","\u002Fdevices\u002Fthermal-cyclers\u002F",[453],{"title":454,"path":455,"stem":456,"device":457},"Inheco ODTC","\u002Fdevices\u002Finheco-odtc\u002F","05.devices\u002F50.inheco-odtc",{"slug":458,"vendor":429,"category":459,"connector":458,"models":460},"inheco-odtc","Thermal Cycler",[461,462,463,464],"ODTC 96","ODTC 96XL","ODTC 384","ODTC 384XL",{"title":466,"path":467,"page":47,"children":468},"Readers","\u002Fdevices\u002Freaders\u002F",[469,478,487],{"title":470,"path":471,"stem":472,"device":473},"Agilent Biotek Gen5","\u002Fdevices\u002Fbiotek-gen5\u002F","05.devices\u002F60.biotek-gen5",{"slug":474,"vendor":475,"category":476,"connector":477},"biotek-gen5","Agilent","Readers & Imagers","gen5",{"title":479,"path":480,"stem":481,"device":482},"Biotek Synergy H1","\u002Fdevices\u002Fbiotek-synergy-h1\u002F","05.devices\u002F70.biotek-synergy-h1",{"slug":483,"vendor":475,"category":476,"connector":484,"models":485},"biotek-synergy-h1","agilent-synergy-h1",[486],"BioTek Synergy H1",{"title":488,"path":489,"stem":490,"device":491},"Tecan Infinite 200","\u002Fdevices\u002Ftecan-infinite-200\u002F","05.devices\u002F75.tecan-infinite-200",{"slug":492,"vendor":493,"category":476,"connector":492,"package":494,"models":495,"communication":499,"vendor_software":500,"os":501},"tecan-infinite-200","Tecan","unitelabs-tecan-infinite-200",[496,497,498],"Infinite F200","Infinite M200","Infinite M200 Pro","USB","i-control on Windows only, for its USB driver",[410,411,412],{"title":503,"path":504,"page":47,"children":505},"Tilt & turn","\u002Fdevices\u002Ftilt-and-turn\u002F",[506,516],{"title":507,"path":508,"stem":509,"device":510},"QInstruments TiltStation","\u002Fdevices\u002Fqinstruments-tiltstation\u002F","05.devices\u002F80.qinstruments-tiltstation",{"slug":511,"vendor":398,"category":512,"connector":397,"package":400,"models":513,"communication":408,"vendor_software":6,"os":515},"qinstruments-tiltstation","Plate Tilting",[514],"TiltStation",[410,411,412],{"title":517,"path":518,"stem":519,"device":520},"QInstruments TurnStation","\u002Fdevices\u002Fqinstruments-turnstation\u002F","05.devices\u002F90.qinstruments-turnstation",{"slug":521,"vendor":398,"category":522,"connector":397,"package":400,"models":523,"communication":408,"vendor_software":6,"os":525},"qinstruments-turnstation","Plate Rotating",[524],"TurnStation",[410,411,412],{"title":527,"path":528,"page":47,"children":529},"Robots","\u002Fdevices\u002Frobots\u002F",[530],{"title":531,"path":532,"stem":533,"device":534},"Brooks PreciseFlex 400","\u002Fdevices\u002Fbrooks-preciseflex-400\u002F","05.devices\u002F95.brooks-preciseflex-400",{"slug":535,"vendor":536,"category":527,"connector":535,"package":537,"models":538,"communication":542,"vendor_software":6,"os":543},"brooks-preciseflex-400","Brooks Automation","unitelabs-brooks-preciseflex-400",[539,540,541],"PreciseFlex 400, standard reach, 400 \u002F 750 \u002F 1160 mm Z","PreciseFlex 400, extended reach (XR), 400 \u002F 750 \u002F 1160 mm Z","Either on a PreciseFlex linear rail (1.0, 1.5 or 2.0 m)","Ethernet (TCP)",[410,411,412],{"title":545,"device":6,"path":546,"stem":547,"children":548,"page":47},"Liquid Handling and Robots","\u002Fliquid-handling-and-robots\u002F","06.liquid-handling-and-robots",[549,552,564,588,591,636,665,682,699,721],{"title":361,"path":550,"stem":551,"device":6},"\u002Fliquid-handling-and-robots\u002Foverview\u002F","06.liquid-handling-and-robots\u002F00.overview",{"title":282,"device":6,"path":553,"stem":554,"children":555,"page":47},"\u002Fliquid-handling-and-robots\u002Fdeck\u002F","06.liquid-handling-and-robots\u002F10.deck",[556,560],{"title":557,"path":558,"stem":559,"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":561,"path":562,"stem":563,"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":565,"device":6,"path":566,"stem":567,"children":568,"page":47},"Pipetting","\u002Fliquid-handling-and-robots\u002Fpipetting\u002F","06.liquid-handling-and-robots\u002F20.pipetting",[569,573,577,581,584],{"title":570,"path":571,"stem":572,"device":6},"Basic Pipetting","\u002Fliquid-handling-and-robots\u002Fpipetting\u002Fbasic-pipetting\u002F","06.liquid-handling-and-robots\u002F20.pipetting\u002F10.basic-pipetting",{"title":574,"path":575,"stem":576,"device":6},"Advanced Pipetting","\u002Fliquid-handling-and-robots\u002Fpipetting\u002Fadvanced-pipetting\u002F","06.liquid-handling-and-robots\u002F20.pipetting\u002F20.advanced-pipetting",{"title":578,"path":579,"stem":580,"device":6},"Tip Handling","\u002Fliquid-handling-and-robots\u002Fpipetting\u002Ftip-handling\u002F","06.liquid-handling-and-robots\u002F20.pipetting\u002F30.tip-handling",{"title":294,"path":582,"stem":583,"device":6},"\u002Fliquid-handling-and-robots\u002Fpipetting\u002Fliquid-classes\u002F","06.liquid-handling-and-robots\u002F20.pipetting\u002F40.liquid-classes",{"title":585,"path":586,"stem":587,"device":6},"Labware Transport","\u002Fliquid-handling-and-robots\u002Fpipetting\u002Flabware-transport\u002F","06.liquid-handling-and-robots\u002F20.pipetting\u002F50.labware-transport",{"title":306,"path":589,"stem":590,"device":6},"\u002Fliquid-handling-and-robots\u002Fsimulation\u002F","06.liquid-handling-and-robots\u002F30.simulation",{"title":592,"device":6,"path":593,"stem":594,"children":595,"page":47},"Hamilton STAR","\u002Fliquid-handling-and-robots\u002Fhamilton-star\u002F","06.liquid-handling-and-robots\u002F41.hamilton-star",[596,600,604,608,612,616,620,624,628,632],{"title":597,"path":598,"stem":599,"device":6},"Positioning & Movement","\u002Fliquid-handling-and-robots\u002Fhamilton-star\u002Fpositioning\u002F","06.liquid-handling-and-robots\u002F41.hamilton-star\u002F10.positioning",{"title":601,"path":602,"stem":603,"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":605,"path":606,"stem":607,"device":6},"iSWAP Module","\u002Fliquid-handling-and-robots\u002Fhamilton-star\u002Fiswap\u002F","06.liquid-handling-and-robots\u002F41.hamilton-star\u002F30.iswap",{"title":609,"path":610,"stem":611,"device":6},"Using TADM","\u002Fliquid-handling-and-robots\u002Fhamilton-star\u002Ftadm\u002F","06.liquid-handling-and-robots\u002F41.hamilton-star\u002F40.tadm",{"title":613,"path":614,"stem":615,"device":6},"Autoload Module","\u002Fliquid-handling-and-robots\u002Fhamilton-star\u002Fautoload\u002F","06.liquid-handling-and-robots\u002F41.hamilton-star\u002F50.autoload",{"title":617,"path":618,"stem":619,"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":621,"path":622,"stem":623,"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":625,"path":626,"stem":627,"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":629,"path":630,"stem":631,"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":633,"path":634,"stem":635,"device":6},"Observable Commands","\u002Fliquid-handling-and-robots\u002Fhamilton-star\u002Fobservable-commands\u002F","06.liquid-handling-and-robots\u002F41.hamilton-star\u002F80.observable-commands",{"title":637,"device":6,"path":638,"stem":639,"children":640,"page":47},"Hamilton Vantage","\u002Fliquid-handling-and-robots\u002Fhamilton-vantage\u002F","06.liquid-handling-and-robots\u002F42.hamilton-vantage",[641,645,649,653,657,661],{"title":642,"path":643,"stem":644,"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":646,"path":647,"stem":648,"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":650,"path":651,"stem":652,"device":6},"IDL Module","\u002Fliquid-handling-and-robots\u002Fhamilton-vantage\u002Fidl\u002F","06.liquid-handling-and-robots\u002F42.hamilton-vantage\u002F20.idl",{"title":654,"path":655,"stem":656,"device":6},"IPG Module","\u002Fliquid-handling-and-robots\u002Fhamilton-vantage\u002Fipg\u002F","06.liquid-handling-and-robots\u002F42.hamilton-vantage\u002F30.ipg",{"title":658,"path":659,"stem":660,"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":662,"path":663,"stem":664,"device":6},"CO-RE 96 Head","\u002Fliquid-handling-and-robots\u002Fhamilton-vantage\u002Fcore96-head\u002F","06.liquid-handling-and-robots\u002F42.hamilton-vantage\u002F50.core96-head",{"title":666,"device":6,"path":667,"stem":668,"children":669,"page":47},"Agilent Bravo","\u002Fliquid-handling-and-robots\u002Fagilent-bravo\u002F","06.liquid-handling-and-robots\u002F43.agilent-bravo",[670,673,676,679],{"title":578,"path":671,"stem":672,"device":6},"\u002Fliquid-handling-and-robots\u002Fagilent-bravo\u002Ftip-handling\u002F","06.liquid-handling-and-robots\u002F43.agilent-bravo\u002F10.tip-handling",{"title":570,"path":674,"stem":675,"device":6},"\u002Fliquid-handling-and-robots\u002Fagilent-bravo\u002Fbasic-pipetting\u002F","06.liquid-handling-and-robots\u002F43.agilent-bravo\u002F20.basic-pipetting",{"title":294,"path":677,"stem":678,"device":6},"\u002Fliquid-handling-and-robots\u002Fagilent-bravo\u002Fliquid-classes\u002F","06.liquid-handling-and-robots\u002F43.agilent-bravo\u002F25.liquid-classes",{"title":601,"path":680,"stem":681,"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":683,"device":6,"path":684,"stem":685,"children":686,"page":47},"Tecan FluentControl","\u002Fliquid-handling-and-robots\u002Ftecan-fluentcontrol\u002F","06.liquid-handling-and-robots\u002F44.tecan-fluentcontrol",[687,691,695],{"title":688,"path":689,"stem":690,"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":692,"path":693,"stem":694,"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":696,"path":697,"stem":698,"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":700,"device":6,"path":701,"stem":702,"children":703,"page":47},"Tecan Freedom EVO","\u002Fliquid-handling-and-robots\u002Ftecan-freedom-evo\u002F","06.liquid-handling-and-robots\u002F45.tecan-freedom-evo",[704,708,711,714,718],{"title":705,"path":706,"stem":707,"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":578,"path":709,"stem":710,"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":570,"path":712,"stem":713,"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":715,"path":716,"stem":717,"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":294,"path":719,"stem":720,"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":531,"device":6,"path":722,"stem":723,"children":724,"page":47},"\u002Fliquid-handling-and-robots\u002Fbrooks-preciseflex-400\u002F","06.liquid-handling-and-robots\u002F46.brooks-preciseflex-400",[725,729,733],{"title":726,"path":727,"stem":728,"device":6},"Teach Positions","\u002Fliquid-handling-and-robots\u002Fbrooks-preciseflex-400\u002Fteach-positions\u002F","06.liquid-handling-and-robots\u002F46.brooks-preciseflex-400\u002F10.teach-positions",{"title":730,"path":731,"stem":732,"device":6},"Move a Plate","\u002Fliquid-handling-and-robots\u002Fbrooks-preciseflex-400\u002Fmove-a-plate\u002F","06.liquid-handling-and-robots\u002F46.brooks-preciseflex-400\u002F20.move-a-plate",{"title":734,"path":735,"stem":736,"device":6},"Recover from a Stop","\u002Fliquid-handling-and-robots\u002Fbrooks-preciseflex-400\u002Frecover-from-a-stop\u002F","06.liquid-handling-and-robots\u002F46.brooks-preciseflex-400\u002F30.recover-from-a-stop",{"title":286,"device":6,"path":738,"stem":739,"children":740,"page":47},"\u002Flabware\u002F","07.labware",[741,744,748,752,756,760,764,768,772,781],{"title":361,"path":742,"stem":743,"device":6},"\u002Flabware\u002Foverview\u002F","07.labware\u002F00.overview",{"title":745,"path":746,"stem":747,"device":6},"Supported Labware","\u002Flabware\u002Fsupported-labware\u002F","07.labware\u002F05.supported-labware",{"title":749,"path":750,"stem":751,"device":6},"Standard Labware","\u002Flabware\u002Fstandard-labware\u002F","07.labware\u002F10.standard-labware",{"title":753,"path":754,"stem":755,"device":6},"Plates","\u002Flabware\u002Fplates\u002F","07.labware\u002F20.plates",{"title":757,"path":758,"stem":759,"device":6},"Tips and Tip Racks","\u002Flabware\u002Ftips-and-racks\u002F","07.labware\u002F30.tips-and-racks",{"title":761,"path":762,"stem":763,"device":6},"Tubes and Tube Racks","\u002Flabware\u002Ftubes-and-tube-racks\u002F","07.labware\u002F40.tubes-and-tube-racks",{"title":765,"path":766,"stem":767,"device":6},"Troughs","\u002Flabware\u002Ftroughs\u002F","07.labware\u002F50.troughs",{"title":769,"path":770,"stem":771,"device":6},"Carriers and Adapters","\u002Flabware\u002Fcarriers-and-adapters\u002F","07.labware\u002F60.carriers-and-adapters",{"title":773,"device":6,"path":774,"stem":775,"children":776,"page":47},"Hamilton","\u002Flabware\u002Fhamilton\u002F","07.labware\u002F70.hamilton",[777],{"title":778,"path":779,"stem":780,"device":6},"Hamilton MFX Carriers","\u002Flabware\u002Fhamilton\u002Fmfx-carriers\u002F","07.labware\u002F70.hamilton\u002F10.mfx-carriers",{"title":782,"path":783,"stem":784,"device":6},"Shapes","\u002Flabware\u002Fshapes\u002F","07.labware\u002F80.shapes",{"title":786,"device":6,"path":787,"stem":788,"children":789},"Connector Development (CDK)","\u002Fconnector-development\u002F","20.connector-development",[790,792,812,845,869,925],{"title":361,"path":787,"stem":791,"device":6},"20.connector-development\u002Findex",{"title":793,"path":794,"stem":795,"children":796,"page":47},"Getting Started","\u002Fconnector-development\u002Fgetting-started\u002F","20.connector-development\u002F10.getting-started",[797,800,804,808],{"title":361,"path":798,"stem":799,"device":6},"\u002Fconnector-development\u002Fgetting-started\u002Foverview\u002F","20.connector-development\u002F10.getting-started\u002F10.overview",{"title":801,"path":802,"stem":803,"device":6},"What's new","\u002Fconnector-development\u002Fgetting-started\u002Fwhats-new\u002F","20.connector-development\u002F10.getting-started\u002F20.whats-new",{"title":805,"path":806,"stem":807,"device":6},"Installation","\u002Fconnector-development\u002Fgetting-started\u002Finstallation\u002F","20.connector-development\u002F10.getting-started\u002F30.installation",{"title":809,"path":810,"stem":811,"device":6},"Contributing","\u002Fconnector-development\u002Fgetting-started\u002Fcontributing\u002F","20.connector-development\u002F10.getting-started\u002F40.contributing",{"title":813,"path":814,"stem":815,"children":816,"page":47},"Tutorial","\u002Fconnector-development\u002Ftutorial\u002F","20.connector-development\u002F20.tutorial",[817,821,825,829,833,837,841],{"title":818,"path":819,"stem":820,"device":6},"Walkthrough","\u002Fconnector-development\u002Ftutorial\u002Fwalkthrough\u002F","20.connector-development\u002F20.tutorial\u002F00.walkthrough",{"title":822,"path":823,"stem":824,"device":6},"SiLA Endpoints","\u002Fconnector-development\u002Ftutorial\u002Fsila-endpoints\u002F","20.connector-development\u002F20.tutorial\u002F15.sila-endpoints",{"title":826,"path":827,"stem":828,"device":6},"Data Endpoints","\u002Fconnector-development\u002Ftutorial\u002Fdata-endpoints\u002F","20.connector-development\u002F20.tutorial\u002F20.data-endpoints",{"title":830,"path":831,"stem":832,"device":6},"Controls","\u002Fconnector-development\u002Ftutorial\u002Fcontrols\u002F","20.connector-development\u002F20.tutorial\u002F30.controls",{"title":834,"path":835,"stem":836,"device":6},"SiLA Data Types","\u002Fconnector-development\u002Ftutorial\u002Fdata-types\u002F","20.connector-development\u002F20.tutorial\u002F40.data-types",{"title":838,"path":839,"stem":840,"device":6},"Hardware Communication","\u002Fconnector-development\u002Ftutorial\u002Fhardware-communication\u002F","20.connector-development\u002F20.tutorial\u002F90.hardware-communication",{"title":842,"path":843,"stem":844,"device":6},"Build a SiLA client","\u002Fconnector-development\u002Ftutorial\u002Fbuild-a-sila-client\u002F","20.connector-development\u002F20.tutorial\u002F95.build-a-sila-client",{"title":202,"device":6,"path":846,"stem":847,"children":848,"page":47},"\u002Fconnector-development\u002Fconcepts\u002F","20.connector-development\u002F30.concepts",[849,853,857,861,865],{"title":850,"path":851,"stem":852,"device":6},"SiLA","\u002Fconnector-development\u002Fconcepts\u002Fsila\u002F","20.connector-development\u002F30.concepts\u002F00.sila",{"title":854,"path":855,"stem":856,"device":6},"Designing Features","\u002Fconnector-development\u002Fconcepts\u002Ffeatures\u002F","20.connector-development\u002F30.concepts\u002F10.features",{"title":858,"path":859,"stem":860,"device":6},"Designing Endpoints","\u002Fconnector-development\u002Fconcepts\u002Fsila-endpoints\u002F","20.connector-development\u002F30.concepts\u002F15.sila-endpoints",{"title":862,"path":863,"stem":864,"device":6},"Designing Data Types","\u002Fconnector-development\u002Fconcepts\u002Fdata-types\u002F","20.connector-development\u002F30.concepts\u002F20.data-types",{"title":866,"path":867,"stem":868,"device":6},"Connector Architecture","\u002Fconnector-development\u002Fconcepts\u002Farchitecture\u002F","20.connector-development\u002F30.concepts\u002F30.architecture",{"title":870,"path":871,"stem":872,"children":873,"page":47},"Guides","\u002Fconnector-development\u002Fguides\u002F","20.connector-development\u002F40.guides",[874,878,882,886,890,894,898,902,906,910,914,917,921],{"title":875,"path":876,"stem":877,"device":6},"Project Structure","\u002Fconnector-development\u002Fguides\u002Fproject-structure\u002F","20.connector-development\u002F40.guides\u002F10.project-structure",{"title":879,"path":880,"stem":881,"device":6},"Configuration","\u002Fconnector-development\u002Fguides\u002Fconfiguration\u002F","20.connector-development\u002F40.guides\u002F20.configuration",{"title":883,"path":884,"stem":885,"device":6},"Logging","\u002Fconnector-development\u002Fguides\u002Flogging\u002F","20.connector-development\u002F40.guides\u002F21.logging",{"title":887,"path":888,"stem":889,"device":6},"Deployment","\u002Fconnector-development\u002Fguides\u002Fdeployment\u002F","20.connector-development\u002F40.guides\u002F30.deployment",{"title":891,"path":892,"stem":893,"device":6},"Security","\u002Fconnector-development\u002Fguides\u002Fsecurity\u002F","20.connector-development\u002F40.guides\u002F40.security",{"title":895,"path":896,"stem":897,"device":6},"Subscriptions","\u002Fconnector-development\u002Fguides\u002Fsubscriptions\u002F","20.connector-development\u002F40.guides\u002F45.subscriptions",{"title":899,"path":900,"stem":901,"device":6},"Execution Modes","\u002Fconnector-development\u002Fguides\u002Fexecution-modes\u002F","20.connector-development\u002F40.guides\u002F46.execution-modes",{"title":903,"path":904,"stem":905,"device":6},"Constraints and Units","\u002Fconnector-development\u002Fguides\u002Fconstraints-and-units\u002F","20.connector-development\u002F40.guides\u002F47.constraints-and-units",{"title":907,"path":908,"stem":909,"device":6},"Device Variants","\u002Fconnector-development\u002Fguides\u002Fdevice-variants\u002F","20.connector-development\u002F40.guides\u002F48.device-variants",{"title":911,"path":912,"stem":913,"device":6},"Repeated Modules","\u002Fconnector-development\u002Fguides\u002Frepeated-modules\u002F","20.connector-development\u002F40.guides\u002F49.repeated-modules",{"title":310,"path":915,"stem":916,"device":6},"\u002Fconnector-development\u002Fguides\u002Ferror-handling\u002F","20.connector-development\u002F40.guides\u002F50.error-handling",{"title":918,"path":919,"stem":920,"device":6},"Serial Troubleshooting","\u002Fconnector-development\u002Fguides\u002Fserial-troubleshooting\u002F","20.connector-development\u002F40.guides\u002F70.serial-troubleshooting",{"title":922,"path":923,"stem":924,"device":6},"Testing","\u002Fconnector-development\u002Fguides\u002Ftesting\u002F","20.connector-development\u002F40.guides\u002F80.testing",{"title":926,"device":6,"path":927,"stem":928,"children":929},"References","\u002Fconnector-development\u002Freference\u002F","20.connector-development\u002F50.reference\u002Findex",[930,931,935,939,943],{"title":926,"path":927,"stem":928,"device":6},{"title":932,"path":933,"stem":934,"device":6},"Naming Conventions","\u002Fconnector-development\u002Freference\u002Fnaming-conventions\u002F","20.connector-development\u002F50.reference\u002F10.naming-conventions",{"title":936,"path":937,"stem":938,"device":6},"Docstring Format","\u002Fconnector-development\u002Freference\u002Fdocstrings\u002F","20.connector-development\u002F50.reference\u002F20.docstrings",{"title":940,"path":941,"stem":942,"device":6},"Feature Metadata","\u002Fconnector-development\u002Freference\u002Ffeature-metadata\u002F","20.connector-development\u002F50.reference\u002F30.feature-metadata",{"title":944,"path":945,"stem":946,"device":6},"Review Checklist","\u002Fconnector-development\u002Freference\u002Freview-checklist\u002F","20.connector-development\u002F50.reference\u002F90.review-checklist",{"title":948,"device":6,"path":949,"stem":950,"children":951},"Blog","\u002Fblog\u002F","30.blog",[952,955],{"title":953,"path":949,"stem":954,"device":6},"UniteLabs Blog","30.blog\u002Findex",{"title":956,"path":957,"stem":958,"children":959,"page":47},"Python","\u002Fblog\u002Fpython\u002F","30.blog\u002F01.python",[960],{"title":961,"path":962,"stem":963,"device":6},"Python Environment and Project Management","\u002Fblog\u002Fpython\u002Fpython-environment-management\u002F","30.blog\u002F01.python\u002F10.python-environment-management",{"id":965,"title":141,"body":966,"description":3167,"device":6,"extension":3168,"links":6,"meta":3169,"navigation":1080,"path":3170,"seo":3171,"stem":143,"type":3172,"__hash__":3173},"docs\u002F02.how-to\u002F07.automate\u002F38.workflows-api.md",{"type":967,"value":968,"toc":3143},"minimark",[969,973,979,986,991,994,1219,1230,1233,1236,1241,1244,1558,1565,1610,1614,1713,1716,1744,1748,1868,1872,1875,2038,2040,2043,2047,2054,2263,2267,2315,2319,2412,2414,2418,2422,2446,2536,2540,2625,2629,2894,2896,2900,2907,2911,2959,2963,2973,3058,3062,3110,3123,3127,3139],[970,971,972],"p",{},"The UniteLabs REST API lets you manage the full workflow lifecycle programmatically — create and deploy workflows, trigger runs, monitor progress, and interact with paused runs.",[970,974,975],{},[976,977,978],"strong",{},"Prerequisites",[980,981,982],"ul",{},[983,984,985],"li",{},"A UniteLabs account with a tenant ID and API credentials (client ID + secret)",[987,988,990],"h2",{"id":989},"authentication","Authentication",[970,992,993],{},"All API requests require a Bearer token obtained via OAuth2:",[995,996,997,1056],"tabs",{},[998,999,1002],"div",{"icon":1000,"label":1001},"i-heroicons-command-line","curl",[1003,1004,1010],"pre",{"className":1005,"code":1006,"filename":1007,"language":1008,"meta":1009,"style":1009},"language-bash shiki shiki-themes github-light-high-contrast github-light-high-contrast github-dark-default","curl -X POST \"https:\u002F\u002Fauth.unitelabs.io\u002Frealms\u002F{tenant-id}\u002Fprotocol\u002Fopenid-connect\u002Ftoken\" \\\n  -H \"Content-Type: application\u002Fx-www-form-urlencoded\" \\\n  -d \"grant_type=client_credentials&client_id={client-id}&client_secret={client-secret}\"\n","Terminal","bash","",[1011,1012,1013,1036,1047],"code",{"__ignoreMap":1009},[1014,1015,1018,1021,1025,1029,1032],"span",{"class":1016,"line":1017},"line",1,[1014,1019,1001],{"class":1020},"sNqAu",[1014,1022,1024],{"class":1023},"sOiAX"," -X",[1014,1026,1028],{"class":1027},"sCx38"," POST",[1014,1030,1031],{"class":1027}," \"https:\u002F\u002Fauth.unitelabs.io\u002Frealms\u002F{tenant-id}\u002Fprotocol\u002Fopenid-connect\u002Ftoken\"",[1014,1033,1035],{"class":1034},"sxkbv"," \\\n",[1014,1037,1039,1042,1045],{"class":1016,"line":1038},2,[1014,1040,1041],{"class":1023},"  -H",[1014,1043,1044],{"class":1027}," \"Content-Type: application\u002Fx-www-form-urlencoded\"",[1014,1046,1035],{"class":1034},[1014,1048,1050,1053],{"class":1016,"line":1049},3,[1014,1051,1052],{"class":1023},"  -d",[1014,1054,1055],{"class":1027}," \"grant_type=client_credentials&client_id={client-id}&client_secret={client-secret}\"\n",[998,1057,1059],{"icon":1058,"label":956},"i-simple-icons-python",[1003,1060,1065],{"className":1061,"code":1062,"filename":1063,"language":1064,"meta":1009,"style":1009},"language-python shiki shiki-themes github-light-high-contrast github-light-high-contrast github-dark-default","import httpx\n\ntoken_response = httpx.post(\n    \"https:\u002F\u002Fauth.unitelabs.io\u002Frealms\u002F{tenant-id}\u002Fprotocol\u002Fopenid-connect\u002Ftoken\",\n    data={\n        \"grant_type\": \"client_credentials\",\n        \"client_id\": \"{client-id}\",\n        \"client_secret\": \"{client-secret}\",\n    },\n)\ntoken = token_response.json()[\"access_token\"]\nheaders = {\"Authorization\": f\"Bearer {token}\"}\n","auth.py","python",[1011,1066,1067,1076,1082,1093,1102,1113,1127,1140,1153,1159,1165,1182],{"__ignoreMap":1009},[1014,1068,1069,1072],{"class":1016,"line":1017},[1014,1070,1071],{"class":1034},"import",[1014,1073,1075],{"class":1074},"sc-9e"," httpx\n",[1014,1077,1078],{"class":1016,"line":1038},[1014,1079,1081],{"emptyLinePlaceholder":1080},true,"\n",[1014,1083,1084,1087,1090],{"class":1016,"line":1049},[1014,1085,1086],{"class":1074},"token_response ",[1014,1088,1089],{"class":1034},"=",[1014,1091,1092],{"class":1074}," httpx.post(\n",[1014,1094,1096,1099],{"class":1016,"line":1095},4,[1014,1097,1098],{"class":1027},"    \"https:\u002F\u002Fauth.unitelabs.io\u002Frealms\u002F{tenant-id}\u002Fprotocol\u002Fopenid-connect\u002Ftoken\"",[1014,1100,1101],{"class":1074},",\n",[1014,1103,1105,1108,1110],{"class":1016,"line":1104},5,[1014,1106,1107],{"class":1020},"    data",[1014,1109,1089],{"class":1034},[1014,1111,1112],{"class":1074},"{\n",[1014,1114,1116,1119,1122,1125],{"class":1016,"line":1115},6,[1014,1117,1118],{"class":1027},"        \"grant_type\"",[1014,1120,1121],{"class":1074},": ",[1014,1123,1124],{"class":1027},"\"client_credentials\"",[1014,1126,1101],{"class":1074},[1014,1128,1130,1133,1135,1138],{"class":1016,"line":1129},7,[1014,1131,1132],{"class":1027},"        \"client_id\"",[1014,1134,1121],{"class":1074},[1014,1136,1137],{"class":1027},"\"{client-id}\"",[1014,1139,1101],{"class":1074},[1014,1141,1143,1146,1148,1151],{"class":1016,"line":1142},8,[1014,1144,1145],{"class":1027},"        \"client_secret\"",[1014,1147,1121],{"class":1074},[1014,1149,1150],{"class":1027},"\"{client-secret}\"",[1014,1152,1101],{"class":1074},[1014,1154,1156],{"class":1016,"line":1155},9,[1014,1157,1158],{"class":1074},"    },\n",[1014,1160,1162],{"class":1016,"line":1161},10,[1014,1163,1164],{"class":1074},")\n",[1014,1166,1168,1171,1173,1176,1179],{"class":1016,"line":1167},11,[1014,1169,1170],{"class":1074},"token ",[1014,1172,1089],{"class":1034},[1014,1174,1175],{"class":1074}," token_response.json()[",[1014,1177,1178],{"class":1027},"\"access_token\"",[1014,1180,1181],{"class":1074},"]\n",[1014,1183,1185,1188,1190,1193,1196,1198,1201,1204,1207,1210,1213,1216],{"class":1016,"line":1184},12,[1014,1186,1187],{"class":1074},"headers ",[1014,1189,1089],{"class":1034},[1014,1191,1192],{"class":1074}," {",[1014,1194,1195],{"class":1027},"\"Authorization\"",[1014,1197,1121],{"class":1074},[1014,1199,1200],{"class":1034},"f",[1014,1202,1203],{"class":1027},"\"Bearer ",[1014,1205,1206],{"class":1034},"{",[1014,1208,1209],{"class":1074},"token",[1014,1211,1212],{"class":1034},"}",[1014,1214,1215],{"class":1027},"\"",[1014,1217,1218],{"class":1074},"}\n",[970,1220,1221,1222,1225,1226,1229],{},"All examples below assume ",[1011,1223,1224],{},"BASE_URL = \"https:\u002F\u002Fapi.unitelabs.io\u002F{tenant-id}\u002Fv1\""," and ",[1011,1227,1228],{},"headers"," set as above.",[1231,1232],"hr",{},[987,1234,124],{"id":1235},"workflows",[1237,1238,1240],"h3",{"id":1239},"create-a-workflow","Create a workflow",[970,1242,1243],{},"Register a new workflow. Upload files separately or as a ZIP in one shot.",[995,1245,1246,1338,1400],{},[998,1247,1249],{"icon":1000,"label":1248},"JSON body",[1003,1250,1252],{"className":1005,"code":1251,"filename":1007,"language":1008,"meta":1009,"style":1009},"curl -X POST \"$BASE_URL\u002Fworkflows\" \\\n  -H \"Authorization: Bearer $TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"name\": \"plate-qc-pipeline\",\n    \"description\": \"QC check before dispensing\",\n    \"entrypoint\": \"workflow.py:entrypoint\",\n    \"dependencies\": \"pandas,httpx\",\n    \"tags\": [\"qc\", \"production\"],\n    \"enabled\": true\n  }'\n",[1011,1253,1254,1273,1287,1296,1303,1308,1313,1318,1323,1328,1333],{"__ignoreMap":1009},[1014,1255,1256,1258,1260,1262,1265,1268,1271],{"class":1016,"line":1017},[1014,1257,1001],{"class":1020},[1014,1259,1024],{"class":1023},[1014,1261,1028],{"class":1027},[1014,1263,1264],{"class":1027}," \"",[1014,1266,1267],{"class":1074},"$BASE_URL",[1014,1269,1270],{"class":1027},"\u002Fworkflows\"",[1014,1272,1035],{"class":1034},[1014,1274,1275,1277,1280,1283,1285],{"class":1016,"line":1038},[1014,1276,1041],{"class":1023},[1014,1278,1279],{"class":1027}," \"Authorization: Bearer ",[1014,1281,1282],{"class":1074},"$TOKEN",[1014,1284,1215],{"class":1027},[1014,1286,1035],{"class":1034},[1014,1288,1289,1291,1294],{"class":1016,"line":1049},[1014,1290,1041],{"class":1023},[1014,1292,1293],{"class":1027}," \"Content-Type: application\u002Fjson\"",[1014,1295,1035],{"class":1034},[1014,1297,1298,1300],{"class":1016,"line":1095},[1014,1299,1052],{"class":1023},[1014,1301,1302],{"class":1027}," '{\n",[1014,1304,1305],{"class":1016,"line":1104},[1014,1306,1307],{"class":1027},"    \"name\": \"plate-qc-pipeline\",\n",[1014,1309,1310],{"class":1016,"line":1115},[1014,1311,1312],{"class":1027},"    \"description\": \"QC check before dispensing\",\n",[1014,1314,1315],{"class":1016,"line":1129},[1014,1316,1317],{"class":1027},"    \"entrypoint\": \"workflow.py:entrypoint\",\n",[1014,1319,1320],{"class":1016,"line":1142},[1014,1321,1322],{"class":1027},"    \"dependencies\": \"pandas,httpx\",\n",[1014,1324,1325],{"class":1016,"line":1155},[1014,1326,1327],{"class":1027},"    \"tags\": [\"qc\", \"production\"],\n",[1014,1329,1330],{"class":1016,"line":1161},[1014,1331,1332],{"class":1027},"    \"enabled\": true\n",[1014,1334,1335],{"class":1016,"line":1167},[1014,1336,1337],{"class":1027},"  }'\n",[998,1339,1341],{"icon":1000,"label":1340},"ZIP upload",[1003,1342,1344],{"className":1005,"code":1343,"filename":1007,"language":1008,"meta":1009,"style":1009},"curl -X POST \"$BASE_URL\u002Fworkflows\" \\\n  -H \"Authorization: Bearer $TOKEN\" \\\n  -F \"name=plate-qc-pipeline\" \\\n  -F \"entrypoint=workflow.py:entrypoint\" \\\n  -F \"file=@workflow.zip\"\n",[1011,1345,1346,1362,1374,1384,1393],{"__ignoreMap":1009},[1014,1347,1348,1350,1352,1354,1356,1358,1360],{"class":1016,"line":1017},[1014,1349,1001],{"class":1020},[1014,1351,1024],{"class":1023},[1014,1353,1028],{"class":1027},[1014,1355,1264],{"class":1027},[1014,1357,1267],{"class":1074},[1014,1359,1270],{"class":1027},[1014,1361,1035],{"class":1034},[1014,1363,1364,1366,1368,1370,1372],{"class":1016,"line":1038},[1014,1365,1041],{"class":1023},[1014,1367,1279],{"class":1027},[1014,1369,1282],{"class":1074},[1014,1371,1215],{"class":1027},[1014,1373,1035],{"class":1034},[1014,1375,1376,1379,1382],{"class":1016,"line":1049},[1014,1377,1378],{"class":1023},"  -F",[1014,1380,1381],{"class":1027}," \"name=plate-qc-pipeline\"",[1014,1383,1035],{"class":1034},[1014,1385,1386,1388,1391],{"class":1016,"line":1095},[1014,1387,1378],{"class":1023},[1014,1389,1390],{"class":1027}," \"entrypoint=workflow.py:entrypoint\"",[1014,1392,1035],{"class":1034},[1014,1394,1395,1397],{"class":1016,"line":1104},[1014,1396,1378],{"class":1023},[1014,1398,1399],{"class":1027}," \"file=@workflow.zip\"\n",[998,1401,1402],{"icon":1058,"label":956},[1003,1403,1406],{"className":1061,"code":1404,"filename":1405,"language":1064,"meta":1009,"style":1009},"response = httpx.post(\n    f\"{BASE_URL}\u002Fworkflows\",\n    headers=headers,\n    json={\n        \"name\": \"plate-qc-pipeline\",\n        \"description\": \"QC check before dispensing\",\n        \"entrypoint\": \"workflow.py:entrypoint\",\n        \"dependencies\": \"pandas,httpx\",\n        \"tags\": [\"qc\", \"production\"],\n        \"enabled\": True,\n    },\n)\nworkflow_id = response.json()[\"id\"]\n","create_workflow.py",[1011,1407,1408,1417,1435,1445,1454,1466,1478,1490,1502,1522,1534,1538,1542],{"__ignoreMap":1009},[1014,1409,1410,1413,1415],{"class":1016,"line":1017},[1014,1411,1412],{"class":1074},"response ",[1014,1414,1089],{"class":1034},[1014,1416,1092],{"class":1074},[1014,1418,1419,1422,1424,1426,1429,1431,1433],{"class":1016,"line":1038},[1014,1420,1421],{"class":1034},"    f",[1014,1423,1215],{"class":1027},[1014,1425,1206],{"class":1034},[1014,1427,1428],{"class":1023},"BASE_URL",[1014,1430,1212],{"class":1034},[1014,1432,1270],{"class":1027},[1014,1434,1101],{"class":1074},[1014,1436,1437,1440,1442],{"class":1016,"line":1049},[1014,1438,1439],{"class":1020},"    headers",[1014,1441,1089],{"class":1034},[1014,1443,1444],{"class":1074},"headers,\n",[1014,1446,1447,1450,1452],{"class":1016,"line":1095},[1014,1448,1449],{"class":1020},"    json",[1014,1451,1089],{"class":1034},[1014,1453,1112],{"class":1074},[1014,1455,1456,1459,1461,1464],{"class":1016,"line":1104},[1014,1457,1458],{"class":1027},"        \"name\"",[1014,1460,1121],{"class":1074},[1014,1462,1463],{"class":1027},"\"plate-qc-pipeline\"",[1014,1465,1101],{"class":1074},[1014,1467,1468,1471,1473,1476],{"class":1016,"line":1115},[1014,1469,1470],{"class":1027},"        \"description\"",[1014,1472,1121],{"class":1074},[1014,1474,1475],{"class":1027},"\"QC check before dispensing\"",[1014,1477,1101],{"class":1074},[1014,1479,1480,1483,1485,1488],{"class":1016,"line":1129},[1014,1481,1482],{"class":1027},"        \"entrypoint\"",[1014,1484,1121],{"class":1074},[1014,1486,1487],{"class":1027},"\"workflow.py:entrypoint\"",[1014,1489,1101],{"class":1074},[1014,1491,1492,1495,1497,1500],{"class":1016,"line":1142},[1014,1493,1494],{"class":1027},"        \"dependencies\"",[1014,1496,1121],{"class":1074},[1014,1498,1499],{"class":1027},"\"pandas,httpx\"",[1014,1501,1101],{"class":1074},[1014,1503,1504,1507,1510,1513,1516,1519],{"class":1016,"line":1155},[1014,1505,1506],{"class":1027},"        \"tags\"",[1014,1508,1509],{"class":1074},": [",[1014,1511,1512],{"class":1027},"\"qc\"",[1014,1514,1515],{"class":1074},", ",[1014,1517,1518],{"class":1027},"\"production\"",[1014,1520,1521],{"class":1074},"],\n",[1014,1523,1524,1527,1529,1532],{"class":1016,"line":1161},[1014,1525,1526],{"class":1027},"        \"enabled\"",[1014,1528,1121],{"class":1074},[1014,1530,1531],{"class":1023},"True",[1014,1533,1101],{"class":1074},[1014,1535,1536],{"class":1016,"line":1167},[1014,1537,1158],{"class":1074},[1014,1539,1540],{"class":1016,"line":1184},[1014,1541,1164],{"class":1074},[1014,1543,1545,1548,1550,1553,1556],{"class":1016,"line":1544},13,[1014,1546,1547],{"class":1074},"workflow_id ",[1014,1549,1089],{"class":1034},[1014,1551,1552],{"class":1074}," response.json()[",[1014,1554,1555],{"class":1027},"\"id\"",[1014,1557,1181],{"class":1074},[970,1559,1560,1561,1564],{},"Response ",[1011,1562,1563],{},"201",":",[1003,1566,1570],{"className":1567,"code":1568,"language":1569,"meta":1009,"style":1009},"language-json shiki shiki-themes github-light-high-contrast github-light-high-contrast github-dark-default","{\n  \"id\": \"d81023e8-87ab-4c9e-8394-0fc10ab562f3\",\n  \"name\": \"plate-qc-pipeline\",\n  \"entrypoint\": \"workflow.py:entrypoint\",\n  \"dependencies\": \"pandas,httpx\",\n  \"tags\": [\"qc\", \"production\"],\n  \"enabled\": true\n}\n","json",[1011,1571,1572,1576,1581,1586,1591,1596,1601,1606],{"__ignoreMap":1009},[1014,1573,1574],{"class":1016,"line":1017},[1014,1575,1112],{},[1014,1577,1578],{"class":1016,"line":1038},[1014,1579,1580],{},"  \"id\": \"d81023e8-87ab-4c9e-8394-0fc10ab562f3\",\n",[1014,1582,1583],{"class":1016,"line":1049},[1014,1584,1585],{},"  \"name\": \"plate-qc-pipeline\",\n",[1014,1587,1588],{"class":1016,"line":1095},[1014,1589,1590],{},"  \"entrypoint\": \"workflow.py:entrypoint\",\n",[1014,1592,1593],{"class":1016,"line":1104},[1014,1594,1595],{},"  \"dependencies\": \"pandas,httpx\",\n",[1014,1597,1598],{"class":1016,"line":1115},[1014,1599,1600],{},"  \"tags\": [\"qc\", \"production\"],\n",[1014,1602,1603],{"class":1016,"line":1129},[1014,1604,1605],{},"  \"enabled\": true\n",[1014,1607,1608],{"class":1016,"line":1142},[1014,1609,1218],{},[1237,1611,1613],{"id":1612},"list-workflows","List workflows",[1003,1615,1617],{"className":1005,"code":1616,"filename":1007,"language":1008,"meta":1009,"style":1009},"# Most recent 10, sorted by creation date\ncurl \"$BASE_URL\u002Fworkflows?_take=10&_sort=-createdAt\" \\\n  -H \"Authorization: Bearer $TOKEN\"\n\n# Filter by name (partial match)\ncurl \"$BASE_URL\u002Fworkflows?name[like]=plate\" \\\n  -H \"Authorization: Bearer $TOKEN\"\n\n# Include recent runs in the response\ncurl \"$BASE_URL\u002Fworkflows?_include[]=recentRuns\" \\\n  -H \"Authorization: Bearer $TOKEN\"\n",[1011,1618,1619,1625,1638,1649,1653,1658,1671,1681,1685,1690,1703],{"__ignoreMap":1009},[1014,1620,1621],{"class":1016,"line":1017},[1014,1622,1624],{"class":1623},"sIsDC","# Most recent 10, sorted by creation date\n",[1014,1626,1627,1629,1631,1633,1636],{"class":1016,"line":1038},[1014,1628,1001],{"class":1020},[1014,1630,1264],{"class":1027},[1014,1632,1267],{"class":1074},[1014,1634,1635],{"class":1027},"\u002Fworkflows?_take=10&_sort=-createdAt\"",[1014,1637,1035],{"class":1034},[1014,1639,1640,1642,1644,1646],{"class":1016,"line":1049},[1014,1641,1041],{"class":1023},[1014,1643,1279],{"class":1027},[1014,1645,1282],{"class":1074},[1014,1647,1648],{"class":1027},"\"\n",[1014,1650,1651],{"class":1016,"line":1095},[1014,1652,1081],{"emptyLinePlaceholder":1080},[1014,1654,1655],{"class":1016,"line":1104},[1014,1656,1657],{"class":1623},"# Filter by name (partial match)\n",[1014,1659,1660,1662,1664,1666,1669],{"class":1016,"line":1115},[1014,1661,1001],{"class":1020},[1014,1663,1264],{"class":1027},[1014,1665,1267],{"class":1074},[1014,1667,1668],{"class":1027},"\u002Fworkflows?name[like]=plate\"",[1014,1670,1035],{"class":1034},[1014,1672,1673,1675,1677,1679],{"class":1016,"line":1129},[1014,1674,1041],{"class":1023},[1014,1676,1279],{"class":1027},[1014,1678,1282],{"class":1074},[1014,1680,1648],{"class":1027},[1014,1682,1683],{"class":1016,"line":1142},[1014,1684,1081],{"emptyLinePlaceholder":1080},[1014,1686,1687],{"class":1016,"line":1155},[1014,1688,1689],{"class":1623},"# Include recent runs in the response\n",[1014,1691,1692,1694,1696,1698,1701],{"class":1016,"line":1161},[1014,1693,1001],{"class":1020},[1014,1695,1264],{"class":1027},[1014,1697,1267],{"class":1074},[1014,1699,1700],{"class":1027},"\u002Fworkflows?_include[]=recentRuns\"",[1014,1702,1035],{"class":1034},[1014,1704,1705,1707,1709,1711],{"class":1016,"line":1167},[1014,1706,1041],{"class":1023},[1014,1708,1279],{"class":1027},[1014,1710,1282],{"class":1074},[1014,1712,1648],{"class":1027},[970,1714,1715],{},"Paginate using the cursor from the previous response:",[1003,1717,1719],{"className":1005,"code":1718,"filename":1007,"language":1008,"meta":1009,"style":1009},"curl \"$BASE_URL\u002Fworkflows?_take=20&_cursor=eyJpZCI6Ii4uLiJ9\" \\\n  -H \"Authorization: Bearer $TOKEN\"\n",[1011,1720,1721,1734],{"__ignoreMap":1009},[1014,1722,1723,1725,1727,1729,1732],{"class":1016,"line":1017},[1014,1724,1001],{"class":1020},[1014,1726,1264],{"class":1027},[1014,1728,1267],{"class":1074},[1014,1730,1731],{"class":1027},"\u002Fworkflows?_take=20&_cursor=eyJpZCI6Ii4uLiJ9\"",[1014,1733,1035],{"class":1034},[1014,1735,1736,1738,1740,1742],{"class":1016,"line":1038},[1014,1737,1041],{"class":1023},[1014,1739,1279],{"class":1027},[1014,1741,1282],{"class":1074},[1014,1743,1648],{"class":1027},[1237,1745,1747],{"id":1746},"get-update-delete","Get, update, delete",[1003,1749,1751],{"className":1005,"code":1750,"filename":1007,"language":1008,"meta":1009,"style":1009},"# Get\ncurl \"$BASE_URL\u002Fworkflows\u002F{workflowId}\" -H \"Authorization: Bearer $TOKEN\"\n\n# Update (partial — only include fields to change)\ncurl -X PATCH \"$BASE_URL\u002Fworkflows\u002F{workflowId}\" \\\n  -H \"Authorization: Bearer $TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"enabled\": false, \"tags\": [\"qc\", \"staging\"]}'\n\n# Delete\ncurl -X DELETE \"$BASE_URL\u002Fworkflows\u002F{workflowId}\" -H \"Authorization: Bearer $TOKEN\"\n# Returns 204 No Content\n",[1011,1752,1753,1758,1778,1782,1787,1804,1816,1824,1831,1835,1840,1863],{"__ignoreMap":1009},[1014,1754,1755],{"class":1016,"line":1017},[1014,1756,1757],{"class":1623},"# Get\n",[1014,1759,1760,1762,1764,1766,1769,1772,1774,1776],{"class":1016,"line":1038},[1014,1761,1001],{"class":1020},[1014,1763,1264],{"class":1027},[1014,1765,1267],{"class":1074},[1014,1767,1768],{"class":1027},"\u002Fworkflows\u002F{workflowId}\"",[1014,1770,1771],{"class":1023}," -H",[1014,1773,1279],{"class":1027},[1014,1775,1282],{"class":1074},[1014,1777,1648],{"class":1027},[1014,1779,1780],{"class":1016,"line":1049},[1014,1781,1081],{"emptyLinePlaceholder":1080},[1014,1783,1784],{"class":1016,"line":1095},[1014,1785,1786],{"class":1623},"# Update (partial — only include fields to change)\n",[1014,1788,1789,1791,1793,1796,1798,1800,1802],{"class":1016,"line":1104},[1014,1790,1001],{"class":1020},[1014,1792,1024],{"class":1023},[1014,1794,1795],{"class":1027}," PATCH",[1014,1797,1264],{"class":1027},[1014,1799,1267],{"class":1074},[1014,1801,1768],{"class":1027},[1014,1803,1035],{"class":1034},[1014,1805,1806,1808,1810,1812,1814],{"class":1016,"line":1115},[1014,1807,1041],{"class":1023},[1014,1809,1279],{"class":1027},[1014,1811,1282],{"class":1074},[1014,1813,1215],{"class":1027},[1014,1815,1035],{"class":1034},[1014,1817,1818,1820,1822],{"class":1016,"line":1129},[1014,1819,1041],{"class":1023},[1014,1821,1293],{"class":1027},[1014,1823,1035],{"class":1034},[1014,1825,1826,1828],{"class":1016,"line":1142},[1014,1827,1052],{"class":1023},[1014,1829,1830],{"class":1027}," '{\"enabled\": false, \"tags\": [\"qc\", \"staging\"]}'\n",[1014,1832,1833],{"class":1016,"line":1155},[1014,1834,1081],{"emptyLinePlaceholder":1080},[1014,1836,1837],{"class":1016,"line":1161},[1014,1838,1839],{"class":1623},"# Delete\n",[1014,1841,1842,1844,1846,1849,1851,1853,1855,1857,1859,1861],{"class":1016,"line":1167},[1014,1843,1001],{"class":1020},[1014,1845,1024],{"class":1023},[1014,1847,1848],{"class":1027}," DELETE",[1014,1850,1264],{"class":1027},[1014,1852,1267],{"class":1074},[1014,1854,1768],{"class":1027},[1014,1856,1771],{"class":1023},[1014,1858,1279],{"class":1027},[1014,1860,1282],{"class":1074},[1014,1862,1648],{"class":1027},[1014,1864,1865],{"class":1016,"line":1184},[1014,1866,1867],{"class":1623},"# Returns 204 No Content\n",[1237,1869,1871],{"id":1870},"upload-workflow-files","Upload workflow files",[970,1873,1874],{},"Add or update individual source files without redeploying the whole workflow:",[1003,1876,1878],{"className":1005,"code":1877,"filename":1007,"language":1008,"meta":1009,"style":1009},"# Create a file\ncurl -X POST \"$BASE_URL\u002Fworkflows\u002F{workflowId}\u002Ffiles\" \\\n  -H \"Authorization: Bearer $TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"name\": \"workflow.py\",\n    \"path\": \"\u002F\",\n    \"type\": \"file\",\n    \"content\": \"from unitelabs.sdk.automate import workflow\\n\\n@workflow  # workflow\\nasync def entrypoint():\\n    pass\\n\"\n  }'\n\n# Update a file\ncurl -X PATCH \"$BASE_URL\u002Fworkflows\u002F{workflowId}\u002Ffiles\u002Fworkflow.py\" \\\n  -H \"Authorization: Bearer $TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"content\": \"# updated content\\n\"}'\n\n# List all files\ncurl \"$BASE_URL\u002Fworkflows\u002F{workflowId}\u002Ffiles\" -H \"Authorization: Bearer $TOKEN\"\n",[1011,1879,1880,1885,1902,1914,1922,1928,1933,1938,1943,1948,1952,1956,1961,1978,1991,2000,2008,2013,2019],{"__ignoreMap":1009},[1014,1881,1882],{"class":1016,"line":1017},[1014,1883,1884],{"class":1623},"# Create a file\n",[1014,1886,1887,1889,1891,1893,1895,1897,1900],{"class":1016,"line":1038},[1014,1888,1001],{"class":1020},[1014,1890,1024],{"class":1023},[1014,1892,1028],{"class":1027},[1014,1894,1264],{"class":1027},[1014,1896,1267],{"class":1074},[1014,1898,1899],{"class":1027},"\u002Fworkflows\u002F{workflowId}\u002Ffiles\"",[1014,1901,1035],{"class":1034},[1014,1903,1904,1906,1908,1910,1912],{"class":1016,"line":1049},[1014,1905,1041],{"class":1023},[1014,1907,1279],{"class":1027},[1014,1909,1282],{"class":1074},[1014,1911,1215],{"class":1027},[1014,1913,1035],{"class":1034},[1014,1915,1916,1918,1920],{"class":1016,"line":1095},[1014,1917,1041],{"class":1023},[1014,1919,1293],{"class":1027},[1014,1921,1035],{"class":1034},[1014,1923,1924,1926],{"class":1016,"line":1104},[1014,1925,1052],{"class":1023},[1014,1927,1302],{"class":1027},[1014,1929,1930],{"class":1016,"line":1115},[1014,1931,1932],{"class":1027},"    \"name\": \"workflow.py\",\n",[1014,1934,1935],{"class":1016,"line":1129},[1014,1936,1937],{"class":1027},"    \"path\": \"\u002F\",\n",[1014,1939,1940],{"class":1016,"line":1142},[1014,1941,1942],{"class":1027},"    \"type\": \"file\",\n",[1014,1944,1945],{"class":1016,"line":1155},[1014,1946,1947],{"class":1027},"    \"content\": \"from unitelabs.sdk.automate import workflow\\n\\n@workflow  # workflow\\nasync def entrypoint():\\n    pass\\n\"\n",[1014,1949,1950],{"class":1016,"line":1161},[1014,1951,1337],{"class":1027},[1014,1953,1954],{"class":1016,"line":1167},[1014,1955,1081],{"emptyLinePlaceholder":1080},[1014,1957,1958],{"class":1016,"line":1184},[1014,1959,1960],{"class":1623},"# Update a file\n",[1014,1962,1963,1965,1967,1969,1971,1973,1976],{"class":1016,"line":1544},[1014,1964,1001],{"class":1020},[1014,1966,1024],{"class":1023},[1014,1968,1795],{"class":1027},[1014,1970,1264],{"class":1027},[1014,1972,1267],{"class":1074},[1014,1974,1975],{"class":1027},"\u002Fworkflows\u002F{workflowId}\u002Ffiles\u002Fworkflow.py\"",[1014,1977,1035],{"class":1034},[1014,1979,1981,1983,1985,1987,1989],{"class":1016,"line":1980},14,[1014,1982,1041],{"class":1023},[1014,1984,1279],{"class":1027},[1014,1986,1282],{"class":1074},[1014,1988,1215],{"class":1027},[1014,1990,1035],{"class":1034},[1014,1992,1994,1996,1998],{"class":1016,"line":1993},15,[1014,1995,1041],{"class":1023},[1014,1997,1293],{"class":1027},[1014,1999,1035],{"class":1034},[1014,2001,2003,2005],{"class":1016,"line":2002},16,[1014,2004,1052],{"class":1023},[1014,2006,2007],{"class":1027}," '{\"content\": \"# updated content\\n\"}'\n",[1014,2009,2011],{"class":1016,"line":2010},17,[1014,2012,1081],{"emptyLinePlaceholder":1080},[1014,2014,2016],{"class":1016,"line":2015},18,[1014,2017,2018],{"class":1623},"# List all files\n",[1014,2020,2022,2024,2026,2028,2030,2032,2034,2036],{"class":1016,"line":2021},19,[1014,2023,1001],{"class":1020},[1014,2025,1264],{"class":1027},[1014,2027,1267],{"class":1074},[1014,2029,1899],{"class":1027},[1014,2031,1771],{"class":1023},[1014,2033,1279],{"class":1027},[1014,2035,1282],{"class":1074},[1014,2037,1648],{"class":1027},[1231,2039],{},[987,2041,334],{"id":2042},"runs",[1237,2044,2046],{"id":2045},"create-a-run","Create a run",[970,2048,2049,2050,2053],{},"Start a workflow by its ID. Pass ",[1011,2051,2052],{},"parameters"," to supply runtime values to the workflow function:",[995,2055,2056,2135],{},[998,2057,2058],{"icon":1000,"label":1001},[1003,2059,2061],{"className":1005,"code":2060,"filename":1007,"language":1008,"meta":1009,"style":1009},"curl -X POST \"$BASE_URL\u002Fworkflows\u002F{workflowId}\u002Fruns\" \\\n  -H \"Authorization: Bearer $TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"name\": \"QC Run — Plate B3\",\n    \"parameters\": {\n      \"sample_id\": \"B3\",\n      \"min_concentration\": 250.0\n    }\n  }'\n",[1011,2062,2063,2080,2092,2100,2106,2111,2116,2121,2126,2131],{"__ignoreMap":1009},[1014,2064,2065,2067,2069,2071,2073,2075,2078],{"class":1016,"line":1017},[1014,2066,1001],{"class":1020},[1014,2068,1024],{"class":1023},[1014,2070,1028],{"class":1027},[1014,2072,1264],{"class":1027},[1014,2074,1267],{"class":1074},[1014,2076,2077],{"class":1027},"\u002Fworkflows\u002F{workflowId}\u002Fruns\"",[1014,2079,1035],{"class":1034},[1014,2081,2082,2084,2086,2088,2090],{"class":1016,"line":1038},[1014,2083,1041],{"class":1023},[1014,2085,1279],{"class":1027},[1014,2087,1282],{"class":1074},[1014,2089,1215],{"class":1027},[1014,2091,1035],{"class":1034},[1014,2093,2094,2096,2098],{"class":1016,"line":1049},[1014,2095,1041],{"class":1023},[1014,2097,1293],{"class":1027},[1014,2099,1035],{"class":1034},[1014,2101,2102,2104],{"class":1016,"line":1095},[1014,2103,1052],{"class":1023},[1014,2105,1302],{"class":1027},[1014,2107,2108],{"class":1016,"line":1104},[1014,2109,2110],{"class":1027},"    \"name\": \"QC Run — Plate B3\",\n",[1014,2112,2113],{"class":1016,"line":1115},[1014,2114,2115],{"class":1027},"    \"parameters\": {\n",[1014,2117,2118],{"class":1016,"line":1129},[1014,2119,2120],{"class":1027},"      \"sample_id\": \"B3\",\n",[1014,2122,2123],{"class":1016,"line":1142},[1014,2124,2125],{"class":1027},"      \"min_concentration\": 250.0\n",[1014,2127,2128],{"class":1016,"line":1155},[1014,2129,2130],{"class":1027},"    }\n",[1014,2132,2133],{"class":1016,"line":1161},[1014,2134,1337],{"class":1027},[998,2136,2137],{"icon":1058,"label":956},[1003,2138,2141],{"className":1061,"code":2139,"filename":2140,"language":1064,"meta":1009,"style":1009},"response = httpx.post(\n    f\"{BASE_URL}\u002Fworkflows\u002F{workflow_id}\u002Fruns\",\n    headers=headers,\n    json={\n        \"name\": \"QC Run — Plate B3\",\n        \"parameters\": {\n            \"sample_id\": \"B3\",\n            \"min_concentration\": 250.0,\n        },\n    },\n)\nrun_id = response.json()[\"id\"]\n","trigger_run.py",[1011,2142,2143,2151,2178,2186,2194,2205,2213,2225,2237,2242,2246,2250],{"__ignoreMap":1009},[1014,2144,2145,2147,2149],{"class":1016,"line":1017},[1014,2146,1412],{"class":1074},[1014,2148,1089],{"class":1034},[1014,2150,1092],{"class":1074},[1014,2152,2153,2155,2157,2159,2161,2163,2166,2168,2171,2173,2176],{"class":1016,"line":1038},[1014,2154,1421],{"class":1034},[1014,2156,1215],{"class":1027},[1014,2158,1206],{"class":1034},[1014,2160,1428],{"class":1023},[1014,2162,1212],{"class":1034},[1014,2164,2165],{"class":1027},"\u002Fworkflows\u002F",[1014,2167,1206],{"class":1034},[1014,2169,2170],{"class":1074},"workflow_id",[1014,2172,1212],{"class":1034},[1014,2174,2175],{"class":1027},"\u002Fruns\"",[1014,2177,1101],{"class":1074},[1014,2179,2180,2182,2184],{"class":1016,"line":1049},[1014,2181,1439],{"class":1020},[1014,2183,1089],{"class":1034},[1014,2185,1444],{"class":1074},[1014,2187,2188,2190,2192],{"class":1016,"line":1095},[1014,2189,1449],{"class":1020},[1014,2191,1089],{"class":1034},[1014,2193,1112],{"class":1074},[1014,2195,2196,2198,2200,2203],{"class":1016,"line":1104},[1014,2197,1458],{"class":1027},[1014,2199,1121],{"class":1074},[1014,2201,2202],{"class":1027},"\"QC Run — Plate B3\"",[1014,2204,1101],{"class":1074},[1014,2206,2207,2210],{"class":1016,"line":1115},[1014,2208,2209],{"class":1027},"        \"parameters\"",[1014,2211,2212],{"class":1074},": {\n",[1014,2214,2215,2218,2220,2223],{"class":1016,"line":1129},[1014,2216,2217],{"class":1027},"            \"sample_id\"",[1014,2219,1121],{"class":1074},[1014,2221,2222],{"class":1027},"\"B3\"",[1014,2224,1101],{"class":1074},[1014,2226,2227,2230,2232,2235],{"class":1016,"line":1142},[1014,2228,2229],{"class":1027},"            \"min_concentration\"",[1014,2231,1121],{"class":1074},[1014,2233,2234],{"class":1023},"250.0",[1014,2236,1101],{"class":1074},[1014,2238,2239],{"class":1016,"line":1155},[1014,2240,2241],{"class":1074},"        },\n",[1014,2243,2244],{"class":1016,"line":1161},[1014,2245,1158],{"class":1074},[1014,2247,2248],{"class":1016,"line":1167},[1014,2249,1164],{"class":1074},[1014,2251,2252,2255,2257,2259,2261],{"class":1016,"line":1184},[1014,2253,2254],{"class":1074},"run_id ",[1014,2256,1089],{"class":1034},[1014,2258,1552],{"class":1074},[1014,2260,1555],{"class":1027},[1014,2262,1181],{"class":1074},[970,2264,1560,2265,1564],{},[1011,2266,1563],{},[1003,2268,2270],{"className":1567,"code":2269,"language":1569,"meta":1009,"style":1009},"{\n  \"id\": \"a3bb189e-8bf9-3888-9912-ace4e6543002\",\n  \"workflowId\": \"d81023e8-87ab-4c9e-8394-0fc10ab562f3\",\n  \"name\": \"QC Run — Plate B3\",\n  \"status\": \"SCHEDULED\",\n  \"statusSince\": \"2025-01-15T11:00:00.000Z\",\n  \"parameters\": { \"sample_id\": \"B3\", \"min_concentration\": 250.0 },\n  \"createdAt\": \"2025-01-15T11:00:00.000Z\"\n}\n",[1011,2271,2272,2276,2281,2286,2291,2296,2301,2306,2311],{"__ignoreMap":1009},[1014,2273,2274],{"class":1016,"line":1017},[1014,2275,1112],{},[1014,2277,2278],{"class":1016,"line":1038},[1014,2279,2280],{},"  \"id\": \"a3bb189e-8bf9-3888-9912-ace4e6543002\",\n",[1014,2282,2283],{"class":1016,"line":1049},[1014,2284,2285],{},"  \"workflowId\": \"d81023e8-87ab-4c9e-8394-0fc10ab562f3\",\n",[1014,2287,2288],{"class":1016,"line":1095},[1014,2289,2290],{},"  \"name\": \"QC Run — Plate B3\",\n",[1014,2292,2293],{"class":1016,"line":1104},[1014,2294,2295],{},"  \"status\": \"SCHEDULED\",\n",[1014,2297,2298],{"class":1016,"line":1115},[1014,2299,2300],{},"  \"statusSince\": \"2025-01-15T11:00:00.000Z\",\n",[1014,2302,2303],{"class":1016,"line":1129},[1014,2304,2305],{},"  \"parameters\": { \"sample_id\": \"B3\", \"min_concentration\": 250.0 },\n",[1014,2307,2308],{"class":1016,"line":1142},[1014,2309,2310],{},"  \"createdAt\": \"2025-01-15T11:00:00.000Z\"\n",[1014,2312,2313],{"class":1016,"line":1155},[1014,2314,1218],{},[1237,2316,2318],{"id":2317},"list-and-get-runs","List and get runs",[1003,2320,2322],{"className":1005,"code":2321,"filename":1007,"language":1008,"meta":1009,"style":1009},"# All runs for a workflow, newest first\ncurl \"$BASE_URL\u002Fworkflows\u002F{workflowId}\u002Fruns?_sort=-createdAt\" \\\n  -H \"Authorization: Bearer $TOKEN\"\n\n# Filter by date range\ncurl \"$BASE_URL\u002Fruns?created_at[gte]=2025-01-01T00:00:00Z&created_at[lte]=2025-01-31T23:59:59Z\" \\\n  -H \"Authorization: Bearer $TOKEN\"\n\n# Get a specific run\ncurl \"$BASE_URL\u002Fruns\u002F{runId}\" -H \"Authorization: Bearer $TOKEN\"\n",[1011,2323,2324,2329,2342,2352,2356,2361,2374,2384,2388,2393],{"__ignoreMap":1009},[1014,2325,2326],{"class":1016,"line":1017},[1014,2327,2328],{"class":1623},"# All runs for a workflow, newest first\n",[1014,2330,2331,2333,2335,2337,2340],{"class":1016,"line":1038},[1014,2332,1001],{"class":1020},[1014,2334,1264],{"class":1027},[1014,2336,1267],{"class":1074},[1014,2338,2339],{"class":1027},"\u002Fworkflows\u002F{workflowId}\u002Fruns?_sort=-createdAt\"",[1014,2341,1035],{"class":1034},[1014,2343,2344,2346,2348,2350],{"class":1016,"line":1049},[1014,2345,1041],{"class":1023},[1014,2347,1279],{"class":1027},[1014,2349,1282],{"class":1074},[1014,2351,1648],{"class":1027},[1014,2353,2354],{"class":1016,"line":1095},[1014,2355,1081],{"emptyLinePlaceholder":1080},[1014,2357,2358],{"class":1016,"line":1104},[1014,2359,2360],{"class":1623},"# Filter by date range\n",[1014,2362,2363,2365,2367,2369,2372],{"class":1016,"line":1115},[1014,2364,1001],{"class":1020},[1014,2366,1264],{"class":1027},[1014,2368,1267],{"class":1074},[1014,2370,2371],{"class":1027},"\u002Fruns?created_at[gte]=2025-01-01T00:00:00Z&created_at[lte]=2025-01-31T23:59:59Z\"",[1014,2373,1035],{"class":1034},[1014,2375,2376,2378,2380,2382],{"class":1016,"line":1129},[1014,2377,1041],{"class":1023},[1014,2379,1279],{"class":1027},[1014,2381,1282],{"class":1074},[1014,2383,1648],{"class":1027},[1014,2385,2386],{"class":1016,"line":1142},[1014,2387,1081],{"emptyLinePlaceholder":1080},[1014,2389,2390],{"class":1016,"line":1155},[1014,2391,2392],{"class":1623},"# Get a specific run\n",[1014,2394,2395,2397,2399,2401,2404,2406,2408,2410],{"class":1016,"line":1161},[1014,2396,1001],{"class":1020},[1014,2398,1264],{"class":1027},[1014,2400,1267],{"class":1074},[1014,2402,2403],{"class":1027},"\u002Fruns\u002F{runId}\"",[1014,2405,1771],{"class":1023},[1014,2407,1279],{"class":1027},[1014,2409,1282],{"class":1074},[1014,2411,1648],{"class":1027},[1231,2413],{},[987,2415,2417],{"id":2416},"monitoring-a-run","Monitoring a run",[1237,2419,2421],{"id":2420},"check-status","Check status",[1003,2423,2425],{"className":1005,"code":2424,"filename":1007,"language":1008,"meta":1009,"style":1009},"curl \"$BASE_URL\u002Fruns\u002F{runId}\u002Fstatus\" -H \"Authorization: Bearer $TOKEN\"\n",[1011,2426,2427],{"__ignoreMap":1009},[1014,2428,2429,2431,2433,2435,2438,2440,2442,2444],{"class":1016,"line":1017},[1014,2430,1001],{"class":1020},[1014,2432,1264],{"class":1027},[1014,2434,1267],{"class":1074},[1014,2436,2437],{"class":1027},"\u002Fruns\u002F{runId}\u002Fstatus\"",[1014,2439,1771],{"class":1023},[1014,2441,1279],{"class":1027},[1014,2443,1282],{"class":1074},[1014,2445,1648],{"class":1027},[2447,2448,2449,2462],"table",{},[2450,2451,2452],"thead",{},[2453,2454,2455,2459],"tr",{},[2456,2457,2458],"th",{},"Status",[2456,2460,2461],{},"Description",[2463,2464,2465,2476,2486,2496,2506,2516,2526],"tbody",{},[2453,2466,2467,2473],{},[2468,2469,2470],"td",{},[1011,2471,2472],{},"SCHEDULED",[2468,2474,2475],{},"Queued, not yet started",[2453,2477,2478,2483],{},[2468,2479,2480],{},[1011,2481,2482],{},"RUNNING",[2468,2484,2485],{},"Actively executing",[2453,2487,2488,2493],{},[2468,2489,2490],{},[1011,2491,2492],{},"PAUSED",[2468,2494,2495],{},"Suspended — waiting for operator action",[2453,2497,2498,2503],{},[2468,2499,2500],{},[1011,2501,2502],{},"AWAITING_INPUT",[2468,2504,2505],{},"Suspended — waiting for structured data input",[2453,2507,2508,2513],{},[2468,2509,2510],{},[1011,2511,2512],{},"COMPLETED",[2468,2514,2515],{},"Finished successfully",[2453,2517,2518,2523],{},[2468,2519,2520],{},[1011,2521,2522],{},"FAILED",[2468,2524,2525],{},"Finished with an unhandled error",[2453,2527,2528,2533],{},[2468,2529,2530],{},[1011,2531,2532],{},"CANCELLED",[2468,2534,2535],{},"Cancelled before completion",[1237,2537,2539],{"id":2538},"execution-timeline-and-logs","Execution timeline and logs",[1003,2541,2543],{"className":1005,"code":2542,"filename":1007,"language":1008,"meta":1009,"style":1009},"# Phase and step timeline with timestamps\ncurl \"$BASE_URL\u002Fruns\u002F{runId}\u002Ftimeline\" -H \"Authorization: Bearer $TOKEN\"\n\n# Execution logs\ncurl \"$BASE_URL\u002Fruns\u002F{runId}\u002Flogs\" -H \"Authorization: Bearer $TOKEN\"\n\n# Artifacts produced by the run\ncurl \"$BASE_URL\u002Fruns\u002F{runId}\u002Fartifacts\" -H \"Authorization: Bearer $TOKEN\"\n",[1011,2544,2545,2550,2569,2573,2578,2597,2601,2606],{"__ignoreMap":1009},[1014,2546,2547],{"class":1016,"line":1017},[1014,2548,2549],{"class":1623},"# Phase and step timeline with timestamps\n",[1014,2551,2552,2554,2556,2558,2561,2563,2565,2567],{"class":1016,"line":1038},[1014,2553,1001],{"class":1020},[1014,2555,1264],{"class":1027},[1014,2557,1267],{"class":1074},[1014,2559,2560],{"class":1027},"\u002Fruns\u002F{runId}\u002Ftimeline\"",[1014,2562,1771],{"class":1023},[1014,2564,1279],{"class":1027},[1014,2566,1282],{"class":1074},[1014,2568,1648],{"class":1027},[1014,2570,2571],{"class":1016,"line":1049},[1014,2572,1081],{"emptyLinePlaceholder":1080},[1014,2574,2575],{"class":1016,"line":1095},[1014,2576,2577],{"class":1623},"# Execution logs\n",[1014,2579,2580,2582,2584,2586,2589,2591,2593,2595],{"class":1016,"line":1104},[1014,2581,1001],{"class":1020},[1014,2583,1264],{"class":1027},[1014,2585,1267],{"class":1074},[1014,2587,2588],{"class":1027},"\u002Fruns\u002F{runId}\u002Flogs\"",[1014,2590,1771],{"class":1023},[1014,2592,1279],{"class":1027},[1014,2594,1282],{"class":1074},[1014,2596,1648],{"class":1027},[1014,2598,2599],{"class":1016,"line":1115},[1014,2600,1081],{"emptyLinePlaceholder":1080},[1014,2602,2603],{"class":1016,"line":1129},[1014,2604,2605],{"class":1623},"# Artifacts produced by the run\n",[1014,2607,2608,2610,2612,2614,2617,2619,2621,2623],{"class":1016,"line":1142},[1014,2609,1001],{"class":1020},[1014,2611,1264],{"class":1027},[1014,2613,1267],{"class":1074},[1014,2615,2616],{"class":1027},"\u002Fruns\u002F{runId}\u002Fartifacts\"",[1014,2618,1771],{"class":1023},[1014,2620,1279],{"class":1027},[1014,2622,1282],{"class":1074},[1014,2624,1648],{"class":1027},[1237,2626,2628],{"id":2627},"poll-until-complete","Poll until complete",[1003,2630,2633],{"className":1061,"code":2631,"filename":2632,"language":1064,"meta":1009,"style":1009},"import time\nimport httpx\n\ndef wait_for_run(run_id: str, headers: dict, base_url: str, poll_interval: int = 5) -> dict:\n    terminal = {\"COMPLETED\", \"FAILED\", \"CANCELLED\"}\n    while True:\n        run = httpx.get(f\"{base_url}\u002Fruns\u002F{run_id}\", headers=headers).json()\n        print(f\"[{run['statusSince']}] {run['status']}\")\n        if run[\"status\"] in terminal:\n            return run\n        time.sleep(poll_interval)\n\nrun = wait_for_run(run_id, headers, BASE_URL)\nprint(f\"Run finished: {run['status']}\")\n","poll.py",[1011,2634,2635,2642,2648,2652,2698,2722,2732,2774,2818,2837,2845,2850,2854,2868],{"__ignoreMap":1009},[1014,2636,2637,2639],{"class":1016,"line":1017},[1014,2638,1071],{"class":1034},[1014,2640,2641],{"class":1074}," time\n",[1014,2643,2644,2646],{"class":1016,"line":1038},[1014,2645,1071],{"class":1034},[1014,2647,1075],{"class":1074},[1014,2649,2650],{"class":1016,"line":1049},[1014,2651,1081],{"emptyLinePlaceholder":1080},[1014,2653,2654,2657,2661,2664,2667,2670,2673,2676,2678,2681,2684,2687,2690,2693,2695],{"class":1016,"line":1095},[1014,2655,2656],{"class":1034},"def",[1014,2658,2660],{"class":2659},"s4qFZ"," wait_for_run",[1014,2662,2663],{"class":1074},"(run_id: ",[1014,2665,2666],{"class":1023},"str",[1014,2668,2669],{"class":1074},", headers: ",[1014,2671,2672],{"class":1023},"dict",[1014,2674,2675],{"class":1074},", base_url: ",[1014,2677,2666],{"class":1023},[1014,2679,2680],{"class":1074},", poll_interval: ",[1014,2682,2683],{"class":1023},"int",[1014,2685,2686],{"class":1034}," =",[1014,2688,2689],{"class":1023}," 5",[1014,2691,2692],{"class":1074},") -> ",[1014,2694,2672],{"class":1023},[1014,2696,2697],{"class":1074},":\n",[1014,2699,2700,2703,2705,2707,2710,2712,2715,2717,2720],{"class":1016,"line":1104},[1014,2701,2702],{"class":1074},"    terminal ",[1014,2704,1089],{"class":1034},[1014,2706,1192],{"class":1074},[1014,2708,2709],{"class":1027},"\"COMPLETED\"",[1014,2711,1515],{"class":1074},[1014,2713,2714],{"class":1027},"\"FAILED\"",[1014,2716,1515],{"class":1074},[1014,2718,2719],{"class":1027},"\"CANCELLED\"",[1014,2721,1218],{"class":1074},[1014,2723,2724,2727,2730],{"class":1016,"line":1115},[1014,2725,2726],{"class":1034},"    while",[1014,2728,2729],{"class":1023}," True",[1014,2731,2697],{"class":1074},[1014,2733,2734,2737,2739,2742,2744,2746,2748,2751,2753,2756,2758,2761,2763,2765,2767,2769,2771],{"class":1016,"line":1129},[1014,2735,2736],{"class":1074},"        run ",[1014,2738,1089],{"class":1034},[1014,2740,2741],{"class":1074}," httpx.get(",[1014,2743,1200],{"class":1034},[1014,2745,1215],{"class":1027},[1014,2747,1206],{"class":1034},[1014,2749,2750],{"class":1074},"base_url",[1014,2752,1212],{"class":1034},[1014,2754,2755],{"class":1027},"\u002Fruns\u002F",[1014,2757,1206],{"class":1034},[1014,2759,2760],{"class":1074},"run_id",[1014,2762,1212],{"class":1034},[1014,2764,1215],{"class":1027},[1014,2766,1515],{"class":1074},[1014,2768,1228],{"class":1020},[1014,2770,1089],{"class":1034},[1014,2772,2773],{"class":1074},"headers).json()\n",[1014,2775,2776,2779,2782,2784,2787,2789,2792,2795,2798,2800,2803,2805,2807,2810,2812,2814,2816],{"class":1016,"line":1142},[1014,2777,2778],{"class":1023},"        print",[1014,2780,2781],{"class":1074},"(",[1014,2783,1200],{"class":1034},[1014,2785,2786],{"class":1027},"\"[",[1014,2788,1206],{"class":1034},[1014,2790,2791],{"class":1074},"run[",[1014,2793,2794],{"class":1027},"'statusSince'",[1014,2796,2797],{"class":1074},"]",[1014,2799,1212],{"class":1034},[1014,2801,2802],{"class":1027},"] ",[1014,2804,1206],{"class":1034},[1014,2806,2791],{"class":1074},[1014,2808,2809],{"class":1027},"'status'",[1014,2811,2797],{"class":1074},[1014,2813,1212],{"class":1034},[1014,2815,1215],{"class":1027},[1014,2817,1164],{"class":1074},[1014,2819,2820,2823,2826,2829,2831,2834],{"class":1016,"line":1155},[1014,2821,2822],{"class":1034},"        if",[1014,2824,2825],{"class":1074}," run[",[1014,2827,2828],{"class":1027},"\"status\"",[1014,2830,2802],{"class":1074},[1014,2832,2833],{"class":1034},"in",[1014,2835,2836],{"class":1074}," terminal:\n",[1014,2838,2839,2842],{"class":1016,"line":1161},[1014,2840,2841],{"class":1034},"            return",[1014,2843,2844],{"class":1074}," run\n",[1014,2846,2847],{"class":1016,"line":1167},[1014,2848,2849],{"class":1074},"        time.sleep(poll_interval)\n",[1014,2851,2852],{"class":1016,"line":1184},[1014,2853,1081],{"emptyLinePlaceholder":1080},[1014,2855,2856,2859,2861,2864,2866],{"class":1016,"line":1544},[1014,2857,2858],{"class":1074},"run ",[1014,2860,1089],{"class":1034},[1014,2862,2863],{"class":1074}," wait_for_run(run_id, headers, ",[1014,2865,1428],{"class":1023},[1014,2867,1164],{"class":1074},[1014,2869,2870,2873,2875,2877,2880,2882,2884,2886,2888,2890,2892],{"class":1016,"line":1980},[1014,2871,2872],{"class":1023},"print",[1014,2874,2781],{"class":1074},[1014,2876,1200],{"class":1034},[1014,2878,2879],{"class":1027},"\"Run finished: ",[1014,2881,1206],{"class":1034},[1014,2883,2791],{"class":1074},[1014,2885,2809],{"class":1027},[1014,2887,2797],{"class":1074},[1014,2889,1212],{"class":1034},[1014,2891,1215],{"class":1027},[1014,2893,1164],{"class":1074},[1231,2895],{},[987,2897,2899],{"id":2898},"interacting-with-run-states","Interacting with run states",[970,2901,2902,2903,2906],{},"Use ",[1011,2904,2905],{},"POST \u002Fv1\u002Fruns\u002F{runId}\u002Fstatus"," to drive a run externally — resume, provide input, or cancel.",[1237,2908,2910],{"id":2909},"resume-a-paused-run","Resume a paused run",[1003,2912,2914],{"className":1005,"code":2913,"filename":1007,"language":1008,"meta":1009,"style":1009},"curl -X POST \"$BASE_URL\u002Fruns\u002F{runId}\u002Fstatus\" \\\n  -H \"Authorization: Bearer $TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"status\": \"RUNNING\"}'\n",[1011,2915,2916,2932,2944,2952],{"__ignoreMap":1009},[1014,2917,2918,2920,2922,2924,2926,2928,2930],{"class":1016,"line":1017},[1014,2919,1001],{"class":1020},[1014,2921,1024],{"class":1023},[1014,2923,1028],{"class":1027},[1014,2925,1264],{"class":1027},[1014,2927,1267],{"class":1074},[1014,2929,2437],{"class":1027},[1014,2931,1035],{"class":1034},[1014,2933,2934,2936,2938,2940,2942],{"class":1016,"line":1038},[1014,2935,1041],{"class":1023},[1014,2937,1279],{"class":1027},[1014,2939,1282],{"class":1074},[1014,2941,1215],{"class":1027},[1014,2943,1035],{"class":1034},[1014,2945,2946,2948,2950],{"class":1016,"line":1049},[1014,2947,1041],{"class":1023},[1014,2949,1293],{"class":1027},[1014,2951,1035],{"class":1034},[1014,2953,2954,2956],{"class":1016,"line":1095},[1014,2955,1052],{"class":1023},[1014,2957,2958],{"class":1027}," '{\"status\": \"RUNNING\"}'\n",[1237,2960,2962],{"id":2961},"provide-input-on-resume","Provide input on resume",[970,2964,2965,2966,2968,2969,2972],{},"When the run is in ",[1011,2967,2502],{},", include a ",[1011,2970,2971],{},"data"," object keyed by phase ID:",[1003,2974,2976],{"className":1005,"code":2975,"filename":1007,"language":1008,"meta":1009,"style":1009},"curl -X POST \"$BASE_URL\u002Fruns\u002F{runId}\u002Fstatus\" \\\n  -H \"Authorization: Bearer $TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"status\": \"RUNNING\",\n    \"data\": {\n      \"quality_check\": {\n        \"sample_id\": \"B3\",\n        \"approved\": true\n      }\n    }\n  }'\n",[1011,2977,2978,2994,3006,3014,3020,3025,3030,3035,3040,3045,3050,3054],{"__ignoreMap":1009},[1014,2979,2980,2982,2984,2986,2988,2990,2992],{"class":1016,"line":1017},[1014,2981,1001],{"class":1020},[1014,2983,1024],{"class":1023},[1014,2985,1028],{"class":1027},[1014,2987,1264],{"class":1027},[1014,2989,1267],{"class":1074},[1014,2991,2437],{"class":1027},[1014,2993,1035],{"class":1034},[1014,2995,2996,2998,3000,3002,3004],{"class":1016,"line":1038},[1014,2997,1041],{"class":1023},[1014,2999,1279],{"class":1027},[1014,3001,1282],{"class":1074},[1014,3003,1215],{"class":1027},[1014,3005,1035],{"class":1034},[1014,3007,3008,3010,3012],{"class":1016,"line":1049},[1014,3009,1041],{"class":1023},[1014,3011,1293],{"class":1027},[1014,3013,1035],{"class":1034},[1014,3015,3016,3018],{"class":1016,"line":1095},[1014,3017,1052],{"class":1023},[1014,3019,1302],{"class":1027},[1014,3021,3022],{"class":1016,"line":1104},[1014,3023,3024],{"class":1027},"    \"status\": \"RUNNING\",\n",[1014,3026,3027],{"class":1016,"line":1115},[1014,3028,3029],{"class":1027},"    \"data\": {\n",[1014,3031,3032],{"class":1016,"line":1129},[1014,3033,3034],{"class":1027},"      \"quality_check\": {\n",[1014,3036,3037],{"class":1016,"line":1142},[1014,3038,3039],{"class":1027},"        \"sample_id\": \"B3\",\n",[1014,3041,3042],{"class":1016,"line":1155},[1014,3043,3044],{"class":1027},"        \"approved\": true\n",[1014,3046,3047],{"class":1016,"line":1161},[1014,3048,3049],{"class":1027},"      }\n",[1014,3051,3052],{"class":1016,"line":1167},[1014,3053,2130],{"class":1027},[1014,3055,3056],{"class":1016,"line":1184},[1014,3057,1337],{"class":1027},[1237,3059,3061],{"id":3060},"cancel-a-run","Cancel a run",[1003,3063,3065],{"className":1005,"code":3064,"filename":1007,"language":1008,"meta":1009,"style":1009},"curl -X POST \"$BASE_URL\u002Fruns\u002F{runId}\u002Fstatus\" \\\n  -H \"Authorization: Bearer $TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"status\": \"CANCELLED\"}'\n",[1011,3066,3067,3083,3095,3103],{"__ignoreMap":1009},[1014,3068,3069,3071,3073,3075,3077,3079,3081],{"class":1016,"line":1017},[1014,3070,1001],{"class":1020},[1014,3072,1024],{"class":1023},[1014,3074,1028],{"class":1027},[1014,3076,1264],{"class":1027},[1014,3078,1267],{"class":1074},[1014,3080,2437],{"class":1027},[1014,3082,1035],{"class":1034},[1014,3084,3085,3087,3089,3091,3093],{"class":1016,"line":1038},[1014,3086,1041],{"class":1023},[1014,3088,1279],{"class":1027},[1014,3090,1282],{"class":1074},[1014,3092,1215],{"class":1027},[1014,3094,1035],{"class":1034},[1014,3096,3097,3099,3101],{"class":1016,"line":1049},[1014,3098,1041],{"class":1023},[1014,3100,1293],{"class":1027},[1014,3102,1035],{"class":1034},[1014,3104,3105,3107],{"class":1016,"line":1095},[1014,3106,1052],{"class":1023},[1014,3108,3109],{"class":1027}," '{\"status\": \"CANCELLED\"}'\n",[3111,3112,3115],"callout",{"color":3113,"icon":3114},"neutral","i-heroicons-magnifying-glass",[970,3116,3117,3118,3122],{},"For the workflow side — how to pause a run and wait for the resume signal from within your Python code — see ",[3119,3120,3121],"a",{"href":150},"Human in the loop",".",[987,3124,3126],{"id":3125},"next-steps","Next steps",[980,3128,3129,3134],{},[983,3130,3131,3133],{},[3119,3132,137],{"href":138},": trigger from the UI or UniteLabs SDK",[983,3135,3136,3138],{},[3119,3137,133],{"href":134},": package and register a workflow before running it",[3140,3141,3142],"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":1009,"searchDepth":1017,"depth":1038,"links":3144},[3145,3146,3152,3156,3161,3166],{"id":989,"depth":1038,"text":990},{"id":1235,"depth":1038,"text":124,"children":3147},[3148,3149,3150,3151],{"id":1239,"depth":1049,"text":1240},{"id":1612,"depth":1049,"text":1613},{"id":1746,"depth":1049,"text":1747},{"id":1870,"depth":1049,"text":1871},{"id":2042,"depth":1038,"text":334,"children":3153},[3154,3155],{"id":2045,"depth":1049,"text":2046},{"id":2317,"depth":1049,"text":2318},{"id":2416,"depth":1038,"text":2417,"children":3157},[3158,3159,3160],{"id":2420,"depth":1049,"text":2421},{"id":2538,"depth":1049,"text":2539},{"id":2627,"depth":1049,"text":2628},{"id":2898,"depth":1038,"text":2899,"children":3162},[3163,3164,3165],{"id":2909,"depth":1049,"text":2910},{"id":2961,"depth":1049,"text":2962},{"id":3060,"depth":1049,"text":3061},{"id":3125,"depth":1038,"text":3126},"Register, manage, and trigger workflows programmatically using the UniteLabs REST API.","md",{},"\u002Fhow-to\u002Fautomate\u002Fworkflows-api",{"title":141,"description":3167},"howto","kJlghVGUl4_AsOEuhO_hqJvQIuuIiTpy6v-Cmz6hJYI",[3175,3177],{"title":137,"description":3176,"path":138},"Trigger a workflow run from the platform UI, the UniteLabs SDK, or the REST API.",{"title":145,"description":3178,"path":146},"Automate workflow deploys to UniteLabs with three channels: DEV (manual), STG (push to main), PRD (per-workflow release tags), on GitHub Actions or GitLab CI.",1792590379302]