Compile a liquid-handling plan (Flex robot, pipettes, deck labware, liquids, transfer/dist
Compile a liquid-handling plan (Flex robot, pipettes, deck labware, liquids, transfer/distribute/serial-dilute/mix/delay steps) into a self-contained Python protocol, run a static volume tracker and a real opentrons simulation, and return a pass/fail report with platemap, reagent-usage, and simulation-log artifacts. This proves the protocol runs, never that the experiment is scientifically valid.
150000 (raw units)
price
1
calls / 30d
1
unique payers
2026-09-11
updated
Provider
lab.api.williamrobinson.dev · discovered, not yet claimed by its owner
Payment (x402 accepts[])
[
{
"scheme": "exact",
"network": "eip155:8453",
"payTo": "0x26026370fe8b2bb17af9092a17691c76519366da",
"asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"amount": "150000",
"maxTimeoutSeconds": 300
}
]Output schema
{
"bazaar": {
"info": {
"input": {
"body": {
"labware": [
{
"id": "plate",
"label": "PCR plate",
"slot": "A1",
"type": "opentrons_96_wellplate_200ul_pcr_full_skirt"
},
{
"id": "tips50",
"label": "50 uL tips",
"slot": "A2",
"type": "opentrons_flex_96_tiprack_50ul"
},
{
"id": "mmix_res",
"label": "Master mix reservoir",
"slot": "B1",
"type": "nest_12_reservoir_15ml"
},
{
"id": "tubes",
"label": "Sample tubes",
"slot": "B2",
"type": "opentrons_24_tuberack_nest_1.5ml_snapcap"
}
],
"liquids": [
{
"deadVolumeUl": 300,
"id": "mastermix",
"location": {
"labware": "mmix_res",
"volumeUl": 5000,
"wells": "A1"
},
"name": "PCR master mix"
},
{
"deadVolumeUl": 20,
"id": "samples",
"location": {
"labware": "tubes",
"volumeUl": 200,
"wells": "A1:D2"
},
"name": "Patient samples"
}
],
"name": "PCR setup with 8-sample column and column-12 dilution series",
"options": {
"defaultNewTip": "once",
"forbidCrossLiquidTipReuse": true,
"trashSlot": "A3"
},
"pipettes": [
{
"model": "flex_8channel_50",
"mount": "left"
},
{
"model": "flex_1channel_50",
"mount": "right"
}
],
"robot": "flex",
"steps": [
{
"dests": {
"labware": "plate",
"wells": "A1:H12"
},
"kind": "distribute",
"newTip": "once",
"source": {
"labware": "mmix_res",
"well": "A1"
},
"volumeUl": 20
},
{
"dest": {
"labware": "plate",
"well": "A1"
},
"kind": "transfer",
"newTip": "always",
"source": {
"labware": "tubes",
"well": "A1"
},
"volumeUl": 5
},
{
"dest": {
"labware": "plate",
"well": "B1"
},
"kind": "transfer",
"newTip": "always",
"source": {
"labware": "tubes",
"well": "A2"
},
"volumeUl": 5
},
{
"dest": {
"labware": "plate",
"well": "C1"
},
"kind": "transfer",
"newTip": "always",
"source": {
"labware": "tubes",
"well": "B1"
},
"volumeUl": 5
},
{
"dest": {
"labware": "plate",
"well": "D1"
},
"kind": "transfer",
"newTip": "always",
"source": {
"labware": "tubes",
"well": "B2"
},
"volumeUl": 5
},
{
"dest": {
"labware": "plate",
"well": "E1"
},
"kind": "transfer",
"newTip": "always",
"source": {
"labware": "tubes",
"well": "C1"
},
"volumeUl": 5
},
{
"dest": {
"labware": "plate",
"well": "F1"
},
"kind": "transfer",
"newTip": "always",
"source": {
"labware": "tubes",
"well": "C2"
},
"volumeUl": 5
},
{
"dest": {
"labware": "plate",
"well": "G1"
},
"kind": "transfer",
"newTip": "always",
"source": {
"labware": "tubes",
"well": "D1"
},
"volumeUl": 5
},
{
"dest": {
"labware": "plate",
"well": "H1"
},
"kind": "transfer",
"newTip": "always",
"source": {
"labware": "tubes",
"well": "D2"
},
"volumeUl": 5
},
{
"kind": "serial_dilute",
"labware": "plate",
"mixRepetitions": 3,
"mixUl": 15,
"newTip": "always",
"transferUl": 10,
"wells": "A12:H12"
},
{
"kind": "delay",
"message": "Incubate before sealing",
"seconds": 60
}
]
},
"bodyType": "json",
"method": "POST",
"type": "http"
},
"output": {
"example": {
"artifacts": [
{
"href": "https://lab.api.williamrobinson.dev/v1/lab/artifacts/0123456789abcdef0123456789abcdef0123456789abcdef/protocol.py",
"mediaType": "text/x-python; charset=utf-8",
"name": "protocol.py",
"sha256": "02d424abe63b8fd8b2717803b5f3690504e09d695142ece16d8b0f03f7174dba",
"sizeBytes": 6561
},
{
"href": "https://lab.api.williamrobinson.dev/v1/lab/artifacts/0123456789abcdef0123456789abcdef0123456789abcdef/platemap.csv",
"mediaType": "text/csv; charset=utf-8",
"name": "platemap.csv",
"sha256": "9dc370d60f4ac51c9036bc6d33d90c5af5d24a74ed2adae0a1b7ade1fd76d9f9",
"sizeBytes": 2425
},
{
"href": "https://lab.api.williamrobinson.dev/v1/lab/artifacts/0123456789abcdef0123456789abcdef0123456789abcdef/platemap.svg",
"mediaType": "image/svg+xml",
"name": "platemap.svg",
"sha256": "c2dc914c4c34cb6d879352e0ed8d66e3f285904e82e3f61ba27b659ba03fc70d",
"sizeBytes": 23733
},
{
"href": "https://lab.api.williamrobinson.dev/v1/lab/artifacts/0123456789abcdef0123456789abcdef0123456789abcdef/reagents.csv",
"mediaType": "text/csv; charset=utf-8",
"name": "reagents.csv",
"sha256": "3dabbe14d42a323cf294de9b0219d8d66f2cc5867ab4ea86c4925aca057cf7ce",
"sizeBytes": 196
},
{
"href": "https://lab.api.williamrobinson.dev/v1/lab/artifacts/0123456789abcdef0123456789abcdef0123456789abcdef/simulation-log.txt",
"mediaType": "text/plain; charset=utf-8",
"name": "simulation-log.txt",
"sha256": "11946c6bdbe0ad5d64ecdc45d36fca4422bde6327a0cd9be02e8ebfa2a60d1bb",
"sizeBytes": 12799
},
{
"href": "https://lab.api.williamrobinson.dev/v1/lab/artifacts/0123456789abcdef0123456789abcdef0123456789abcdef/report.json",
"mediaType": "application/json",
"name": "report.json",
"sha256": "bccaa49a8943c4008b6ea10c0126367ec6bc64489151a08de291d9ad834ba173",
"sizeBytes": 10756
}
],
"checks": [
{
"code": "plan_valid",
"detail": "111 elementary transfer(s) across 4 labware and 2 pipette(s) resolved cleanly",
"status": "passed"
},
{
"code": "labware_compatible",
"detail": "every pipette has a compatible tip rack and every multi-channel step is column-aligned",
"status": "passed"
},
{
"code": "volumes_within_capacity",
"detail": "no well exceeds its fill limit",
"status": "passed"
},
{
"code": "liquids_sufficient",
"detail": "every source liquid has enough usable volume",
"status": "passed"
},
{
"code": "pipette_ranges_respected",
"detail": "every transfer volume is within its pipette's range",
"status": "passed"
},
{
"code": "tips_sufficient",
"detail": "loaded tip racks cover every pickup",
"status": "passed"
},
{
"code": "tip_reuse_safe",
"detail": "no tip touched two different liquids without a fresh pickup",
"status": "passed"
},
{
"code": "simulation_passed",
"detail": "147 simulated command(s)",
"status": "passed"
}
],
"expiresAt": "2026-09-12T08:10:35.369Z",
"findings": [],
"limitations": [
"Simulation proves the protocol is executable by Opentrons robot software; it is not proof that the underlying experiment is scientifically valid.",
"No liquid-class or viscosity modelling is performed; every transfer is assumed ideal (no air gaps, splashing, or evaporation effects).",
"The static volume tracker assumes declared dead volumes are accurate; it cannot detect physically inaccessible liquid the caller did not declare.",
"OT-2 robots are not supported in v1; every generated protocol targets Opentrons Flex only.",
"The simulator does not check well overfill; the well_overflow finding above is this compiler's own static check."
],
"liquids": [
{
"availableUl": 5000,
"consumedUl": 1920,
"id": "mastermix",
"name": "PCR master mix",
"remainingUl": 3080,
"shortfallUl": 0
},
{
"availableUl": 1600,
"consumedUl": 40,
"id": "samples",
"name": "Patient samples",
"remainingUl": 1560,
"shortfallUl": 0
}
],
"robot": "flex",
"simulation": {
"commands": 147,
"error": null,
"ok": true,
"ran": true
},
"status": "passed",
"summary": {
"estimatedMinutes": 13.63,
"labware": 4,
"liquids": 2,
"steps": 11,
"tipsUsed": {
"left": 8,
"right": 15
},
"transfers": 111
},
"tools": {
"apiLevel": "2.20",
"opentrons": "9.1.2"
},
"truncated": true,
"warnings": [],
"wells": [
{
"labware": "mmix_res",
"liquids": [
"mastermix"
],
"volumeUl": 3080,
"well": "A1"
},
{
"labware": "plate",
"liquids": [
"mastermix",
"samples"
],
"volumeUl": 25,
"well": "A1"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "A2"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "A3"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "A4"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "A5"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "A6"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "A7"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "A8"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "A9"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "A10"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "A11"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 10,
"well": "A12"
},
{
"labware": "plate",
"liquids": [
"mastermix",
"samples"
],
"volumeUl": 25,
"well": "B1"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "B2"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "B3"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "B4"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "B5"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "B6"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "B7"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "B8"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "B9"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "B10"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "B11"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "B12"
},
{
"labware": "plate",
"liquids": [
"mastermix",
"samples"
],
"volumeUl": 25,
"well": "C1"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "C2"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "C3"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "C4"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "C5"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "C6"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "C7"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "C8"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "C9"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "C10"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "C11"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "C12"
},
{
"labware": "plate",
"liquids": [
"mastermix",
"samples"
],
"volumeUl": 25,
"well": "D1"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "D2"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "D3"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "D4"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "D5"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "D6"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "D7"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "D8"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "D9"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "D10"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "D11"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "D12"
},
{
"labware": "plate",
"liquids": [
"mastermix",
"samples"
],
"volumeUl": 25,
"well": "E1"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "E2"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "E3"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "E4"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "E5"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "E6"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "E7"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "E8"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "E9"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "E10"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "E11"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "E12"
},
{
"labware": "plate",
"liquids": [
"mastermix",
"samples"
],
"volumeUl": 25,
"well": "F1"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "F2"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "F3"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "F4"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "F5"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "F6"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "F7"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "F8"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "F9"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "F10"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "F11"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "F12"
},
{
"labware": "plate",
"liquids": [
"mastermix",
"samples"
],
"volumeUl": 25,
"well": "G1"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "G2"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "G3"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "G4"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "G5"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "G6"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "G7"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "G8"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "G9"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "G10"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "G11"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "G12"
},
{
"labware": "plate",
"liquids": [
"mastermix",
"samples"
],
"volumeUl": 25,
"well": "H1"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "H2"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "H3"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "H4"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "H5"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "H6"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "H7"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "H8"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "H9"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "H10"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 20,
"well": "H11"
},
{
"labware": "plate",
"liquids": [
"mastermix"
],
"volumeUl": 30,
"well": "H12"
},
{
"labware": "tubes",
"liquids": [
"samples"
],
"volumeUl": 195,
"well": "A1"
},
{
"labware": "tubes",
"liquids": [
"samples"
],
"volumeUl": 195,
"well": "A2"
},
{
"labware": "tubes",
"liquids": [
"samples"
],
"volumeUl": 195,
"well": "B1"
}
]
},
"type": "json"
}
},
"schema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"input": {
"additionalProperties": false,
"properties": {
"body": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"properties": {
"labware": {
"items": {
"additionalProperties": false,
"properties": {
"id": {
"description": "Caller-assigned identifier, unique within its array.",
"pattern": "^[A-Za-z0-9_-]{1,32}$",
"type": "string"
},
"label": {
"maxLength": 128,
"minLength": 1,
"type": "string"
},
"slot": {
"enum": [
"A1",
"A2",
"A3",
"B1",
"B2",
"B3",
"C1",
"C2",
"C3",
"D1",
"D2",
"D3"
],
"type": "string"
},
"type": {
"enum": [
"opentrons_96_wellplate_200ul_pcr_full_skirt",
"corning_96_wellplate_360ul_flat",
"nest_96_wellplate_2ml_deep",
"corning_384_wellplate_112ul_flat",
"nest_12_reservoir_15ml",
"nest_1_reservoir_195ml",
"opentrons_24_tuberack_nest_1.5ml_snapcap",
"opentrons_flex_96_tiprack_50ul",
"opentrons_flex_96_tiprack_200ul",
"opentrons_flex_96_tiprack_1000ul"
],
"type": "string"
}
},
"required": [
"id",
"type",
"slot"
],
"type": "object"
},
"maxItems": 12,
"minItems": 1,
"type": "array"
},
"liquids": {
"items": {
"additionalProperties": false,
"properties": {
"deadVolumeUl": {
"maximum": 50000,
"minimum": 0,
"type": "number"
},
"id": {
"description": "Caller-assigned identifier, unique within its array.",
"pattern": "^[A-Za-z0-9_-]{1,32}$",
"type": "string"
},
"location": {
"additionalProperties": false,
"properties": {
"labware": {
"description": "Caller-assigned identifier, unique within its array.",
"pattern": "^[A-Za-z0-9_-]{1,32}$",
"type": "string"
},
"volumeUl": {
"exclusiveMinimum": 0,
"maximum": 300000,
"type": "number"
},
"wells": {
"description": "A well or well range: \"A1\", \"A1:H1\" (column), \"A1:A12\" (row), or \"A1:H12\" (rectangle), expanded row-major.",
"pattern": "^[A-P](?:[1-9]|1[0-9]|2[0-4])(?::[A-P](?:[1-9]|1[0-9]|2[0-4]))?$",
"type": "string"
}
},
"required": [
"labware",
"wells",
"volumeUl"
],
"type": "object"
},
"name": {
"maxLength": 200,
"minLength": 1,
"type": "string"
}
},
"required": [
"id",
"name",
"location"
],
"type": "object"
},
"maxItems": 32,
"type": "array"
},
"name": {
"maxLength": 200,
"minLength": 1,
"type": "string"
},
"options": {
"additionalProperties": false,
"properties": {
"defaultNewTip": {
"enum": [
"always",
"once",
"never"
],
"type": "string"
},
"forbidCrossLiquidTipReuse": {
"type": "boolean"
},
"trashSlot": {
"description": "Flex default is A3. Column 1 or 3 only (column 2 and the column-4 staging area are not valid trash locations).",
"enum": [
"A1",
"B1",
"C1",
"D1",
"A3",
"B3",
"C3",
"D3"
],
"type": "string"
}
},
"required": [
"trashSlot",
"defaultNewTip",
"forbidCrossLiquidTipReuse"
],
"type": "object"
},
"pipettes": {
"items": {
"additionalProperties": false,
"properties": {
"model": {
"enum": [
"flex_1channel_50",
"flex_1channel_1000",
"flex_8channel_50",
"flex_8channel_1000"
],
"type": "string"
},
"mount": {
"enum": [
"left",
"right"
],
"type": "string"
}
},
"required": [
"mount",
"model"
],
"type": "object"
},
"maxItems": 2,
"minItems": 1,
"type": "array"
},
"robot": {
"const": "flex",
"description": "Opentrons Flex only; OT-2 is not supported (opentrons 9.x's simulator refuses OT-2 protocols)."
},
"steps": {
"items": {
"oneOf": [
{
"additionalProperties": false,
"properties": {
"dest": {
"additionalProperties": false,
"properties": {
"labware": {
"description": "Caller-assigned identifier, unique within its array.",
"pattern": "^[A-Za-z0-9_-]{1,32}$",
"type": "string"
},
"well": {
"description": "A single well, e.g. \"A1\" (rows A-P, columns 1-24).",
"pattern": "^[A-P](?:[1-9]|1[0-9]|2[0-4])$",
"type": "string"
}
},
"required": [
"labware",
"well"
],
"type": "object"
},
"kind": {
"const": "transfer"
},
"mixAfterRepetitions": {
"maximum": 20,
"minimum": 1,
"type": "integer"
},
"mixAfterUl": {
"description": "Microlitres.",
"exclusiveMinimum": 0,
"maximum": 10000,
"type": "number"
},
"newTip": {
"enum": [
"always",
"once",
"never"
],
"type": "string"
},
"source": {
"additionalProperties": false,
"properties": {
"labware": {
"description": "Caller-assigned identifier, unique within its array.",
"pattern": "^[A-Za-z0-9_-]{1,32}$",
"type": "string"
},
"well": {
"description": "A single well, e.g. \"A1\" (rows A-P, columns 1-24).",
"pattern": "^[A-P](?:[1-9]|1[0-9]|2[0-4])$",
"type": "string"
}
},
"required": [
"labware",
"well"
],
"type": "object"
},
"volumeUl": {
"description": "Microlitres.",
"exclusiveMinimum": 0,
"maximum": 10000,
"type": "number"
}
},
"required": [
"kind",
"source",
"dest",
"volumeUl"
],
"type": "object"
},
{
"additionalProperties": false,
"properties": {
"dests": {
"additionalProperties": false,
"properties": {
"labware": {
"description": "Caller-assigned identifier, unique within its array.",
"pattern": "^[A-Za-z0-9_-]{1,32}$",
"type": "string"
},
"wells": {
"description": "A well or well range: \"A1\", \"A1:H1\" (column), \"A1:A12\" (row), or \"A1:H12\" (rectangle), expanded row-major.",
"pattern": "^[A-P](?:[1-9]|1[0-9]|2[0-4])(?::[A-P](?:[1-9]|1[0-9]|2[0-4]))?$",
"type": "string"
}
},
"required": [
"labware",
"wells"
],
"type": "object"
},
"kind": {
"const": "distribute"
},
"newTip": {
"enum": [
"always",
"once",
"never"
],
"type": "string"
},
"source": {
"additionalProperties": false,
"properties": {
"labware": {
"description": "Caller-assigned identifier, unique within its array.",
"pattern": "^[A-Za-z0-9_-]{1,32}$",
"type": "string"
},
"well": {
"description": "A single well, e.g. \"A1\" (rows A-P, columns 1-24).",
"pattern": "^[A-P](?:[1-9]|1[0-9]|2[0-4])$",
"type": "string"
}
},
"required": [
"labware",
"well"
],
"type": "object"
},
"volumeUl": {
"description": "Microlitres.",
"exclusiveMinimum": 0,
"maximum": 10000,
"type": "number"
}
},
"required": [
"kind",
"source",
"dests",
"volumeUl"
],
"type": "object"
},
{
"additionalProperties": false,
"properties": {
"kind": {
"const": "serial_dilute"
},
"labware": {
"description": "Caller-assigned identifier, unique within its array.",
"pattern": "^[A-Za-z0-9_-]{1,32}$",
"type": "string"
},
"mixRepetitions": {
"maximum": 20,
"minimum": 1,
"type": "integer"
},
"mixUl": {
"description": "Microlitres.",
"exclusiveMinimum": 0,
"maximum": 10000,
"type": "number"
},
"newTip": {
"enum": [
"always",
"once",
"never"
],
"type": "string"
},
"transferUl": {
"description": "Microlitres.",
"exclusiveMinimum": 0,
"maximum": 10000,
"type": "number"
},
"wells": {
"description": "A well or well range: \"A1\", \"A1:H1\" (column), \"A1:A12\" (row), or \"A1:H12\" (rectangle), expanded row-major.",
"pattern": "^[A-P](?:[1-9]|1[0-9]|2[0-4])(?::[A-P](?:[1-9]|1[0-9]|2[0-4]))?$",
"type": "string"
}
},
"required": [
"kind",
"labware",
"wells",
"transferUl",
"mixUl",
"mixRepetitions"
],
"type": "object"
},
{
"additionalProperties": false,
"properties": {
"kind": {
"const": "mix"
},
"newTip": {
"enum": [
"always",
"once",
"never"
],
"type": "string"
},
"repetitions": {
"maximum": 20,
"minimum": 1,
"type": "integer"
},
"target": {
"additionalProperties": false,
"properties": {
"labware": {
"description": "Caller-assigned identifier, unique within its array.",
"pattern": "^[A-Za-z0-9_-]{1,32}$",
"type": "string"
},
"wells": {
"description": "A well or well range: \"A1\", \"A1:H1\" (column), \"A1:A12\" (row), or \"A1:H12\" (rectangle), expanded row-major.",
"pattern": "^[A-P](?:[1-9]|1[0-9]|2[0-4])(?::[A-P](?:[1-9]|1[0-9]|2[0-4]))?$",
"type": "string"
}
},
"required": [
"labware",
"wells"
],
"type": "object"
},
"volumeUl": {
"description": "Microlitres.",
"exclusiveMinimum": 0,
"maximum": 10000,
"type": "number"
}
},
"required": [
"kind",
"target",
"volumeUl",
"repetitions"
],
"type": "object"
},
{
"additionalProperties": false,
"properties": {
"kind": {
"const": "delay"
},
"message": {
"maxLength": 500,
"minLength": 1,
"type": "string"
},
"seconds": {
"maximum": 3600,
"minimum": 1,
"type": "integer"
}
},
"required": [
"kind",
"seconds"
],
"type": "object"
}
]
},
"maxItems": 200,
"minItems": 1,
"type": "array"
}
},
"required": [
"name",
"robot",
"pipettes",
"labware",
"liquids",
"steps",
"options"
],
"type": "object"
},
"bodyType": {
"enum": [
"json",
"form-data",
"text"
],
"type": "string"
},
"method": {
"enum": [
"POST"
],
"type": "string"
},
"type": {
"const": "http",
"type": "string"
}
},
"required": [
"type",
"method",
"bodyType",
"body"
],
"type": "object"
},
"output": {
"properties": {
"example": {
"$defs": {
"check": {
"additionalProperties": false,
"properties": {
"code": {
"type": "string"
},
"detail": {
"type": "string"
},
"status": {
"enum": [
"passed",
"failed",
"not_checked"
],
"type": "string"
}
},
"required": [
"code",
"status",
"detail"
],
"type": "object"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"properties": {
"artifacts": {
"items": {
"additionalProperties": false,
"properties": {
"href": {
"format": "uri",
"type": "string"
},
"mediaType": {
"maxLength": 128,
"minLength": 1,
"type": "string"
},
"name": {
"enum": [
"protocol.py",
"platemap.csv",
"platemap.svg",
"reagents.csv",
"simulation-log.txt",
"report.json"
],
"type": "string"
},
"sha256": {
"pattern": "^[a-f0-9]{64}$",
"type": "string"
},
"sizeBytes": {
"minimum": 0,
"type": "integer"
}
},
"required": [
"name",
"mediaType",
"sizeBytes",
"sha256",
"href"
],
"type": "object"
},
"maxItems": 6,
"type": "array"
},
"checks": {
"items": {
"$ref": "#/properties/output/properties/example/$defs/check"
},
"type": "array"
},
"expiresAt": {
"format": "date-time",
"type": "string"
},
"findings": {
"items": {
"additionalProperties": false,
"properties": {
"code": {
"type": "string"
},
"detail": {
"type": "string"
},
"severity": {
"enum": [
"error",
"warning"
],
"type": "string"
},
"step": {
"minimum": -1,
"type": "integer"
}
},
"required": [
"step",
"code",
"severity",
"detail"
],
"type": "object"
},
"maxItems": 100,
"type": "array"
},
"limitations": {
"items": {
"maxLength": 4096,
"type": "string"
},
"maxItems": 16,
"type": "array"
},
"liquids": {
"items": {
"additionalProperties": false,
"properties": {
"availableUl": {
"type": "number"
},
"consumedUl": {
"type": "number"
},
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"remainingUl": {
"type": "number"
},
"shortfallUl": {
"type": "number"
}
},
"required": [
"id",
"name",
"availableUl",
"consumedUl",
"remainingUl",
"shortfallUl"
],
"type": "object"
},
"maxItems": 32,
"type": "array"
},
"robot": {
"const": "flex"
},
"simulation": {
"additionalProperties": false,
"properties": {
"commands": {
"minimum": 0,
"type": "integer"
},
"error": {
"type": [
"string",
"null"
]
},
"ok": {
"type": "boolean"
},
"ran": {
"type": "boolean"
}
},
"required": [
"ran",
"ok",
"commands",
"error"
],
"type": "object"
},
"status": {
"enum": [
"passed",
"failed"
],
"type": "string"
},
"summary": {
"additionalProperties": false,
"properties": {
"estimatedMinutes": {
"minimum": 0,
"type": "number"
},
"labware": {
"maximum": 12,
"minimum": 0,
"type": "integer"
},
"liquids": {
"maximum": 32,
"minimum": 0,
"type": "integer"
},
"steps": {
"maximum": 200,
"minimum": 0,
"type": "integer"
},
"tipsUsed": {
"additionalProperties": {
"minimum": 0,
"type": "integer"
},
"type": "object"
},
"transfers": {
"maximum": 2000,
"minimum": 0,
"type": "integer"
}
},
"required": [
"steps",
"transfers",
"tipsUsed",
"estimatedMinutes",
"labware",
"liquids"
],
"type": "object"
},
"tools": {
"additionalProperties": false,
"properties": {
"apiLevel": {
"type": "string"
},
"opentrons": {
"type": "string"
}
},
"required": [
"opentrons",
"apiLevel"
],
"type": "object"
},
"truncated": {
"type": "boolean"
},
"warnings": {
"items": {
"maxLength": 4096,
"type": "string"
},
"maxItems": 100,
"type": "array"
},
"wells": {
"items": {
"additionalProperties": false,
"properties": {
"labware": {
"type": "string"
},
"liquids": {
"items": {
"type": "string"
},
"type": "array"
},
"volumeUl": {
"minimum": 0,
"type": "number"
},
"well": {
"type": "string"
}
},
"required": [
"labware",
"well",
"volumeUl",
"liquids"
],
"type": "object"
},
"maxItems": 100,
"type": "array"
}
},
"required": [
"status",
"tools",
"robot",
"summary",
"liquids",
"wells",
"findings",
"simulation",
"checks",
"warnings",
"limitations",
"truncated",
"expiresAt",
"artifacts"
],
"type": "object"
},
"type": {
"type": "string"
}
},
"required": [
"type"
],
"type": "object"
}
},
"required": [
"input"
],
"type": "object"
}
},
"builder-code": {
"info": {
"s": [
"cdp_sdk_server"
]
},
"schema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"properties": {
"a": {
"description": "App builder code",
"pattern": "^[a-z0-9_]{1,32}$",
"type": "string"
},
"s": {
"description": "Service builder codes",
"items": {
"pattern": "^[a-z0-9_]{1,32}$",
"type": "string"
},
"maxItems": 11,
"type": "array"
},
"w": {
"description": "Wallet builder code",
"pattern": "^[a-z0-9_]{1,32}$",
"type": "string"
}
},
"type": "object"
}
},
"eip2612GasSponsoring": {},
"erc20ApprovalGasSponsoring": {},
"payment-identifier": {
"info": {
"required": true
},
"schema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"id": {
"maxLength": 128,
"minLength": 16,
"pattern": "^[a-zA-Z0-9_-]+$",
"type": "string"
},
"required": {
"type": "boolean"
}
},
"required": [
"required"
],
"type": "object"
}
}
}Use it
curl
curl "https://lab.api.williamrobinson.dev/v1/lab/compile" # -> 402 Payment Required, accepts[] lists how to pay # retry with a PAYMENT-SIGNATURE (or PAYMENT header) once paid
JavaScript
const res = await fetch("https://lab.api.williamrobinson.dev/v1/lab/compile");
if (res.status === 402) {
const { accepts } = await res.json();
// pay one of accepts[] via an x402 client, then retry with the payment header
}Python
import httpx
res = httpx.get("https://lab.api.williamrobinson.dev/v1/lab/compile")
if res.status_code == 402:
accepts = res.json()["accepts"]
# pay one of accepts[] via an x402 client, then retry with the payment headerMachine-readable
Everything on this page is also available as clean JSON at /resources/8202.json, and this resource appears in /discovery/resources and /discovery/search.