{"openapi":"3.1.0","info":{"title":"KinoCloud API","version":"1.0.0","description":"Programmatic access to KinoCloud rendering, simulation, and credits. Authenticate with an API key (`Authorization: Bearer kc_live_*`) or a browser session."},"servers":[{"url":"/api/v1"}],"security":[{"ApiKeyAuth":[]}],"tags":[{"name":"Jobs","description":"Submit, estimate, monitor, and control render and simulation jobs."},{"name":"Credits","description":"Read the credit balance and ledger, and start credit top-ups."},{"name":"API Keys","description":"Create, list, and revoke API keys (browser session only)."},{"name":"Settings","description":"Account configuration such as BYO-license servers."},{"name":"Molecular Docking","description":"Durable experiments, runs, results, poses, interactions, and verified artifacts. Signed download URLs are short-lived capabilities and are never durable records."},{"name":"Molecular Studio","description":"The conversational director, the headless publication-render farm, and MolViewSpec (.mvsj) export. Direct a scene in plain English, render it without a browser, and hand it to other tools in an open standard."},{"name":"Molecular Projects","description":"Versioned molecular workspaces with optimistic concurrency, immutable revision history, and revision-pinned sharing."},{"name":"Public","description":"Unauthenticated endpoints used by the public site."}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"http","scheme":"bearer","bearerFormat":"kc_live_* | kc_test_*","description":"A KinoCloud API key created at POST /v1/keys."}},"schemas":{"ErrorResponse":{"type":"object","properties":{"error":{"type":"string","description":"Human-readable error message"},"code":{"description":"Machine-readable error code present on actionable failures, e.g. UNAUTHORIZED | INSUFFICIENT_SCOPE | TEST_KEY_LIVE_BILLING | INSUFFICIENT_CREDITS | NO_PAYMENT_METHOD | COST_LIMIT_EXCEEDED | RATE_LIMITED | UNSUPPORTED_SIMULATOR | UNKNOWN_TIER. See the API docs error reference for the full catalogue.","type":"string"}},"required":["error"],"additionalProperties":false},"SubmitJobRequest":{"type":"object","properties":{"jobType":{"default":"render","description":"Job type: render (frame-based DCC render), simulation (task-based), molecular (Molecular Studio publication render), or pipeline (simulation→render chain; gated — 422 PIPELINE_DISABLED unless enabled)","type":"string","enum":["render","simulation","molecular","pipeline"]},"sceneFile":{"description":"Storage key of the scene file or input dataset, returned by POST /v1/jobs/upload-url or the multipart /v1/uploads flow. Required for every job type.","type":"string"},"recovery":{"description":"Recovery policy for standard or application-level resumable jobs.","type":"object","properties":{"mode":{"default":"standard","type":"string","enum":["standard","resumable"]}},"required":["mode"],"additionalProperties":false},"frameStart":{"description":"First frame to render, inclusive (render jobs only)","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"frameEnd":{"description":"Last frame to render, inclusive (render jobs only)","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"frameStep":{"description":"Render every Nth frame of the range (render jobs only). Default 1. Billing counts only rendered frames — a 1-100 job with frameStep 10 bills 10 frames. Equivalent to the OpenJD stepped FrameRange form \"1-100:10\".","type":"number"},"parameters":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},"outputFormat":{"description":"Output image format: EXR, PNG, JPEG (render jobs only)","type":"string"},"simulator":{"description":"Scientific simulator id. Canonical values: autodock-vina, fpocket, blastp, blastn, alphafold, esmfold, swan, wavewatch3. Common aliases are accepted. Simulation jobs only.","type":"string"},"taskCount":{"description":"Number of independent parallel tasks (simulation jobs only)","type":"integer","minimum":1,"maximum":9007199254740991},"simulationParams":{"description":"Validated simulator-specific parameters","type":"object","properties":{"receptorPdbId":{"type":"string","pattern":"^[0-9][A-Za-z0-9]{3}$"},"receptorArtifact":{"type":"object","properties":{"schema":{"type":"string","const":"kinocloud.docking.artifact/v1"},"artifactId":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]*$"},"storageKey":{"type":"string","minLength":1,"maxLength":2048},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"byteSize":{"type":"integer","minimum":0,"maximum":9007199254740991},"mediaType":{"type":"string","minLength":1,"maxLength":255},"format":{"type":"string","enum":["pdb","mmcif","pdbqt","sdf","mol2","json","log"]}},"required":["schema","artifactId","storageKey","sha256","byteSize","mediaType","format"],"additionalProperties":false},"receptorAssemblyId":{"type":"string","minLength":1,"maxLength":32},"receptorModel":{"type":"integer","minimum":1,"maximum":9999},"receptorChains":{"minItems":1,"maxItems":128,"type":"array","items":{"type":"string","minLength":1,"maxLength":16}},"ligandIdentity":{"type":"object","properties":{"ligandId":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]*$"},"label":{"type":"string","minLength":1,"maxLength":512},"source":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","const":"ccd"},"componentId":{"type":"string","minLength":1,"maxLength":8,"pattern":"^[A-Za-z0-9]{1,8}$"}},"required":["kind","componentId"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"smiles"},"smiles":{"type":"string","minLength":1,"maxLength":4096}},"required":["kind","smiles"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"artifact"},"artifact":{"type":"object","properties":{"schema":{"type":"string","const":"kinocloud.docking.artifact/v1"},"artifactId":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]*$"},"storageKey":{"type":"string","minLength":1,"maxLength":2048},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"byteSize":{"type":"integer","minimum":0,"maximum":9007199254740991},"mediaType":{"type":"string","minLength":1,"maxLength":255},"format":{"type":"string","enum":["pdb","mmcif","pdbqt","sdf","mol2","json","log"]}},"required":["schema","artifactId","storageKey","sha256","byteSize","mediaType","format"],"additionalProperties":false}},"required":["kind","artifact"],"additionalProperties":false}]},"confirmation":{"type":"object","properties":{"token":{"type":"string","minLength":32,"maxLength":8192},"query":{"type":"string","minLength":1,"maxLength":512},"sourceId":{"type":"string","minLength":1,"maxLength":128}},"required":["token","query","sourceId"],"additionalProperties":false},"preparation":{"default":{"protonationPh":7.4,"addHydrogens":true,"generate3d":true},"type":"object","properties":{"protonationPh":{"default":7.4,"type":"number","minimum":0,"maximum":14},"addHydrogens":{"default":true,"type":"boolean","const":true},"generate3d":{"default":true,"type":"boolean","const":true}},"required":["protonationPh","addHydrogens","generate3d"],"additionalProperties":false}},"required":["ligandId","label","source","preparation"],"additionalProperties":false},"ligandLibrary":{"description":"Batch (virtual-screening) ligand library — one docking task per entry, in place of a single ligandIdentity (simulation jobs only)","minItems":1,"maxItems":10000,"type":"array","items":{"type":"object","properties":{"ligandId":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]*$"},"label":{"type":"string","minLength":1,"maxLength":512},"source":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","const":"ccd"},"componentId":{"type":"string","minLength":1,"maxLength":8,"pattern":"^[A-Za-z0-9]{1,8}$"}},"required":["kind","componentId"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"smiles"},"smiles":{"type":"string","minLength":1,"maxLength":4096}},"required":["kind","smiles"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"artifact"},"artifact":{"type":"object","properties":{"schema":{"type":"string","const":"kinocloud.docking.artifact/v1"},"artifactId":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]*$"},"storageKey":{"type":"string","minLength":1,"maxLength":2048},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"byteSize":{"type":"integer","minimum":0,"maximum":9007199254740991},"mediaType":{"type":"string","minLength":1,"maxLength":255},"format":{"type":"string","enum":["pdb","mmcif","pdbqt","sdf","mol2","json","log"]}},"required":["schema","artifactId","storageKey","sha256","byteSize","mediaType","format"],"additionalProperties":false}},"required":["kind","artifact"],"additionalProperties":false}]},"confirmation":{"type":"object","properties":{"token":{"type":"string","minLength":32,"maxLength":8192},"query":{"type":"string","minLength":1,"maxLength":512},"sourceId":{"type":"string","minLength":1,"maxLength":128}},"required":["token","query","sourceId"],"additionalProperties":false},"preparation":{"default":{"protonationPh":7.4,"addHydrogens":true,"generate3d":true},"type":"object","properties":{"protonationPh":{"default":7.4,"type":"number","minimum":0,"maximum":14},"addHydrogens":{"default":true,"type":"boolean","const":true},"generate3d":{"default":true,"type":"boolean","const":true}},"required":["protonationPh","addHydrogens","generate3d"],"additionalProperties":false}},"required":["ligandId","label","source","preparation"],"additionalProperties":false}},"receptorPreparation":{"type":"object","properties":{"protonationPh":{"default":7.4,"type":"number","minimum":0,"maximum":14},"addHydrogens":{"default":true,"type":"boolean","const":true},"protonationMethod":{"default":"pdb2pqr-propka","type":"string","enum":["pdb2pqr-propka","meeko"]},"forceField":{"default":"AMBER","type":"string","enum":["AMBER","CHARMM","PARSE"]},"fixedProtonationStates":{"default":[],"maxItems":256,"type":"array","items":{"type":"object","properties":{"chain":{"type":"string","minLength":1,"maxLength":16},"residue":{"type":"integer","minimum":-9999,"maximum":99999},"residueName":{"type":"string","enum":["ASP","GLU"]},"state":{"type":"string","enum":["anionic","neutral"]},"insertionCode":{"type":"string","maxLength":4},"reason":{"type":"string","minLength":1,"maxLength":512}},"required":["chain","residue","residueName","state"],"additionalProperties":false}},"removeComponents":{"default":[],"maxItems":256,"type":"array","items":{"type":"string","minLength":1,"maxLength":8,"pattern":"^[A-Za-z0-9]{1,8}$"}},"retainComponents":{"default":[],"maxItems":256,"type":"array","items":{"type":"string","minLength":1,"maxLength":8,"pattern":"^[A-Za-z0-9]{1,8}$"}}},"required":["protonationPh","addHydrogens","protonationMethod","forceField","fixedProtonationStates","removeComponents","retainComponents"],"additionalProperties":false},"dockingValidation":{"type":"object","properties":{"nativeReference":{"type":"object","properties":{"componentId":{"type":"string","minLength":1,"maxLength":8,"pattern":"^[A-Za-z0-9]{1,8}$"},"chain":{"type":"string","minLength":1,"maxLength":16},"residue":{"type":"integer","minimum":-9999,"maximum":99999},"insertionCode":{"type":"string","maxLength":4}},"required":["componentId","chain","residue"],"additionalProperties":false}},"additionalProperties":false},"dockingExecution":{"type":"object","properties":{"shardSize":{"default":1,"type":"integer","minimum":1,"maximum":10},"preparedReceptor":{"type":"object","properties":{"cacheKey":{"type":"string","pattern":"^[a-f0-9]{64}$"},"receptorIdentitySha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"preparationSha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"toolchainSha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"workerImageDigest":{"type":"string","pattern":"^sha256:[a-f0-9]{64}$"},"artifact":{"type":"object","properties":{"schema":{"type":"string","const":"kinocloud.docking.artifact/v1"},"artifactId":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]*$"},"storageKey":{"type":"string","minLength":1,"maxLength":2048},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"byteSize":{"type":"integer","minimum":0,"maximum":9007199254740991},"mediaType":{"type":"string","minLength":1,"maxLength":255},"format":{"type":"string","enum":["pdb","mmcif","pdbqt","sdf","mol2","json","log"]}},"required":["schema","artifactId","storageKey","sha256","byteSize","mediaType","format"],"additionalProperties":false}},"required":["cacheKey","receptorIdentitySha256","preparationSha256","toolchainSha256","workerImageDigest"],"additionalProperties":false}},"required":["shardSize"],"additionalProperties":false},"pocketLigand":{"type":"string","minLength":1,"maxLength":8},"pocketLigandChain":{"type":"string","minLength":1,"maxLength":16},"pocketLigandResidue":{"type":"integer","minimum":-9999,"maximum":99999},"pocketResidues":{"minItems":1,"maxItems":256,"type":"array","items":{"type":"object","properties":{"chain":{"type":"string","minLength":1,"maxLength":16},"residue":{"type":"integer","minimum":-9999,"maximum":99999},"insertionCode":{"type":"string","maxLength":4}},"required":["chain","residue"],"additionalProperties":false}},"boxCenterAngstrom":{"type":"array","prefixItems":[{"type":"number"},{"type":"number"},{"type":"number"}]},"boxSizeAngstrom":{"anyOf":[{"type":"number","minimum":1,"maximum":100},{"type":"array","prefixItems":[{"type":"number","minimum":1,"maximum":100},{"type":"number","minimum":1,"maximum":100},{"type":"number","minimum":1,"maximum":100}]}]},"exhaustiveness":{"type":"integer","minimum":1,"maximum":128},"numModes":{"type":"integer","minimum":1,"maximum":100},"energyRangeKcalMol":{"type":"number","minimum":0.1,"maximum":100},"seed":{"type":"integer","minimum":-2147483648,"maximum":2147483647},"cpuThreads":{"type":"integer","minimum":1,"maximum":256},"estimatedRuntimeSeconds":{"type":"number","exclusiveMinimum":0,"maximum":2592000},"foldModel":{"type":"string","enum":["esmfold","alphafold"]},"blastDatabasePath":{"type":"string","minLength":1,"maxLength":1024},"blastDatabaseName":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9._+-]{0,127}$"},"blastDatabaseVersion":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9._+-]{0,127}$"},"blastDatabaseDate":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"blastDatabaseType":{"type":"string","enum":["prot","nucl"]},"blastDatabaseChecksum":{"type":"string","pattern":"^[a-fA-F0-9]{64}$"},"blastEvalue":{"type":"number","minimum":1e-300,"maximum":1000},"blastMaxHits":{"type":"integer","minimum":1,"maximum":1000},"blastThreads":{"type":"integer","minimum":1,"maximum":64},"blastTimeoutSeconds":{"type":"integer","minimum":1,"maximum":86400},"blastMaxOutputBytes":{"type":"integer","minimum":1024,"maximum":67108864},"maxPockets":{"description":"fpocket: how many ranked pockets to return (default 10)","type":"integer","minimum":1,"maximum":20}},"additionalProperties":false},"idempotencyKey":{"type":"string","minLength":8,"maxLength":255},"dockingRequest":{"type":"object","properties":{"requestId":{"type":"string","minLength":1,"maxLength":255},"runId":{"type":"string","minLength":1,"maxLength":255},"idempotencyKey":{"type":"string","minLength":8,"maxLength":255}},"required":["requestId","runId","idempotencyKey"],"additionalProperties":false},"metadata":{"description":"Job metadata; unknown keys are preserved for plugin/worker use","type":"object","properties":{"software":{"description":"Render host/engine, e.g. blender, maya arnold — drives script routing + pricing","type":"string"},"renderer":{"description":"Fallback engine string when software is unset","type":"string"},"instanceType":{"description":"Deprecated compatibility field ignored by authenticated pricing and dispatch","type":"string"},"renderTimeMinutes":{"type":"number"},"taskRuntimeMinutes":{"type":"number"},"totalSizeGB":{"type":"number"},"resolution":{"description":"WIDTHxHEIGHT (molecular jobs)","type":"string"},"fps":{"description":"Frame rate (molecular jobs)","type":"number"},"renderEngine":{"description":"Molecular render tier: 'molstar' (raster) or 'cycles' (ray-traced)","type":"string"},"samples":{"description":"Cycles samples per frame (molecular cinematic)","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"additionalProperties":{}},"priority":{"description":"Deprecated input retained for compatibility. Queue priority is assigned by the server from the account plan; client-supplied values are ignored.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"jobName":{"description":"Human-readable label shown in the dashboard and logs","type":"string"},"attachments":{"description":"Additional storage keys for asset files referenced by the scene","type":"array","items":{"type":"string"}}},"required":["jobType"],"additionalProperties":false},"SubmitJobResponse":{"type":"object","properties":{"jobId":{"type":"string","description":"Unique job identifier — use this for status, outputs, and cancel calls"},"jobType":{"type":"string","description":"Echoed job type: render, simulation, molecular, or pipeline"},"estimatedCost":{"type":"number","description":"Estimated cost in the currency field, e.g. 0.42"},"currency":{"type":"string","description":"Three-letter currency code, e.g. USD"},"status":{"type":"string","description":"Initial job status, always SUBMITTED"},"provider":{"type":"string","description":"Cloud provider handling this job, e.g. aws-deadline or azure-batch"},"idempotentReplay":{"description":"True when this response was replayed from a matching Idempotency-Key","type":"boolean"},"message":{"type":"string","description":"Human-readable confirmation message"}},"required":["jobId","jobType","estimatedCost","currency","status","provider","message"],"additionalProperties":false},"EstimateJobRequest":{"type":"object","properties":{"jobType":{"default":"render","description":"Job type to quote — mirrors POST /v1/jobs/submit","type":"string","enum":["render","simulation","molecular"]},"frameStart":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"frameEnd":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"frameStep":{"description":"Render every Nth frame — quotes only rendered frames (mirrors submit)","type":"integer","minimum":1,"maximum":9007199254740991},"parameters":{"description":"JobBundle-style params, e.g. { \"FrameRange\": \"1-10\" }","type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},"simulator":{"description":"Scientific simulator id. Canonical values: autodock-vina, fpocket, blastp, blastn, alphafold, esmfold, swan, wavewatch3. Common aliases are accepted.","type":"string"},"taskCount":{"description":"Number of independent tasks","type":"integer","minimum":1,"maximum":9007199254740991},"simulationParams":{"description":"Validated simulator-specific parameters","type":"object","properties":{"receptorPdbId":{"type":"string","pattern":"^[0-9][A-Za-z0-9]{3}$"},"receptorArtifact":{"type":"object","properties":{"schema":{"type":"string","const":"kinocloud.docking.artifact/v1"},"artifactId":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]*$"},"storageKey":{"type":"string","minLength":1,"maxLength":2048},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"byteSize":{"type":"integer","minimum":0,"maximum":9007199254740991},"mediaType":{"type":"string","minLength":1,"maxLength":255},"format":{"type":"string","enum":["pdb","mmcif","pdbqt","sdf","mol2","json","log"]}},"required":["schema","artifactId","storageKey","sha256","byteSize","mediaType","format"],"additionalProperties":false},"receptorAssemblyId":{"type":"string","minLength":1,"maxLength":32},"receptorModel":{"type":"integer","minimum":1,"maximum":9999},"receptorChains":{"minItems":1,"maxItems":128,"type":"array","items":{"type":"string","minLength":1,"maxLength":16}},"ligandIdentity":{"type":"object","properties":{"ligandId":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]*$"},"label":{"type":"string","minLength":1,"maxLength":512},"source":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","const":"ccd"},"componentId":{"type":"string","minLength":1,"maxLength":8,"pattern":"^[A-Za-z0-9]{1,8}$"}},"required":["kind","componentId"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"smiles"},"smiles":{"type":"string","minLength":1,"maxLength":4096}},"required":["kind","smiles"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"artifact"},"artifact":{"type":"object","properties":{"schema":{"type":"string","const":"kinocloud.docking.artifact/v1"},"artifactId":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]*$"},"storageKey":{"type":"string","minLength":1,"maxLength":2048},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"byteSize":{"type":"integer","minimum":0,"maximum":9007199254740991},"mediaType":{"type":"string","minLength":1,"maxLength":255},"format":{"type":"string","enum":["pdb","mmcif","pdbqt","sdf","mol2","json","log"]}},"required":["schema","artifactId","storageKey","sha256","byteSize","mediaType","format"],"additionalProperties":false}},"required":["kind","artifact"],"additionalProperties":false}]},"confirmation":{"type":"object","properties":{"token":{"type":"string","minLength":32,"maxLength":8192},"query":{"type":"string","minLength":1,"maxLength":512},"sourceId":{"type":"string","minLength":1,"maxLength":128}},"required":["token","query","sourceId"],"additionalProperties":false},"preparation":{"default":{"protonationPh":7.4,"addHydrogens":true,"generate3d":true},"type":"object","properties":{"protonationPh":{"default":7.4,"type":"number","minimum":0,"maximum":14},"addHydrogens":{"default":true,"type":"boolean","const":true},"generate3d":{"default":true,"type":"boolean","const":true}},"required":["protonationPh","addHydrogens","generate3d"],"additionalProperties":false}},"required":["ligandId","label","source","preparation"],"additionalProperties":false},"ligandLibrary":{"description":"Batch (virtual-screening) ligand library — one docking task per entry, in place of a single ligandIdentity (simulation jobs only)","minItems":1,"maxItems":10000,"type":"array","items":{"type":"object","properties":{"ligandId":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]*$"},"label":{"type":"string","minLength":1,"maxLength":512},"source":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","const":"ccd"},"componentId":{"type":"string","minLength":1,"maxLength":8,"pattern":"^[A-Za-z0-9]{1,8}$"}},"required":["kind","componentId"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"smiles"},"smiles":{"type":"string","minLength":1,"maxLength":4096}},"required":["kind","smiles"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"artifact"},"artifact":{"type":"object","properties":{"schema":{"type":"string","const":"kinocloud.docking.artifact/v1"},"artifactId":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]*$"},"storageKey":{"type":"string","minLength":1,"maxLength":2048},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"byteSize":{"type":"integer","minimum":0,"maximum":9007199254740991},"mediaType":{"type":"string","minLength":1,"maxLength":255},"format":{"type":"string","enum":["pdb","mmcif","pdbqt","sdf","mol2","json","log"]}},"required":["schema","artifactId","storageKey","sha256","byteSize","mediaType","format"],"additionalProperties":false}},"required":["kind","artifact"],"additionalProperties":false}]},"confirmation":{"type":"object","properties":{"token":{"type":"string","minLength":32,"maxLength":8192},"query":{"type":"string","minLength":1,"maxLength":512},"sourceId":{"type":"string","minLength":1,"maxLength":128}},"required":["token","query","sourceId"],"additionalProperties":false},"preparation":{"default":{"protonationPh":7.4,"addHydrogens":true,"generate3d":true},"type":"object","properties":{"protonationPh":{"default":7.4,"type":"number","minimum":0,"maximum":14},"addHydrogens":{"default":true,"type":"boolean","const":true},"generate3d":{"default":true,"type":"boolean","const":true}},"required":["protonationPh","addHydrogens","generate3d"],"additionalProperties":false}},"required":["ligandId","label","source","preparation"],"additionalProperties":false}},"receptorPreparation":{"type":"object","properties":{"protonationPh":{"default":7.4,"type":"number","minimum":0,"maximum":14},"addHydrogens":{"default":true,"type":"boolean","const":true},"protonationMethod":{"default":"pdb2pqr-propka","type":"string","enum":["pdb2pqr-propka","meeko"]},"forceField":{"default":"AMBER","type":"string","enum":["AMBER","CHARMM","PARSE"]},"fixedProtonationStates":{"default":[],"maxItems":256,"type":"array","items":{"type":"object","properties":{"chain":{"type":"string","minLength":1,"maxLength":16},"residue":{"type":"integer","minimum":-9999,"maximum":99999},"residueName":{"type":"string","enum":["ASP","GLU"]},"state":{"type":"string","enum":["anionic","neutral"]},"insertionCode":{"type":"string","maxLength":4},"reason":{"type":"string","minLength":1,"maxLength":512}},"required":["chain","residue","residueName","state"],"additionalProperties":false}},"removeComponents":{"default":[],"maxItems":256,"type":"array","items":{"type":"string","minLength":1,"maxLength":8,"pattern":"^[A-Za-z0-9]{1,8}$"}},"retainComponents":{"default":[],"maxItems":256,"type":"array","items":{"type":"string","minLength":1,"maxLength":8,"pattern":"^[A-Za-z0-9]{1,8}$"}}},"required":["protonationPh","addHydrogens","protonationMethod","forceField","fixedProtonationStates","removeComponents","retainComponents"],"additionalProperties":false},"dockingValidation":{"type":"object","properties":{"nativeReference":{"type":"object","properties":{"componentId":{"type":"string","minLength":1,"maxLength":8,"pattern":"^[A-Za-z0-9]{1,8}$"},"chain":{"type":"string","minLength":1,"maxLength":16},"residue":{"type":"integer","minimum":-9999,"maximum":99999},"insertionCode":{"type":"string","maxLength":4}},"required":["componentId","chain","residue"],"additionalProperties":false}},"additionalProperties":false},"dockingExecution":{"type":"object","properties":{"shardSize":{"default":1,"type":"integer","minimum":1,"maximum":10},"preparedReceptor":{"type":"object","properties":{"cacheKey":{"type":"string","pattern":"^[a-f0-9]{64}$"},"receptorIdentitySha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"preparationSha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"toolchainSha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"workerImageDigest":{"type":"string","pattern":"^sha256:[a-f0-9]{64}$"},"artifact":{"type":"object","properties":{"schema":{"type":"string","const":"kinocloud.docking.artifact/v1"},"artifactId":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]*$"},"storageKey":{"type":"string","minLength":1,"maxLength":2048},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"byteSize":{"type":"integer","minimum":0,"maximum":9007199254740991},"mediaType":{"type":"string","minLength":1,"maxLength":255},"format":{"type":"string","enum":["pdb","mmcif","pdbqt","sdf","mol2","json","log"]}},"required":["schema","artifactId","storageKey","sha256","byteSize","mediaType","format"],"additionalProperties":false}},"required":["cacheKey","receptorIdentitySha256","preparationSha256","toolchainSha256","workerImageDigest"],"additionalProperties":false}},"required":["shardSize"],"additionalProperties":false},"pocketLigand":{"type":"string","minLength":1,"maxLength":8},"pocketLigandChain":{"type":"string","minLength":1,"maxLength":16},"pocketLigandResidue":{"type":"integer","minimum":-9999,"maximum":99999},"pocketResidues":{"minItems":1,"maxItems":256,"type":"array","items":{"type":"object","properties":{"chain":{"type":"string","minLength":1,"maxLength":16},"residue":{"type":"integer","minimum":-9999,"maximum":99999},"insertionCode":{"type":"string","maxLength":4}},"required":["chain","residue"],"additionalProperties":false}},"boxCenterAngstrom":{"type":"array","prefixItems":[{"type":"number"},{"type":"number"},{"type":"number"}]},"boxSizeAngstrom":{"anyOf":[{"type":"number","minimum":1,"maximum":100},{"type":"array","prefixItems":[{"type":"number","minimum":1,"maximum":100},{"type":"number","minimum":1,"maximum":100},{"type":"number","minimum":1,"maximum":100}]}]},"exhaustiveness":{"type":"integer","minimum":1,"maximum":128},"numModes":{"type":"integer","minimum":1,"maximum":100},"energyRangeKcalMol":{"type":"number","minimum":0.1,"maximum":100},"seed":{"type":"integer","minimum":-2147483648,"maximum":2147483647},"cpuThreads":{"type":"integer","minimum":1,"maximum":256},"estimatedRuntimeSeconds":{"type":"number","exclusiveMinimum":0,"maximum":2592000},"foldModel":{"type":"string","enum":["esmfold","alphafold"]},"blastDatabasePath":{"type":"string","minLength":1,"maxLength":1024},"blastDatabaseName":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9._+-]{0,127}$"},"blastDatabaseVersion":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9._+-]{0,127}$"},"blastDatabaseDate":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"blastDatabaseType":{"type":"string","enum":["prot","nucl"]},"blastDatabaseChecksum":{"type":"string","pattern":"^[a-fA-F0-9]{64}$"},"blastEvalue":{"type":"number","minimum":1e-300,"maximum":1000},"blastMaxHits":{"type":"integer","minimum":1,"maximum":1000},"blastThreads":{"type":"integer","minimum":1,"maximum":64},"blastTimeoutSeconds":{"type":"integer","minimum":1,"maximum":86400},"blastMaxOutputBytes":{"type":"integer","minimum":1024,"maximum":67108864},"maxPockets":{"description":"fpocket: how many ranked pockets to return (default 10)","type":"integer","minimum":1,"maximum":20}},"additionalProperties":false},"metadata":{"type":"object","properties":{"software":{"type":"string"},"renderer":{"type":"string"},"totalSizeGB":{"type":"number"},"instanceType":{"description":"Deprecated compatibility field ignored by authenticated pricing and dispatch","type":"string"},"renderTimeMinutes":{"type":"number"},"taskRuntimeMinutes":{"type":"number"},"resolution":{"description":"WIDTHxHEIGHT (molecular estimates)","type":"string"},"fps":{"description":"Frame rate (molecular estimates)","type":"number"},"renderEngine":{"description":"Molecular render tier: 'molstar' (raster) or 'cycles' (ray-traced)","type":"string"},"samples":{"description":"Cycles samples per frame (molecular cinematic tier)","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"additionalProperties":false},"recovery":{"description":"Recovery policy for standard or application-level resumable jobs.","type":"object","properties":{"mode":{"default":"standard","type":"string","enum":["standard","resumable"]}},"required":["mode"],"additionalProperties":false}},"required":["jobType"],"additionalProperties":false},"EstimateJobResponse":{"type":"object","properties":{"estimatedCost":{"type":"number"},"currency":{"type":"string"},"hasLicenseFee":{"type":"boolean"},"licenseNames":{"type":"array","items":{"type":"string"}},"breakdown":{"description":"Per-component cost breakdown (compute, software, storage, egress, start fee)","type":"object","properties":{"compute":{"type":"number"},"software":{"type":"number"},"storage":{"type":"number"},"egress":{"type":"number"},"startFee":{"type":"number"}},"required":["compute","software","storage","egress","startFee"],"additionalProperties":false},"variableRates":{"description":"Resolved per-unit rates used in the estimate","type":"object","properties":{"hardwareRate":{"type":"number"},"egressRate":{"type":"number"}},"required":["hardwareRate","egressRate"],"additionalProperties":false}},"required":["estimatedCost","currency"],"additionalProperties":false},"UploadUrlRequest":{"type":"object","properties":{"filename":{"type":"string","minLength":1,"description":"Original filename; used for content-type detection and output naming"},"contentType":{"type":"string","minLength":1,"description":"MIME type of the file, e.g. application/x-blend, model/obj, application/octet-stream"},"size":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"File size in bytes; used to pre-validate storage quota"},"sha256":{"description":"Optional 64-character hexadecimal SHA-256 of the entire file, not a base64 per-part checksum; stored as object metadata for worker-side integrity checks","type":"string","pattern":"^[a-fA-F0-9]{64}$"},"projectId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Shared UUID for every object in one project package; requires logicalPath"},"logicalPath":{"type":"string","minLength":1,"pattern":"^(?!\\/)(?!.*(?:^|\\/)\\.{1,2}(?:\\/|$))(?!.*\\/\\/)(?!.*\\\\)(?!.*\\0).+$","description":"Project-relative POSIX path with no absolute prefix, backslash, empty segment, dot, or traversal segment; requires projectId"}},"required":["filename","contentType","size"],"additionalProperties":false},"UploadUrlResponse":{"type":"object","properties":{"uploadUrl":{"type":"string","description":"Presigned PUT URL — upload the file directly from the client to this URL, expires in expiresIn seconds"},"s3Key":{"type":"string","description":"Storage key to pass as sceneFile when calling POST /v1/jobs/submit"},"method":{"type":"string","description":"HTTP method for the upload, always PUT"},"expiresIn":{"type":"number","description":"URL expiry in seconds, typically 3600"},"headers":{"description":"Additional headers to include in the PUT request, e.g. Content-Type","type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},"provider":{"type":"string","description":"Storage provider handling the upload: aws-s3 or azure-blob"}},"required":["uploadUrl","s3Key","method","expiresIn","provider"],"additionalProperties":false},"MultipartInitRequest":{"type":"object","properties":{"filename":{"type":"string","minLength":1,"description":"Original filename; used for output naming"},"contentType":{"type":"string","minLength":1,"description":"MIME type of the final object"},"size":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Total object size in bytes"},"partSize":{"description":"Desired part size in bytes; clamped to provider limits (S3 ≥5 MiB)","type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"sha256":{"description":"Optional 64-character hexadecimal SHA-256 of the entire final file, not a base64 per-part checksum; verified at completion","type":"string","pattern":"^[a-fA-F0-9]{64}$"},"projectId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Shared UUID for every object in one project package; requires logicalPath"},"logicalPath":{"type":"string","minLength":1,"pattern":"^(?!\\/)(?!.*(?:^|\\/)\\.{1,2}(?:\\/|$))(?!.*\\/\\/)(?!.*\\\\)(?!.*\\0).+$","description":"Project-relative POSIX path with no absolute prefix, backslash, empty segment, dot, or traversal segment; requires projectId"},"jobType":{"description":"Optional job-type hint recorded for observability","type":"string"},"checksumAlgorithm":{"description":"Opt in to store-enforced per-part checksums (S3 only). When active, no inline part URLs are returned — mint each via POST /v1/uploads/{uploadId}/parts with that part's base64 SHA-256, which the store verifies against the uploaded bytes.","type":"string","const":"sha256"}},"required":["filename","contentType","size"],"additionalProperties":false},"MultipartInitResponse":{"type":"object","properties":{"uploadId":{"type":"string","description":"Opaque handle to pass to the status/complete/abort endpoints"},"key":{"type":"string","description":"Storage key the parts assemble into (submit as sceneFile)"},"partSize":{"type":"number","description":"Bytes per part (the last part may be smaller)"},"partCount":{"type":"number","description":"Total number of parts to upload"},"parts":{"type":"array","items":{"type":"object","properties":{"partNumber":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"1-based part number (upload order)"},"url":{"type":"string","description":"Presigned PUT URL for this part’s bytes"}},"required":["partNumber","url"],"additionalProperties":false},"description":"First page of presigned part URLs (at most 1,000; empty in checksum mode). URLs for remaining parts — or replacements for expired ones — come from POST /v1/uploads/{uploadId}/parts."},"headers":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"description":"Headers to send with each part PUT (usually empty)"},"expiresIn":{"type":"number","description":"Seconds until the presigned part URLs expire"},"provider":{"type":"string","description":"Storage provider handling the upload: aws or azure"},"checksumAlgorithm":{"anyOf":[{"type":"string","enum":["sha256"]},{"type":"null"}],"description":"Store-enforced checksum algorithm in effect, or null when unavailable"}},"required":["uploadId","key","partSize","partCount","parts","headers","expiresIn","provider","checksumAlgorithm"],"additionalProperties":false},"MultipartStatusResponse":{"type":"object","properties":{"uploadId":{"type":"string"},"key":{"type":"string"},"partSize":{"type":"number"},"partCount":{"type":"number"},"received":{"type":"array","items":{"type":"object","properties":{"partNumber":{"type":"number"},"etag":{"type":"string"},"size":{"type":"number"}},"required":["partNumber","etag"],"additionalProperties":false},"description":"Parts already stored"},"missing":{"type":"array","items":{"type":"number"},"description":"Part numbers still to upload"},"complete":{"type":"boolean","description":"True when every part has been received"},"provider":{"type":"string"}},"required":["uploadId","key","partSize","partCount","received","missing","complete","provider"],"additionalProperties":false},"MultipartPartUrlsRequest":{"type":"object","properties":{"parts":{"minItems":1,"maxItems":1000,"type":"array","items":{"type":"object","properties":{"partNumber":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"1-based part number to mint a URL for"},"checksumSha256":{"description":"Base64 of this part's raw SHA-256 digest. Required (per part) when the upload was initiated with checksumAlgorithm sha256; forbidden otherwise.","type":"string","pattern":"^[A-Za-z0-9+/]{43}=$"}},"required":["partNumber"],"additionalProperties":false},"description":"Parts to mint presigned PUT URLs for (also re-mints expired URLs)"}},"required":["parts"],"additionalProperties":false},"MultipartPartUrlsResponse":{"type":"object","properties":{"uploadId":{"type":"string"},"parts":{"type":"array","items":{"type":"object","properties":{"partNumber":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"1-based part number (upload order)"},"url":{"type":"string","description":"Presigned PUT URL for this part’s bytes"},"headers":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"description":"Headers this specific part PUT must carry (e.g. the signed checksum)"}},"required":["partNumber","url","headers"],"additionalProperties":false},"description":"Minted part URLs"},"partSize":{"type":"number"},"partCount":{"type":"number"},"expiresIn":{"type":"number","description":"Seconds until the minted URLs expire"},"provider":{"type":"string"}},"required":["uploadId","parts","partSize","partCount","expiresIn","provider"],"additionalProperties":false},"MultipartCompleteRequest":{"type":"object","properties":{"parts":{"minItems":1,"type":"array","items":{"type":"object","properties":{"partNumber":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"etag":{"description":"ETag the part PUT returned (S3); ignored by Azure","type":"string"},"checksumSha256":{"description":"Base64 of this part's raw SHA-256. Required per part for checksum-mode uploads; the store validates each value against the checksum recorded at part upload.","type":"string","pattern":"^[A-Za-z0-9+/]{43}=$"}},"required":["partNumber"],"additionalProperties":false},"description":"The parts the client finished uploading"},"sha256":{"description":"Optional 64-character hexadecimal SHA-256 of the entire final file, not a base64 per-part checksum","type":"string","pattern":"^[a-fA-F0-9]{64}$"}},"required":["parts"],"additionalProperties":false},"MultipartCompleteResponse":{"type":"object","properties":{"key":{"type":"string","description":"Verified storage key; submit as sceneFile to POST /v1/jobs/submit"},"size":{"type":"number","description":"Final assembled object size in bytes"},"etag":{"description":"Final object entity tag","type":"string"},"verified":{"type":"boolean","description":"Always true on success (passed the integrity gate)"},"integrity":{"type":"string","enum":["parts-sha256","size"],"description":"'parts-sha256': the store cryptographically verified every part's bytes (checksum mode). 'size': byte-count integrity gate only."},"provider":{"type":"string"}},"required":["key","size","verified","integrity","provider"],"additionalProperties":false},"CreateApiKeyRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Human-readable label for the key, shown in the dashboard"},"environment":{"default":"live","description":"live keys can call billing endpoints and submit real jobs; test keys cannot trigger charges","type":"string","enum":["live","test"]},"scopes":{"minItems":1,"type":"array","items":{"type":"string","enum":["jobs:read","jobs:write","credits:read","convert","molecular:chat","projects:read","projects:write"]},"description":"Permissions granted to this key: jobs:read, jobs:write, credits:read"}},"required":["name","environment","scopes"],"additionalProperties":false},"CreditBalanceResponse":{"type":"object","properties":{"wallet_cents":{"type":"number","description":"Purchased and promotional wallet balance, in GBP pence"},"wallet_held_cents":{"type":"number","description":"Wallet credits reserved for in-flight jobs, in GBP pence"},"wallet_available_cents":{"type":"number","description":"Non-expiring purchased wallet credits currently available, in GBP pence"},"monthly_cents":{"type":"number","description":"Current Pro monthly allowance balance, in GBP pence"},"monthly_held_cents":{"type":"number","description":"Pro monthly allowance reserved for in-flight jobs, in GBP pence"},"monthly_available_cents":{"type":"number","description":"Pro monthly allowance currently available, in GBP pence"},"monthly_reset_at":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO timestamp when the active Pro allowance resets; null without an active period"},"total_credited_cents":{"type":"number","description":"Combined wallet and monthly balance, in GBP pence"},"held_cents":{"type":"number","description":"All credits currently reserved for in-flight jobs, in GBP pence"},"available_cents":{"type":"number","description":"Combined wallet and monthly credits available to spend, in GBP pence"},"available_display":{"type":"string","description":"Human-readable GBP available balance, e.g. \"£12.34\""}},"required":["wallet_cents","wallet_held_cents","wallet_available_cents","monthly_cents","monthly_held_cents","monthly_available_cents","monthly_reset_at","total_credited_cents","held_cents","available_cents","available_display"],"additionalProperties":false},"CreditTopupRequest":{"type":"object","properties":{"tierId":{"type":"string","enum":["topup-10","topup-50","topup-200","topup-500"],"description":"Top-up tier id; the amount and any bonus credits are resolved server-side"},"successUrl":{"description":"Where Stripe redirects after a successful payment; defaults to /dashboard?topup=success","type":"string"},"cancelUrl":{"description":"Where Stripe redirects if the payment is cancelled; defaults to /dashboard?topup=cancelled","type":"string"}},"required":["tierId"],"additionalProperties":false},"CreditTopupResponse":{"type":"object","properties":{"url":{"type":"string","description":"Stripe-hosted Checkout URL — redirect the browser here to complete payment"},"tierId":{"type":"string","description":"Echoed tier id that was purchased"}},"required":["url","tierId"],"additionalProperties":false},"PublicEstimateRequest":{"type":"object","properties":{"mode":{"default":"animation","description":"animation prices a frame range; still prices a fixed image count","type":"string","enum":["animation","still"]},"jobType":{"default":"render","description":"render prices frames/stills; simulation prices per-task node hours","type":"string","enum":["render","simulation"]},"durationMinutes":{"default":0,"description":"Animation length, minutes (animation mode)","type":"number"},"durationSeconds":{"default":0,"description":"Animation length, seconds (animation mode)","type":"number"},"fps":{"default":24,"description":"Frames per second used to derive frame count (animation mode)","type":"number"},"imageCount":{"default":1,"description":"Number of stills to render (still mode)","type":"number"},"renderTimeMinutes":{"default":10,"description":"Estimated render time per frame, minutes","type":"number"},"hardware":{"default":"g4dn.xlarge","description":"Instance type, e.g. g4dn.xlarge","type":"string"},"software":{"default":"blender","description":"Renderer/software, e.g. blender, maya, nuke","type":"string"},"region":{"default":"us-west-2","description":"Cloud region used to resolve per-unit rates","type":"string"},"datasetSizeTB":{"default":1,"description":"Input dataset size in TB; drives storage and egress cost","type":"number"}},"required":["mode","jobType","durationMinutes","durationSeconds","fps","imageCount","renderTimeMinutes","hardware","software","region","datasetSizeTB"],"additionalProperties":false},"PublicEstimateResponse":{"type":"object","properties":{"estimatedCost":{"type":"number","description":"Total estimated cost in the currency field"},"estimatedCostGbp":{"type":"number","description":"GBP equivalent at the live FX rate — what a credit-funded job is billed"},"currency":{"type":"string","description":"Three-letter currency code for estimatedCost, e.g. USD"},"creditCurrency":{"type":"string","description":"Currency credits are billed in (GBP)"},"fxRate":{"type":"number","description":"Live USD→GBP rate applied to derive estimatedCostGbp"},"hasLicenseFee":{"description":"True when the chosen software carries a per-use license fee","type":"boolean"},"licenseNames":{"description":"Names of any licensed software included in the price","type":"array","items":{"type":"string"}},"breakdown":{"description":"Per-component cost breakdown","type":"object","properties":{"compute":{"type":"number"},"software":{"type":"number"},"storage":{"type":"number"},"egress":{"type":"number"},"startFee":{"type":"number"}},"required":["compute","software","storage","egress","startFee"],"additionalProperties":false},"meta":{"description":"Derived inputs (frame count, dataset size) and the resolved per-unit rates","type":"object","properties":{"totalFrames":{"type":"number"},"totalSizeGB":{"type":"number"},"variableRates":{"type":"object","properties":{"hardwareRate":{"type":"number"},"egressRate":{"type":"number"}},"required":["hardwareRate","egressRate"],"additionalProperties":false}},"required":["totalFrames","totalSizeGB"],"additionalProperties":false}},"required":["estimatedCost","estimatedCostGbp","currency","creditCurrency","fxRate"],"additionalProperties":false},"JsonValue":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/components/schemas/JsonValue"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/components/schemas/JsonValue"}}]},"CreateDockingExperimentRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"receptor":{"anyOf":[{"type":"object","properties":{"artifactId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["artifactId"],"additionalProperties":false},{"type":"object","properties":{"source":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","const":"pdb"},"pdbId":{"type":"string","pattern":"^[0-9][A-Za-z0-9]{3}$"}},"required":["kind","pdbId"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"artifact"},"artifact":{"type":"object","properties":{"schema":{"type":"string","const":"kinocloud.docking.artifact/v1"},"artifactId":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]*$"},"storageKey":{"type":"string","minLength":1,"maxLength":2048},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"byteSize":{"type":"integer","minimum":0,"maximum":9007199254740991},"mediaType":{"type":"string","minLength":1,"maxLength":255},"format":{"type":"string","enum":["pdb","mmcif","pdbqt","sdf","mol2","json","log"]}},"required":["schema","artifactId","storageKey","sha256","byteSize","mediaType","format"],"additionalProperties":false}},"required":["kind","artifact"],"additionalProperties":false}]},"assemblyId":{"default":"1","type":"string","pattern":"^(?:[1-9][0-9]{0,3}|deposited|asymmetric)$"},"model":{"default":1,"type":"integer","minimum":1,"maximum":9999},"chains":{"default":null,"anyOf":[{"minItems":1,"maxItems":128,"type":"array","items":{"type":"string","minLength":1,"maxLength":16}},{"type":"null"}]},"preparation":{"default":{"protonationPh":7.4,"addHydrogens":true,"protonationMethod":"pdb2pqr-propka","forceField":"AMBER","fixedProtonationStates":[],"removeComponents":[],"retainComponents":[]},"type":"object","properties":{"protonationPh":{"default":7.4,"type":"number","minimum":0,"maximum":14},"addHydrogens":{"default":true,"type":"boolean","const":true},"protonationMethod":{"default":"pdb2pqr-propka","type":"string","enum":["pdb2pqr-propka","meeko"]},"forceField":{"default":"AMBER","type":"string","enum":["AMBER","CHARMM","PARSE"]},"fixedProtonationStates":{"default":[],"maxItems":256,"type":"array","items":{"type":"object","properties":{"chain":{"type":"string","minLength":1,"maxLength":16},"residue":{"type":"integer","minimum":-9999,"maximum":99999},"residueName":{"type":"string","enum":["ASP","GLU"]},"state":{"type":"string","enum":["anionic","neutral"]},"insertionCode":{"type":"string","maxLength":4},"reason":{"type":"string","minLength":1,"maxLength":512}},"required":["chain","residue","residueName","state"],"additionalProperties":false}},"removeComponents":{"default":[],"maxItems":256,"type":"array","items":{"type":"string","minLength":1,"maxLength":8,"pattern":"^[A-Za-z0-9]{1,8}$"}},"retainComponents":{"default":[],"maxItems":256,"type":"array","items":{"type":"string","minLength":1,"maxLength":8,"pattern":"^[A-Za-z0-9]{1,8}$"}}},"required":["protonationPh","addHydrogens","protonationMethod","forceField","fixedProtonationStates","removeComponents","retainComponents"],"additionalProperties":false}},"required":["source","assemblyId","model","chains","preparation"],"additionalProperties":false}]},"ligand":{"anyOf":[{"type":"object","properties":{"artifactId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["artifactId"],"additionalProperties":false},{"type":"object","properties":{"resolutionToken":{"type":"string","minLength":32,"maxLength":8192},"label":{"type":"string","minLength":1,"maxLength":512}},"required":["resolutionToken"],"additionalProperties":false},{"type":"object","properties":{"ligandId":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]*$"},"label":{"type":"string","minLength":1,"maxLength":512},"source":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","const":"ccd"},"componentId":{"type":"string","minLength":1,"maxLength":8,"pattern":"^[A-Za-z0-9]{1,8}$"}},"required":["kind","componentId"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"smiles"},"smiles":{"type":"string","minLength":1,"maxLength":4096}},"required":["kind","smiles"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"artifact"},"artifact":{"type":"object","properties":{"schema":{"type":"string","const":"kinocloud.docking.artifact/v1"},"artifactId":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]*$"},"storageKey":{"type":"string","minLength":1,"maxLength":2048},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"byteSize":{"type":"integer","minimum":0,"maximum":9007199254740991},"mediaType":{"type":"string","minLength":1,"maxLength":255},"format":{"type":"string","enum":["pdb","mmcif","pdbqt","sdf","mol2","json","log"]}},"required":["schema","artifactId","storageKey","sha256","byteSize","mediaType","format"],"additionalProperties":false}},"required":["kind","artifact"],"additionalProperties":false}]},"confirmation":{"type":"object","properties":{"token":{"type":"string","minLength":32,"maxLength":8192},"query":{"type":"string","minLength":1,"maxLength":512},"sourceId":{"type":"string","minLength":1,"maxLength":128}},"required":["token","query","sourceId"],"additionalProperties":false},"preparation":{"default":{"protonationPh":7.4,"addHydrogens":true,"generate3d":true},"type":"object","properties":{"protonationPh":{"default":7.4,"type":"number","minimum":0,"maximum":14},"addHydrogens":{"default":true,"type":"boolean","const":true},"generate3d":{"default":true,"type":"boolean","const":true}},"required":["protonationPh","addHydrogens","generate3d"],"additionalProperties":false}},"required":["ligandId","label","source","preparation"],"additionalProperties":false}]},"parameters":{"type":"object","properties":{"box":{"type":"object","properties":{"center":{"readOnly":true,"type":"array","prefixItems":[{"type":"number"},{"type":"number"},{"type":"number"}]},"size":{"readOnly":true,"type":"array","prefixItems":[{"type":"number","minimum":1,"maximum":100},{"type":"number","minimum":1,"maximum":100},{"type":"number","minimum":1,"maximum":100}]},"derivation":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","const":"explicit"}},"required":["kind"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"ligand"},"componentId":{"type":"string","minLength":1,"maxLength":8},"chain":{"type":"string","minLength":1,"maxLength":16},"residue":{"type":"integer","minimum":-9999,"maximum":99999}},"required":["kind","componentId"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"residues"},"residues":{"minItems":1,"maxItems":256,"type":"array","items":{"type":"object","properties":{"chain":{"type":"string","minLength":1,"maxLength":16},"residue":{"type":"integer","minimum":-9999,"maximum":99999},"insertionCode":{"type":"string","maxLength":4}},"required":["chain","residue"],"additionalProperties":false}}},"required":["kind","residues"],"additionalProperties":false}]}},"required":["center","size","derivation"],"additionalProperties":false},"protocol":{"type":"object","properties":{"exhaustiveness":{"default":8,"type":"integer","minimum":1,"maximum":128},"numModes":{"default":9,"type":"integer","minimum":1,"maximum":100},"energyRangeKcalMol":{"default":3,"type":"number","minimum":0.1,"maximum":100},"seed":{"default":1,"type":"integer","minimum":1,"maximum":2147483647},"cpuThreads":{"default":1,"type":"integer","minimum":1,"maximum":256}},"required":["exhaustiveness","numModes","energyRangeKcalMol","seed","cpuThreads"],"additionalProperties":false},"estimatedRuntimeSeconds":{"type":"number","exclusiveMinimum":0,"maximum":2592000},"validation":{"type":"object","properties":{"nativeReference":{"type":"object","properties":{"componentId":{"type":"string","minLength":1,"maxLength":8,"pattern":"^[A-Za-z0-9]{1,8}$"},"chain":{"type":"string","minLength":1,"maxLength":16},"residue":{"type":"integer","minimum":-9999,"maximum":99999},"insertionCode":{"type":"string","maxLength":4}},"required":["componentId","chain","residue"],"additionalProperties":false}},"additionalProperties":false}},"required":["box","protocol"],"additionalProperties":false}},"required":["name","receptor","ligand","parameters"],"additionalProperties":false},"DockingExperiment":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"receptor_artifact_id":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"receptor_identity":{"anyOf":[{"$ref":"#/components/schemas/JsonValue"},{"type":"null"}]},"ligand_artifact_id":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"ligand_identity":{"anyOf":[{"$ref":"#/components/schemas/JsonValue"},{"type":"null"}]},"parameters":{"$ref":"#/components/schemas/JsonValue"},"created_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},"required":["id","user_id","name","receptor_artifact_id","receptor_identity","ligand_artifact_id","ligand_identity","parameters","created_at"],"additionalProperties":false},"DockingExperimentResponse":{"type":"object","properties":{"experiment":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"receptor_artifact_id":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"receptor_identity":{"anyOf":[{"$ref":"#/components/schemas/JsonValue"},{"type":"null"}]},"ligand_artifact_id":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"ligand_identity":{"anyOf":[{"$ref":"#/components/schemas/JsonValue"},{"type":"null"}]},"parameters":{"$ref":"#/components/schemas/JsonValue"},"created_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},"required":["id","user_id","name","receptor_artifact_id","receptor_identity","ligand_artifact_id","ligand_identity","parameters","created_at"],"additionalProperties":false}},"required":["experiment"],"additionalProperties":false},"DockingExperimentPage":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"receptor_artifact_id":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"receptor_identity":{"anyOf":[{"$ref":"#/components/schemas/JsonValue"},{"type":"null"}]},"ligand_artifact_id":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"ligand_identity":{"anyOf":[{"$ref":"#/components/schemas/JsonValue"},{"type":"null"}]},"parameters":{"$ref":"#/components/schemas/JsonValue"},"created_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},"required":["id","user_id","name","receptor_artifact_id","receptor_identity","ligand_artifact_id","ligand_identity","parameters","created_at"],"additionalProperties":false}},"nextCursor":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["items","nextCursor"],"additionalProperties":false},"CreateDockingRunRequest":{"type":"object","properties":{"estimatedRuntimeSeconds":{"type":"number","exclusiveMinimum":0,"maximum":2592000}},"additionalProperties":false},"DockingRun":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"experiment_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"render_job_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"engine":{"type":"string"},"engine_version":{"type":"string"},"parameters":{"$ref":"#/components/schemas/JsonValue"},"created_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},"required":["id","user_id","experiment_id","render_job_id","engine","engine_version","parameters","created_at"],"additionalProperties":false},"DockingRunResponse":{"type":"object","properties":{"run":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"experiment_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"render_job_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"engine":{"type":"string"},"engine_version":{"type":"string"},"parameters":{"$ref":"#/components/schemas/JsonValue"},"created_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},"required":["id","user_id","experiment_id","render_job_id","engine","engine_version","parameters","created_at"],"additionalProperties":false}},"required":["run"],"additionalProperties":false},"DockingRunPage":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"experiment_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"render_job_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"engine":{"type":"string"},"engine_version":{"type":"string"},"parameters":{"$ref":"#/components/schemas/JsonValue"},"created_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},"required":["id","user_id","experiment_id","render_job_id","engine","engine_version","parameters","created_at"],"additionalProperties":false}},"nextCursor":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["items","nextCursor"],"additionalProperties":false},"DockingResult":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"run_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"result_artifact_id":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"summary":{"$ref":"#/components/schemas/JsonValue"},"created_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},"required":["id","user_id","run_id","result_artifact_id","summary","created_at"],"additionalProperties":false},"DockingResultResponse":{"type":"object","properties":{"result":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"run_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"result_artifact_id":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"summary":{"$ref":"#/components/schemas/JsonValue"},"created_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},"required":["id","user_id","run_id","result_artifact_id","summary","created_at"],"additionalProperties":false}},"required":["result"],"additionalProperties":false},"DockingResultPage":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"run_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"result_artifact_id":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"summary":{"$ref":"#/components/schemas/JsonValue"},"created_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},"required":["id","user_id","run_id","result_artifact_id","summary","created_at"],"additionalProperties":false}},"nextCursor":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["items","nextCursor"],"additionalProperties":false},"DockingPose":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"result_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"artifact_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"rank":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"score":{"type":"number"},"metrics":{"$ref":"#/components/schemas/JsonValue"},"created_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},"required":["id","user_id","result_id","artifact_id","rank","score","metrics","created_at"],"additionalProperties":false},"DockingPoseResponse":{"type":"object","properties":{"pose":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"result_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"artifact_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"rank":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"score":{"type":"number"},"metrics":{"$ref":"#/components/schemas/JsonValue"},"created_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},"required":["id","user_id","result_id","artifact_id","rank","score","metrics","created_at"],"additionalProperties":false}},"required":["pose"],"additionalProperties":false},"DockingPosePage":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"result_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"artifact_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"rank":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"score":{"type":"number"},"metrics":{"$ref":"#/components/schemas/JsonValue"},"created_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},"required":["id","user_id","result_id","artifact_id","rank","score","metrics","created_at"],"additionalProperties":false}},"nextCursor":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["items","nextCursor"],"additionalProperties":false},"PutDockingInteractionSetRequest":{"type":"object","properties":{"method":{"type":"string","minLength":1,"maxLength":100},"methodVersion":{"anyOf":[{"type":"string","minLength":1,"maxLength":100},{"type":"null"}]},"metadata":{"default":{},"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/components/schemas/JsonValue"}},"interactions":{"maxItems":10000,"type":"array","items":{"type":"object","properties":{"interactionType":{"type":"string","enum":["hydrogen_bond","hydrophobic","salt_bridge","pi_stack","pi_cation","halogen_bond","metal_coordination","other"]},"receptorResidue":{"type":"string","minLength":1,"maxLength":100},"receptorAtom":{"anyOf":[{"type":"string","minLength":1,"maxLength":100},{"type":"null"}]},"ligandAtom":{"anyOf":[{"type":"string","minLength":1,"maxLength":100},{"type":"null"}]},"distanceAngstrom":{"anyOf":[{"type":"number","exclusiveMinimum":0,"exclusiveMaximum":100},{"type":"null"}]},"angleDegrees":{"anyOf":[{"type":"number","minimum":0,"maximum":180},{"type":"null"}]},"metadata":{"default":{},"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/components/schemas/JsonValue"}}},"required":["interactionType","receptorResidue","metadata"],"additionalProperties":false}}},"required":["method","metadata","interactions"],"additionalProperties":false},"DockingInteractionSet":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"pose_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"method":{"type":"string"},"method_version":{"anyOf":[{"type":"string"},{"type":"null"}]},"metadata":{"$ref":"#/components/schemas/JsonValue"},"created_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},"required":["id","user_id","pose_id","method","method_version","metadata","created_at"],"additionalProperties":false},"DockingInteraction":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"interaction_set_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"interaction_type":{"type":"string","enum":["hydrogen_bond","hydrophobic","salt_bridge","pi_stack","pi_cation","halogen_bond","metal_coordination","other"]},"receptor_residue":{"type":"string"},"receptor_atom":{"anyOf":[{"type":"string"},{"type":"null"}]},"ligand_atom":{"anyOf":[{"type":"string"},{"type":"null"}]},"distance_angstrom":{"anyOf":[{"type":"number"},{"type":"null"}]},"angle_degrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"metadata":{"$ref":"#/components/schemas/JsonValue"},"created_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},"required":["id","user_id","interaction_set_id","interaction_type","receptor_residue","receptor_atom","ligand_atom","distance_angstrom","angle_degrees","metadata","created_at"],"additionalProperties":false},"DockingInteractionSetPage":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"pose_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"method":{"type":"string"},"method_version":{"anyOf":[{"type":"string"},{"type":"null"}]},"metadata":{"$ref":"#/components/schemas/JsonValue"},"created_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"interactions":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"interaction_set_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"interaction_type":{"type":"string","enum":["hydrogen_bond","hydrophobic","salt_bridge","pi_stack","pi_cation","halogen_bond","metal_coordination","other"]},"receptor_residue":{"type":"string"},"receptor_atom":{"anyOf":[{"type":"string"},{"type":"null"}]},"ligand_atom":{"anyOf":[{"type":"string"},{"type":"null"}]},"distance_angstrom":{"anyOf":[{"type":"number"},{"type":"null"}]},"angle_degrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"metadata":{"$ref":"#/components/schemas/JsonValue"},"created_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},"required":["id","user_id","interaction_set_id","interaction_type","receptor_residue","receptor_atom","ligand_atom","distance_angstrom","angle_degrees","metadata","created_at"],"additionalProperties":false}}},"required":["id","user_id","pose_id","method","method_version","metadata","created_at","interactions"],"additionalProperties":false}},"nextCursor":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["items","nextCursor"],"additionalProperties":false},"RegisterDockingLibraryRequest":{"type":"object","properties":{"uploadSessionId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"uploadKey":{"type":"string","minLength":1,"maxLength":1024},"name":{"type":"string","minLength":1,"maxLength":200},"format":{"type":"string","enum":["smiles","csv"]}},"required":["uploadSessionId","uploadKey","name","format"],"additionalProperties":false},"DockingLibrary":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string","minLength":1,"maxLength":200},"status":{"type":"string","enum":["ready","failed"]},"format":{"type":"string","enum":["smiles","csv"]},"uploadKey":{"type":"string","minLength":1,"maxLength":2048},"byteSize":{"type":"integer","exclusiveMinimum":0,"maximum":2097152},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"ligandCount":{"type":"integer","minimum":1,"maximum":10000},"atomCountEstimate":{"type":"integer","minimum":0,"maximum":9007199254740991},"parser":{"type":"object","properties":{"name":{"type":"string"},"version":{"type":"string"}},"required":["name","version"],"additionalProperties":false},"warnings":{"type":"array","items":{"type":"string"}},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},"required":["id","name","status","format","uploadKey","byteSize","sha256","ligandCount","atomCountEstimate","parser","warnings","createdAt"],"additionalProperties":false},"DockingLibraryResponse":{"type":"object","properties":{"library":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string","minLength":1,"maxLength":200},"status":{"type":"string","enum":["ready","failed"]},"format":{"type":"string","enum":["smiles","csv"]},"uploadKey":{"type":"string","minLength":1,"maxLength":2048},"byteSize":{"type":"integer","exclusiveMinimum":0,"maximum":2097152},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"ligandCount":{"type":"integer","minimum":1,"maximum":10000},"atomCountEstimate":{"type":"integer","minimum":0,"maximum":9007199254740991},"parser":{"type":"object","properties":{"name":{"type":"string"},"version":{"type":"string"}},"required":["name","version"],"additionalProperties":false},"warnings":{"type":"array","items":{"type":"string"}},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},"required":["id","name","status","format","uploadKey","byteSize","sha256","ligandCount","atomCountEstimate","parser","warnings","createdAt"],"additionalProperties":false}},"required":["library"],"additionalProperties":false},"RegisterDockingLibraryResponse":{"type":"object","properties":{"library":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string","minLength":1,"maxLength":200},"status":{"type":"string","enum":["ready","failed"]},"format":{"type":"string","enum":["smiles","csv"]},"uploadKey":{"type":"string","minLength":1,"maxLength":2048},"byteSize":{"type":"integer","exclusiveMinimum":0,"maximum":2097152},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"ligandCount":{"type":"integer","minimum":1,"maximum":10000},"atomCountEstimate":{"type":"integer","minimum":0,"maximum":9007199254740991},"parser":{"type":"object","properties":{"name":{"type":"string"},"version":{"type":"string"}},"required":["name","version"],"additionalProperties":false},"warnings":{"type":"array","items":{"type":"string"}},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},"required":["id","name","status","format","uploadKey","byteSize","sha256","ligandCount","atomCountEstimate","parser","warnings","createdAt"],"additionalProperties":false},"replayed":{"type":"boolean"}},"required":["library","replayed"],"additionalProperties":false},"DockingLibraryPage":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string","minLength":1,"maxLength":200},"status":{"type":"string","enum":["ready","failed"]},"format":{"type":"string","enum":["smiles","csv"]},"uploadKey":{"type":"string","minLength":1,"maxLength":2048},"byteSize":{"type":"integer","exclusiveMinimum":0,"maximum":2097152},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"ligandCount":{"type":"integer","minimum":1,"maximum":10000},"atomCountEstimate":{"type":"integer","minimum":0,"maximum":9007199254740991},"parser":{"type":"object","properties":{"name":{"type":"string"},"version":{"type":"string"}},"required":["name","version"],"additionalProperties":false},"warnings":{"type":"array","items":{"type":"string"}},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},"required":["id","name","status","format","uploadKey","byteSize","sha256","ligandCount","atomCountEstimate","parser","warnings","createdAt"],"additionalProperties":false}},"nextCursor":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["items","nextCursor"],"additionalProperties":false},"CreateDockingBatchRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"receptor":{"type":"object","properties":{"source":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","const":"pdb"},"pdbId":{"type":"string","pattern":"^[0-9][A-Za-z0-9]{3}$"}},"required":["kind","pdbId"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"artifact"},"artifact":{"type":"object","properties":{"schema":{"type":"string","const":"kinocloud.docking.artifact/v1"},"artifactId":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]*$"},"storageKey":{"type":"string","minLength":1,"maxLength":2048},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"byteSize":{"type":"integer","minimum":0,"maximum":9007199254740991},"mediaType":{"type":"string","minLength":1,"maxLength":255},"format":{"type":"string","enum":["pdb","mmcif","pdbqt","sdf","mol2","json","log"]}},"required":["schema","artifactId","storageKey","sha256","byteSize","mediaType","format"],"additionalProperties":false}},"required":["kind","artifact"],"additionalProperties":false}]},"assemblyId":{"default":"1","type":"string","pattern":"^(?:[1-9][0-9]{0,3}|deposited|asymmetric)$"},"model":{"default":1,"type":"integer","minimum":1,"maximum":9999},"chains":{"default":null,"anyOf":[{"minItems":1,"maxItems":128,"type":"array","items":{"type":"string","minLength":1,"maxLength":16}},{"type":"null"}]},"preparation":{"default":{"protonationPh":7.4,"addHydrogens":true,"protonationMethod":"pdb2pqr-propka","forceField":"AMBER","fixedProtonationStates":[],"removeComponents":[],"retainComponents":[]},"type":"object","properties":{"protonationPh":{"default":7.4,"type":"number","minimum":0,"maximum":14},"addHydrogens":{"default":true,"type":"boolean","const":true},"protonationMethod":{"default":"pdb2pqr-propka","type":"string","enum":["pdb2pqr-propka","meeko"]},"forceField":{"default":"AMBER","type":"string","enum":["AMBER","CHARMM","PARSE"]},"fixedProtonationStates":{"default":[],"maxItems":256,"type":"array","items":{"type":"object","properties":{"chain":{"type":"string","minLength":1,"maxLength":16},"residue":{"type":"integer","minimum":-9999,"maximum":99999},"residueName":{"type":"string","enum":["ASP","GLU"]},"state":{"type":"string","enum":["anionic","neutral"]},"insertionCode":{"type":"string","maxLength":4},"reason":{"type":"string","minLength":1,"maxLength":512}},"required":["chain","residue","residueName","state"],"additionalProperties":false}},"removeComponents":{"default":[],"maxItems":256,"type":"array","items":{"type":"string","minLength":1,"maxLength":8,"pattern":"^[A-Za-z0-9]{1,8}$"}},"retainComponents":{"default":[],"maxItems":256,"type":"array","items":{"type":"string","minLength":1,"maxLength":8,"pattern":"^[A-Za-z0-9]{1,8}$"}}},"required":["protonationPh","addHydrogens","protonationMethod","forceField","fixedProtonationStates","removeComponents","retainComponents"],"additionalProperties":false}},"required":["source","assemblyId","model","chains","preparation"],"additionalProperties":false},"box":{"readOnly":true,"type":"object","properties":{"center":{"readOnly":true,"type":"array","prefixItems":[{"type":"number"},{"type":"number"},{"type":"number"}]},"size":{"readOnly":true,"type":"array","prefixItems":[{"type":"number","minimum":1,"maximum":100},{"type":"number","minimum":1,"maximum":100},{"type":"number","minimum":1,"maximum":100}]},"derivation":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","const":"explicit"}},"required":["kind"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"ligand"},"componentId":{"type":"string","minLength":1,"maxLength":8},"chain":{"type":"string","minLength":1,"maxLength":16},"residue":{"type":"integer","minimum":-9999,"maximum":99999},"insertionCode":{"type":"string","maxLength":4}},"required":["kind","componentId"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"residues"},"residues":{"minItems":1,"maxItems":256,"type":"array","items":{"type":"object","properties":{"chain":{"type":"string","minLength":1,"maxLength":16},"residue":{"type":"integer","minimum":-9999,"maximum":99999},"insertionCode":{"type":"string","maxLength":4}},"required":["chain","residue"],"additionalProperties":false}}},"required":["kind","residues"],"additionalProperties":false}]}},"required":["center","size","derivation"],"additionalProperties":false},"protocol":{"type":"object","properties":{"exhaustiveness":{"default":8,"type":"integer","minimum":1,"maximum":128},"numModes":{"default":9,"type":"integer","minimum":1,"maximum":100},"energyRangeKcalMol":{"default":3,"type":"number","minimum":0.1,"maximum":100},"seed":{"default":1,"type":"integer","minimum":1,"maximum":2147483647},"cpuThreads":{"default":1,"type":"integer","minimum":1,"maximum":256}},"required":["exhaustiveness","numModes","energyRangeKcalMol","seed","cpuThreads"],"additionalProperties":false},"library":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","const":"inline"},"format":{"type":"string","enum":["smiles","csv"]},"content":{"type":"string","minLength":1,"maxLength":2097152}},"required":["kind","format","content"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"stored"},"libraryId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["kind","libraryId"],"additionalProperties":false}]},"estimatedRuntimeSecondsPerLigand":{"type":"number","exclusiveMinimum":0,"maximum":2592000},"funnelPlan":{"type":"object","properties":{"tiers":{"minItems":1,"maxItems":5,"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":32},"exhaustiveness":{"type":"integer","minimum":1,"maximum":128},"numModes":{"type":"integer","minimum":1,"maximum":100},"promotion":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","const":"topFraction"},"fraction":{"type":"number","exclusiveMinimum":0,"maximum":1}},"required":["kind","fraction"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"topCount"},"count":{"type":"integer","minimum":1,"maximum":9007199254740991}},"required":["kind","count"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"affinityThreshold"},"maxKcalMol":{"type":"number","minimum":-1000,"maximum":1000}},"required":["kind","maxKcalMol"],"additionalProperties":false}]}},"required":["name","exhaustiveness","numModes"],"additionalProperties":false}}},"required":["tiers"],"additionalProperties":false}},"required":["name","receptor","box","protocol","library"],"additionalProperties":false},"DockingBatchRetryRequest":{"type":"object","properties":{"ligandIds":{"minItems":1,"maxItems":10000,"type":"array","items":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]*$"}},"prepareOnly":{"default":false,"type":"boolean"}},"required":["prepareOnly"],"additionalProperties":false},"DockingBatchPromotionRequest":{"type":"object","properties":{"plan":{"type":"object","properties":{"tiers":{"minItems":1,"maxItems":5,"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":32},"exhaustiveness":{"type":"integer","minimum":1,"maximum":128},"numModes":{"type":"integer","minimum":1,"maximum":100},"promotion":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","const":"topFraction"},"fraction":{"type":"number","exclusiveMinimum":0,"maximum":1}},"required":["kind","fraction"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"topCount"},"count":{"type":"integer","minimum":1,"maximum":9007199254740991}},"required":["kind","count"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"affinityThreshold"},"maxKcalMol":{"type":"number","minimum":-1000,"maximum":1000}},"required":["kind","maxKcalMol"],"additionalProperties":false}]}},"required":["name","exhaustiveness","numModes"],"additionalProperties":false}}},"required":["tiers"],"additionalProperties":false},"currentTierIndex":{"type":"integer","minimum":0,"maximum":9007199254740991},"campaignId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"prepareOnly":{"default":false,"type":"boolean"}},"required":["plan","currentTierIndex","prepareOnly"],"additionalProperties":false},"IngestDockingArtifactsRequest":{"type":"object","properties":{"runId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"manifestKey":{"type":"string","minLength":1,"maxLength":2048}},"required":["runId"],"additionalProperties":false},"ResolveDockingArtifactUrlsRequest":{"type":"object","properties":{"artifactIds":{"minItems":1,"maxItems":100,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"required":["artifactIds"],"additionalProperties":false},"DockingArtifact":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"kind":{"type":"string"},"storage_bucket":{"type":"string"},"storage_key":{"type":"string"},"content_type":{"type":"string"},"byte_size":{"type":"integer","minimum":0,"maximum":9007199254740991},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"metadata":{"$ref":"#/components/schemas/JsonValue"},"created_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},"required":["id","user_id","kind","storage_bucket","storage_key","content_type","byte_size","sha256","metadata","created_at"],"additionalProperties":false},"DockingArtifactUrl":{"type":"object","properties":{"artifactId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"downloadUrl":{"type":"string","format":"uri","description":"Short-lived signed download URL; never persist it"},"expiresAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"etag":{"type":"string"}},"required":["artifactId","downloadUrl","expiresAt"],"additionalProperties":false},"ResolveStructureUrlsRequest":{"type":"object","properties":{"keys":{"minItems":1,"maxItems":20,"type":"array","items":{"type":"string","minLength":1,"maxLength":2048}}},"required":["keys"],"additionalProperties":false},"StructureUrlBatchResponse":{"type":"object","properties":{"outcomes":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"status":{"type":"string","enum":["ok","unavailable"]},"downloadUrl":{"type":"string"},"expiresAt":{"type":"string"}},"required":["key","status"],"additionalProperties":false}}},"required":["outcomes"],"additionalProperties":false},"DockingValidation":{"type":"object","properties":{"valid":{"type":"boolean"},"warnings":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"severity":{"type":"string","enum":["info","warning"]}},"required":["code","message","severity"],"additionalProperties":false}}},"required":["valid","warnings"],"additionalProperties":false},"DockingEstimate":{"type":"object","properties":{"estimatedRuntimeSeconds":{"type":"number","exclusiveMinimum":0},"taskCount":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"billableEstimate":{"type":"object","properties":{"estimatedCost":{"type":"number","minimum":0},"estimatedCostGbp":{"type":"number","minimum":0},"currency":{"type":"string"},"creditCurrency":{"type":"string"}},"required":["estimatedCost","estimatedCostGbp","currency","creditCurrency"],"additionalProperties":false}},"required":["estimatedRuntimeSeconds","taskCount","billableEstimate"],"additionalProperties":false},"CreateDockingRunResponse":{"type":"object","properties":{"runId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"jobId":{"type":"string"},"estimate":{"type":"object","properties":{"estimatedCost":{"type":"number","minimum":0},"currency":{"type":"string"}},"required":["estimatedCost","currency"],"additionalProperties":false},"replayed":{"type":"boolean"}},"required":["runId","jobId","estimate","replayed"],"additionalProperties":false},"PutDockingInteractionSetResponse":{"type":"object","properties":{"interactionSet":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"pose_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"method":{"type":"string"},"method_version":{"anyOf":[{"type":"string"},{"type":"null"}]},"metadata":{"$ref":"#/components/schemas/JsonValue"},"created_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},"required":["id","user_id","pose_id","method","method_version","metadata","created_at"],"additionalProperties":false},"immutable":{"type":"boolean","const":true}},"required":["interactionSet","immutable"],"additionalProperties":false},"DockingBatchSummaryResponse":{"type":"object","properties":{"batchId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"resultId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"status":{"type":"string","enum":["succeeded","partially_succeeded","failed"]},"taskCount":{"type":"integer","minimum":1,"maximum":10000},"succeededTaskCount":{"type":"integer","minimum":0,"maximum":9007199254740991},"failedTaskCount":{"type":"integer","minimum":0,"maximum":9007199254740991},"poseCount":{"type":"integer","minimum":0,"maximum":9007199254740991},"totalRuntimeSeconds":{"type":"number","minimum":0},"bestAffinityKcalMol":{"anyOf":[{"type":"number"},{"type":"null"}]},"meanBestAffinityKcalMol":{"anyOf":[{"type":"number"},{"type":"null"}]},"failureReasons":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}}},"required":["batchId","resultId","status","taskCount","succeededTaskCount","failedTaskCount","poseCount","totalRuntimeSeconds","bestAffinityKcalMol","meanBestAffinityKcalMol","failureReasons"],"additionalProperties":false},"DockingBatchTaskPage":{"type":"object","properties":{"items":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"taskIndex":{"type":"integer","minimum":0,"maximum":9999},"ligandId":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]*$"},"status":{"type":"string","const":"succeeded"},"runtimeSeconds":{"type":"number","minimum":0,"maximum":2592000},"poseCount":{"type":"integer","minimum":1,"maximum":100},"bestAffinityKcalMol":{"type":"number","minimum":-1000,"maximum":1000},"bestPoseId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"bestPoseArtifactId":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]*$"}},"required":["taskIndex","ligandId","status","runtimeSeconds","poseCount","bestAffinityKcalMol","bestPoseArtifactId"],"additionalProperties":false},{"type":"object","properties":{"taskIndex":{"type":"integer","minimum":0,"maximum":9999},"ligandId":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]*$"},"status":{"type":"string","const":"failed"},"runtimeSeconds":{"type":"number","minimum":0,"maximum":2592000},"failure":{"type":"object","properties":{"code":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]*$"},"message":{"type":"string","minLength":1,"maxLength":2048},"retryable":{"type":"boolean"}},"required":["code","message","retryable"],"additionalProperties":false}},"required":["taskIndex","ligandId","status","runtimeSeconds","failure"],"additionalProperties":false}]}},"nextCursor":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["items","nextCursor"],"additionalProperties":false},"CreateDockingBatchResponse":{"type":"object","properties":{"batchId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"campaignId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"jobId":{"type":"string","minLength":1},"taskCount":{"type":"integer","minimum":1,"maximum":10000},"estimate":{"type":"object","properties":{"estimatedCost":{"type":"number","minimum":0},"currency":{"type":"string"}},"required":["estimatedCost","currency"],"additionalProperties":false},"warnings":{"type":"array","items":{"type":"string"}},"replayed":{"type":"boolean"}},"required":["batchId","campaignId","jobId","taskCount","estimate","replayed"],"additionalProperties":false},"DockingBatchRetryResponse":{"anyOf":[{"type":"object","properties":{"preparation":{"readOnly":true,"type":"object","properties":{"schema":{"type":"string","const":"kinocloud.docking.request/v2"},"requestId":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]*$"},"runId":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]*$"},"idempotencyKey":{"type":"string","minLength":8,"maxLength":255},"receptor":{"type":"object","properties":{"source":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","const":"pdb"},"pdbId":{"type":"string","pattern":"^[0-9][A-Za-z0-9]{3}$"}},"required":["kind","pdbId"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"artifact"},"artifact":{"type":"object","properties":{"schema":{"type":"string","const":"kinocloud.docking.artifact/v1"},"artifactId":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]*$"},"storageKey":{"type":"string","minLength":1,"maxLength":2048},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"byteSize":{"type":"integer","minimum":0,"maximum":9007199254740991},"mediaType":{"type":"string","minLength":1,"maxLength":255},"format":{"type":"string","enum":["pdb","mmcif","pdbqt","sdf","mol2","json","log"]}},"required":["schema","artifactId","storageKey","sha256","byteSize","mediaType","format"],"additionalProperties":false}},"required":["kind","artifact"],"additionalProperties":false}]},"assemblyId":{"default":"1","type":"string","pattern":"^(?:[1-9][0-9]{0,3}|deposited|asymmetric)$"},"model":{"default":1,"type":"integer","minimum":1,"maximum":9999},"chains":{"default":null,"anyOf":[{"minItems":1,"maxItems":128,"type":"array","items":{"type":"string","minLength":1,"maxLength":16}},{"type":"null"}]},"preparation":{"default":{"protonationPh":7.4,"addHydrogens":true,"protonationMethod":"pdb2pqr-propka","forceField":"AMBER","fixedProtonationStates":[],"removeComponents":[],"retainComponents":[]},"type":"object","properties":{"protonationPh":{"default":7.4,"type":"number","minimum":0,"maximum":14},"addHydrogens":{"default":true,"type":"boolean","const":true},"protonationMethod":{"default":"pdb2pqr-propka","type":"string","enum":["pdb2pqr-propka","meeko"]},"forceField":{"default":"AMBER","type":"string","enum":["AMBER","CHARMM","PARSE"]},"fixedProtonationStates":{"default":[],"maxItems":256,"type":"array","items":{"type":"object","properties":{"chain":{"type":"string","minLength":1,"maxLength":16},"residue":{"type":"integer","minimum":-9999,"maximum":99999},"residueName":{"type":"string","enum":["ASP","GLU"]},"state":{"type":"string","enum":["anionic","neutral"]},"insertionCode":{"type":"string","maxLength":4},"reason":{"type":"string","minLength":1,"maxLength":512}},"required":["chain","residue","residueName","state"],"additionalProperties":false}},"removeComponents":{"default":[],"maxItems":256,"type":"array","items":{"type":"string","minLength":1,"maxLength":8,"pattern":"^[A-Za-z0-9]{1,8}$"}},"retainComponents":{"default":[],"maxItems":256,"type":"array","items":{"type":"string","minLength":1,"maxLength":8,"pattern":"^[A-Za-z0-9]{1,8}$"}}},"required":["protonationPh","addHydrogens","protonationMethod","forceField","fixedProtonationStates","removeComponents","retainComponents"],"additionalProperties":false}},"required":["source","assemblyId","model","chains","preparation"],"additionalProperties":false},"ligands":{"minItems":1,"maxItems":10000,"type":"array","items":{"type":"object","properties":{"ligandId":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]*$"},"label":{"type":"string","minLength":1,"maxLength":512},"source":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","const":"ccd"},"componentId":{"type":"string","minLength":1,"maxLength":8,"pattern":"^[A-Za-z0-9]{1,8}$"}},"required":["kind","componentId"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"smiles"},"smiles":{"type":"string","minLength":1,"maxLength":4096}},"required":["kind","smiles"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"artifact"},"artifact":{"type":"object","properties":{"schema":{"type":"string","const":"kinocloud.docking.artifact/v1"},"artifactId":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]*$"},"storageKey":{"type":"string","minLength":1,"maxLength":2048},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"byteSize":{"type":"integer","minimum":0,"maximum":9007199254740991},"mediaType":{"type":"string","minLength":1,"maxLength":255},"format":{"type":"string","enum":["pdb","mmcif","pdbqt","sdf","mol2","json","log"]}},"required":["schema","artifactId","storageKey","sha256","byteSize","mediaType","format"],"additionalProperties":false}},"required":["kind","artifact"],"additionalProperties":false}]},"confirmation":{"type":"object","properties":{"token":{"type":"string","minLength":32,"maxLength":8192},"query":{"type":"string","minLength":1,"maxLength":512},"sourceId":{"type":"string","minLength":1,"maxLength":128}},"required":["token","query","sourceId"],"additionalProperties":false},"preparation":{"default":{"protonationPh":7.4,"addHydrogens":true,"generate3d":true},"type":"object","properties":{"protonationPh":{"default":7.4,"type":"number","minimum":0,"maximum":14},"addHydrogens":{"default":true,"type":"boolean","const":true},"generate3d":{"default":true,"type":"boolean","const":true}},"required":["protonationPh","addHydrogens","generate3d"],"additionalProperties":false}},"required":["ligandId","label","source","preparation"],"additionalProperties":false}},"box":{"readOnly":true,"type":"object","properties":{"center":{"readOnly":true,"type":"array","prefixItems":[{"type":"number"},{"type":"number"},{"type":"number"}]},"size":{"readOnly":true,"type":"array","prefixItems":[{"type":"number","minimum":1,"maximum":100},{"type":"number","minimum":1,"maximum":100},{"type":"number","minimum":1,"maximum":100}]},"derivation":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","const":"explicit"}},"required":["kind"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"ligand"},"componentId":{"type":"string","minLength":1,"maxLength":8},"chain":{"type":"string","minLength":1,"maxLength":16},"residue":{"type":"integer","minimum":-9999,"maximum":99999},"insertionCode":{"type":"string","maxLength":4}},"required":["kind","componentId"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"residues"},"residues":{"minItems":1,"maxItems":256,"type":"array","items":{"type":"object","properties":{"chain":{"type":"string","minLength":1,"maxLength":16},"residue":{"type":"integer","minimum":-9999,"maximum":99999},"insertionCode":{"type":"string","maxLength":4}},"required":["chain","residue"],"additionalProperties":false}}},"required":["kind","residues"],"additionalProperties":false}]}},"required":["center","size","derivation"],"additionalProperties":false},"protocol":{"type":"object","properties":{"engine":{"default":"autodock-vina","type":"string","const":"autodock-vina"},"engineVersion":{"type":"string","minLength":1,"maxLength":512},"exhaustiveness":{"default":8,"type":"integer","minimum":1,"maximum":128},"numModes":{"default":9,"type":"integer","minimum":1,"maximum":100},"energyRangeKcalMol":{"default":3,"type":"number","minimum":0.1,"maximum":100},"seed":{"default":1,"type":"integer","minimum":1,"maximum":2147483647},"cpuThreads":{"default":1,"type":"integer","minimum":1,"maximum":256}},"required":["engine","engineVersion","exhaustiveness","numModes","energyRangeKcalMol","seed","cpuThreads"],"additionalProperties":false},"estimatedRuntimeSeconds":{"type":"number","exclusiveMinimum":0,"maximum":2592000},"execution":{"default":{"shardSize":1},"type":"object","properties":{"shardSize":{"default":1,"type":"integer","minimum":1,"maximum":10},"preparedReceptor":{"type":"object","properties":{"cacheKey":{"type":"string","pattern":"^[a-f0-9]{64}$"},"receptorIdentitySha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"preparationSha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"toolchainSha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"workerImageDigest":{"type":"string","pattern":"^sha256:[a-f0-9]{64}$"},"artifact":{"type":"object","properties":{"schema":{"type":"string","const":"kinocloud.docking.artifact/v1"},"artifactId":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]*$"},"storageKey":{"type":"string","minLength":1,"maxLength":2048},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"byteSize":{"type":"integer","minimum":0,"maximum":9007199254740991},"mediaType":{"type":"string","minLength":1,"maxLength":255},"format":{"type":"string","enum":["pdb","mmcif","pdbqt","sdf","mol2","json","log"]}},"required":["schema","artifactId","storageKey","sha256","byteSize","mediaType","format"],"additionalProperties":false}},"required":["cacheKey","receptorIdentitySha256","preparationSha256","toolchainSha256","workerImageDigest"],"additionalProperties":false}},"required":["shardSize"],"additionalProperties":false},"validation":{"type":"object","properties":{"nativeReference":{"type":"object","properties":{"componentId":{"type":"string","minLength":1,"maxLength":8,"pattern":"^[A-Za-z0-9]{1,8}$"},"chain":{"type":"string","minLength":1,"maxLength":16},"residue":{"type":"integer","minimum":-9999,"maximum":99999},"insertionCode":{"type":"string","maxLength":4}},"required":["componentId","chain","residue"],"additionalProperties":false}},"additionalProperties":false}},"required":["schema","requestId","runId","idempotencyKey","receptor","ligands","box","protocol","estimatedRuntimeSeconds","execution"],"additionalProperties":false},"retryCount":{"type":"integer","minimum":1,"maximum":10000},"promotedFrom":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["preparation","retryCount","promotedFrom"],"additionalProperties":false},{"type":"object","properties":{"batchId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"campaignId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"tierId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"parentBatchId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"jobId":{"type":"string","minLength":1},"taskCount":{"type":"integer","minimum":1,"maximum":10000},"estimate":{"type":"object","properties":{"estimatedCost":{"type":"number","minimum":0},"currency":{"type":"string"}},"required":["estimatedCost","currency"],"additionalProperties":false},"replayed":{"type":"boolean"}},"required":["batchId","campaignId","tierId","parentBatchId","jobId","taskCount","estimate","replayed"],"additionalProperties":false},{"type":"object","properties":{"batchId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"campaignId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"tierId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"replayed":{"type":"boolean","const":true}},"required":["batchId","campaignId","tierId","replayed"],"additionalProperties":false}]},"DockingBatchPromotionResponse":{"anyOf":[{"type":"object","properties":{"preparation":{"readOnly":true,"type":"object","properties":{"schema":{"type":"string","const":"kinocloud.docking.request/v2"},"requestId":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]*$"},"runId":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]*$"},"idempotencyKey":{"type":"string","minLength":8,"maxLength":255},"receptor":{"type":"object","properties":{"source":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","const":"pdb"},"pdbId":{"type":"string","pattern":"^[0-9][A-Za-z0-9]{3}$"}},"required":["kind","pdbId"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"artifact"},"artifact":{"type":"object","properties":{"schema":{"type":"string","const":"kinocloud.docking.artifact/v1"},"artifactId":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]*$"},"storageKey":{"type":"string","minLength":1,"maxLength":2048},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"byteSize":{"type":"integer","minimum":0,"maximum":9007199254740991},"mediaType":{"type":"string","minLength":1,"maxLength":255},"format":{"type":"string","enum":["pdb","mmcif","pdbqt","sdf","mol2","json","log"]}},"required":["schema","artifactId","storageKey","sha256","byteSize","mediaType","format"],"additionalProperties":false}},"required":["kind","artifact"],"additionalProperties":false}]},"assemblyId":{"default":"1","type":"string","pattern":"^(?:[1-9][0-9]{0,3}|deposited|asymmetric)$"},"model":{"default":1,"type":"integer","minimum":1,"maximum":9999},"chains":{"default":null,"anyOf":[{"minItems":1,"maxItems":128,"type":"array","items":{"type":"string","minLength":1,"maxLength":16}},{"type":"null"}]},"preparation":{"default":{"protonationPh":7.4,"addHydrogens":true,"protonationMethod":"pdb2pqr-propka","forceField":"AMBER","fixedProtonationStates":[],"removeComponents":[],"retainComponents":[]},"type":"object","properties":{"protonationPh":{"default":7.4,"type":"number","minimum":0,"maximum":14},"addHydrogens":{"default":true,"type":"boolean","const":true},"protonationMethod":{"default":"pdb2pqr-propka","type":"string","enum":["pdb2pqr-propka","meeko"]},"forceField":{"default":"AMBER","type":"string","enum":["AMBER","CHARMM","PARSE"]},"fixedProtonationStates":{"default":[],"maxItems":256,"type":"array","items":{"type":"object","properties":{"chain":{"type":"string","minLength":1,"maxLength":16},"residue":{"type":"integer","minimum":-9999,"maximum":99999},"residueName":{"type":"string","enum":["ASP","GLU"]},"state":{"type":"string","enum":["anionic","neutral"]},"insertionCode":{"type":"string","maxLength":4},"reason":{"type":"string","minLength":1,"maxLength":512}},"required":["chain","residue","residueName","state"],"additionalProperties":false}},"removeComponents":{"default":[],"maxItems":256,"type":"array","items":{"type":"string","minLength":1,"maxLength":8,"pattern":"^[A-Za-z0-9]{1,8}$"}},"retainComponents":{"default":[],"maxItems":256,"type":"array","items":{"type":"string","minLength":1,"maxLength":8,"pattern":"^[A-Za-z0-9]{1,8}$"}}},"required":["protonationPh","addHydrogens","protonationMethod","forceField","fixedProtonationStates","removeComponents","retainComponents"],"additionalProperties":false}},"required":["source","assemblyId","model","chains","preparation"],"additionalProperties":false},"ligands":{"minItems":1,"maxItems":10000,"type":"array","items":{"type":"object","properties":{"ligandId":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]*$"},"label":{"type":"string","minLength":1,"maxLength":512},"source":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","const":"ccd"},"componentId":{"type":"string","minLength":1,"maxLength":8,"pattern":"^[A-Za-z0-9]{1,8}$"}},"required":["kind","componentId"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"smiles"},"smiles":{"type":"string","minLength":1,"maxLength":4096}},"required":["kind","smiles"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"artifact"},"artifact":{"type":"object","properties":{"schema":{"type":"string","const":"kinocloud.docking.artifact/v1"},"artifactId":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]*$"},"storageKey":{"type":"string","minLength":1,"maxLength":2048},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"byteSize":{"type":"integer","minimum":0,"maximum":9007199254740991},"mediaType":{"type":"string","minLength":1,"maxLength":255},"format":{"type":"string","enum":["pdb","mmcif","pdbqt","sdf","mol2","json","log"]}},"required":["schema","artifactId","storageKey","sha256","byteSize","mediaType","format"],"additionalProperties":false}},"required":["kind","artifact"],"additionalProperties":false}]},"confirmation":{"type":"object","properties":{"token":{"type":"string","minLength":32,"maxLength":8192},"query":{"type":"string","minLength":1,"maxLength":512},"sourceId":{"type":"string","minLength":1,"maxLength":128}},"required":["token","query","sourceId"],"additionalProperties":false},"preparation":{"default":{"protonationPh":7.4,"addHydrogens":true,"generate3d":true},"type":"object","properties":{"protonationPh":{"default":7.4,"type":"number","minimum":0,"maximum":14},"addHydrogens":{"default":true,"type":"boolean","const":true},"generate3d":{"default":true,"type":"boolean","const":true}},"required":["protonationPh","addHydrogens","generate3d"],"additionalProperties":false}},"required":["ligandId","label","source","preparation"],"additionalProperties":false}},"box":{"readOnly":true,"type":"object","properties":{"center":{"readOnly":true,"type":"array","prefixItems":[{"type":"number"},{"type":"number"},{"type":"number"}]},"size":{"readOnly":true,"type":"array","prefixItems":[{"type":"number","minimum":1,"maximum":100},{"type":"number","minimum":1,"maximum":100},{"type":"number","minimum":1,"maximum":100}]},"derivation":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","const":"explicit"}},"required":["kind"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"ligand"},"componentId":{"type":"string","minLength":1,"maxLength":8},"chain":{"type":"string","minLength":1,"maxLength":16},"residue":{"type":"integer","minimum":-9999,"maximum":99999},"insertionCode":{"type":"string","maxLength":4}},"required":["kind","componentId"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"residues"},"residues":{"minItems":1,"maxItems":256,"type":"array","items":{"type":"object","properties":{"chain":{"type":"string","minLength":1,"maxLength":16},"residue":{"type":"integer","minimum":-9999,"maximum":99999},"insertionCode":{"type":"string","maxLength":4}},"required":["chain","residue"],"additionalProperties":false}}},"required":["kind","residues"],"additionalProperties":false}]}},"required":["center","size","derivation"],"additionalProperties":false},"protocol":{"type":"object","properties":{"engine":{"default":"autodock-vina","type":"string","const":"autodock-vina"},"engineVersion":{"type":"string","minLength":1,"maxLength":512},"exhaustiveness":{"default":8,"type":"integer","minimum":1,"maximum":128},"numModes":{"default":9,"type":"integer","minimum":1,"maximum":100},"energyRangeKcalMol":{"default":3,"type":"number","minimum":0.1,"maximum":100},"seed":{"default":1,"type":"integer","minimum":1,"maximum":2147483647},"cpuThreads":{"default":1,"type":"integer","minimum":1,"maximum":256}},"required":["engine","engineVersion","exhaustiveness","numModes","energyRangeKcalMol","seed","cpuThreads"],"additionalProperties":false},"estimatedRuntimeSeconds":{"type":"number","exclusiveMinimum":0,"maximum":2592000},"execution":{"default":{"shardSize":1},"type":"object","properties":{"shardSize":{"default":1,"type":"integer","minimum":1,"maximum":10},"preparedReceptor":{"type":"object","properties":{"cacheKey":{"type":"string","pattern":"^[a-f0-9]{64}$"},"receptorIdentitySha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"preparationSha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"toolchainSha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"workerImageDigest":{"type":"string","pattern":"^sha256:[a-f0-9]{64}$"},"artifact":{"type":"object","properties":{"schema":{"type":"string","const":"kinocloud.docking.artifact/v1"},"artifactId":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]*$"},"storageKey":{"type":"string","minLength":1,"maxLength":2048},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"byteSize":{"type":"integer","minimum":0,"maximum":9007199254740991},"mediaType":{"type":"string","minLength":1,"maxLength":255},"format":{"type":"string","enum":["pdb","mmcif","pdbqt","sdf","mol2","json","log"]}},"required":["schema","artifactId","storageKey","sha256","byteSize","mediaType","format"],"additionalProperties":false}},"required":["cacheKey","receptorIdentitySha256","preparationSha256","toolchainSha256","workerImageDigest"],"additionalProperties":false}},"required":["shardSize"],"additionalProperties":false},"validation":{"type":"object","properties":{"nativeReference":{"type":"object","properties":{"componentId":{"type":"string","minLength":1,"maxLength":8,"pattern":"^[A-Za-z0-9]{1,8}$"},"chain":{"type":"string","minLength":1,"maxLength":16},"residue":{"type":"integer","minimum":-9999,"maximum":99999},"insertionCode":{"type":"string","maxLength":4}},"required":["componentId","chain","residue"],"additionalProperties":false}},"additionalProperties":false}},"required":["schema","requestId","runId","idempotencyKey","receptor","ligands","box","protocol","estimatedRuntimeSeconds","execution"],"additionalProperties":false},"tier":{"type":"string","minLength":1,"maxLength":100},"promotedFrom":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"survivorCount":{"type":"integer","minimum":1,"maximum":10000}},"required":["preparation","tier","promotedFrom","survivorCount"],"additionalProperties":false},{"type":"object","properties":{"batchId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"campaignId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"tierId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"parentBatchId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"jobId":{"type":"string","minLength":1},"taskCount":{"type":"integer","minimum":1,"maximum":10000},"estimate":{"type":"object","properties":{"estimatedCost":{"type":"number","minimum":0},"currency":{"type":"string"}},"required":["estimatedCost","currency"],"additionalProperties":false},"replayed":{"type":"boolean"}},"required":["batchId","campaignId","tierId","parentBatchId","jobId","taskCount","estimate","replayed"],"additionalProperties":false},{"type":"object","properties":{"batchId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"campaignId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"tierId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"replayed":{"type":"boolean","const":true}},"required":["batchId","campaignId","tierId","replayed"],"additionalProperties":false}]},"DockingPoseArtifact":{"type":"object","properties":{"poseId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"artifactId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"contentType":{"type":"string"},"byteSize":{"type":"integer","minimum":0,"maximum":9007199254740991},"storageBucket":{"type":"string"},"storageKey":{"type":"string"},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"}},"required":["poseId","artifactId","contentType","byteSize","storageBucket","storageKey","sha256"],"additionalProperties":false},"IngestDockingArtifactsResponse":{"type":"object","properties":{"resultId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"artifactIds":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"poseIds":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"replayed":{"type":"boolean"},"status":{"type":"string","enum":["succeeded","partially_succeeded","failed"]}},"required":["resultId","artifactIds","poseIds","replayed","status"],"additionalProperties":false},"DockingArtifactUrlBatchResponse":{"type":"object","properties":{"outcomes":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"artifactId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"downloadUrl":{"type":"string","format":"uri","description":"Short-lived signed download URL; never persist it"},"expiresAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"etag":{"type":"string"},"status":{"type":"string","const":"ok"}},"required":["artifactId","downloadUrl","expiresAt","status"],"additionalProperties":false},{"type":"object","properties":{"artifactId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"status":{"type":"string","enum":["not_found","unavailable"]}},"required":["artifactId","status"],"additionalProperties":false}]}}},"required":["outcomes"],"additionalProperties":false},"MolecularProjectCreateRequest":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":200},"scene":{"description":"A Molecular Studio SceneState accepted by the canonical runtime parser.","anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/components/schemas/JsonValue"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/components/schemas/JsonValue"}}],"$ref":"#/components/schemas/JsonValue"},"shots":{"default":[],"maxItems":100,"type":"array","items":{"type":"object","properties":{"description":{"type":"string","maxLength":2000},"focus":{"$ref":"#/components/schemas/JsonValue"},"preset":{"type":"string","enum":["front","back","left","right","top","bottom","default"]},"orbitDegrees":{"type":"number"},"durationMs":{"type":"number","exclusiveMinimum":0,"maximum":3600000}},"required":["durationMs"],"additionalProperties":false}},"transcript":{"default":[],"maxItems":1000,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":200},"role":{"type":"string","enum":["user","assistant"]},"content":{"type":"string","maxLength":20000},"tools":{"$ref":"#/components/schemas/JsonValue"},"progress":{"$ref":"#/components/schemas/JsonValue"},"videoUrl":{"$ref":"#/components/schemas/JsonValue"},"videoFilename":{"$ref":"#/components/schemas/JsonValue"},"renderProposal":{"$ref":"#/components/schemas/JsonValue"},"jobProposal":{"$ref":"#/components/schemas/JsonValue"}},"required":["id","role","content"],"additionalProperties":false}},"thumbnailUrl":{"anyOf":[{"type":"string","maxLength":300000,"pattern":"^data:image\\/[a-zA-Z0-9.+-]+;base64,[a-zA-Z0-9+/=]+$"},{"type":"null"}]}},"required":["title","scene"],"additionalProperties":false},"MolecularProjectSaveRequest":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":200},"scene":{"description":"A Molecular Studio SceneState accepted by the canonical runtime parser.","anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/components/schemas/JsonValue"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/components/schemas/JsonValue"}}],"$ref":"#/components/schemas/JsonValue"},"shots":{"default":[],"maxItems":100,"type":"array","items":{"type":"object","properties":{"description":{"type":"string","maxLength":2000},"focus":{"$ref":"#/components/schemas/JsonValue"},"preset":{"type":"string","enum":["front","back","left","right","top","bottom","default"]},"orbitDegrees":{"type":"number"},"durationMs":{"type":"number","exclusiveMinimum":0,"maximum":3600000}},"required":["durationMs"],"additionalProperties":false}},"transcript":{"default":[],"maxItems":1000,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":200},"role":{"type":"string","enum":["user","assistant"]},"content":{"type":"string","maxLength":20000},"tools":{"$ref":"#/components/schemas/JsonValue"},"progress":{"$ref":"#/components/schemas/JsonValue"},"videoUrl":{"$ref":"#/components/schemas/JsonValue"},"videoFilename":{"$ref":"#/components/schemas/JsonValue"},"renderProposal":{"$ref":"#/components/schemas/JsonValue"},"jobProposal":{"$ref":"#/components/schemas/JsonValue"}},"required":["id","role","content"],"additionalProperties":false}},"thumbnailUrl":{"anyOf":[{"type":"string","maxLength":300000,"pattern":"^data:image\\/[a-zA-Z0-9.+-]+;base64,[a-zA-Z0-9+/=]+$"},{"type":"null"}]},"expectedVersion":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["title","scene","expectedVersion"],"additionalProperties":false},"MolecularProjectExpectedVersionRequest":{"type":"object","properties":{"expectedVersion":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["expectedVersion"],"additionalProperties":false},"MolecularProjectRestoreRequest":{"type":"object","properties":{"expectedVersion":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["expectedVersion"],"additionalProperties":false},"MolecularProjectShareRequest":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":200},"scene":{"description":"A Molecular Studio SceneState accepted by the canonical runtime parser.","anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/components/schemas/JsonValue"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/components/schemas/JsonValue"}}],"$ref":"#/components/schemas/JsonValue"},"shots":{"default":[],"maxItems":100,"type":"array","items":{"type":"object","properties":{"description":{"type":"string","maxLength":2000},"focus":{"$ref":"#/components/schemas/JsonValue"},"preset":{"type":"string","enum":["front","back","left","right","top","bottom","default"]},"orbitDegrees":{"type":"number"},"durationMs":{"type":"number","exclusiveMinimum":0,"maximum":3600000}},"required":["durationMs"],"additionalProperties":false}},"transcript":{"default":[],"maxItems":1000,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":200},"role":{"type":"string","enum":["user","assistant"]},"content":{"type":"string","maxLength":20000},"tools":{"$ref":"#/components/schemas/JsonValue"},"progress":{"$ref":"#/components/schemas/JsonValue"},"videoUrl":{"$ref":"#/components/schemas/JsonValue"},"videoFilename":{"$ref":"#/components/schemas/JsonValue"},"renderProposal":{"$ref":"#/components/schemas/JsonValue"},"jobProposal":{"$ref":"#/components/schemas/JsonValue"}},"required":["id","role","content"],"additionalProperties":false}},"thumbnailUrl":{"anyOf":[{"type":"string","maxLength":300000,"pattern":"^data:image\\/[a-zA-Z0-9.+-]+;base64,[a-zA-Z0-9+/=]+$"},{"type":"null"}]},"expectedVersion":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"rotate":{"default":false,"type":"boolean"}},"required":["title","scene","expectedVersion"],"additionalProperties":false},"MolecularProjectRevokeShareRequest":{"type":"object","properties":{"expectedVersion":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["expectedVersion"],"additionalProperties":false},"MolecularProjectError":{"type":"object","properties":{"error":{"type":"string","minLength":1},"code":{"type":"string","minLength":1},"requestId":{"type":"string","minLength":1,"maxLength":128},"currentVersion":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["error","code","requestId"],"additionalProperties":false},"MolecularProjectPage":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"revisionId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"version":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"hash":{"type":"string","pattern":"^[a-f0-9]{64}$"},"timestamp":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"projectId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"title":{"type":"string","minLength":1,"maxLength":200},"thumbnailUrl":{"anyOf":[{"type":"string","maxLength":300000,"pattern":"^data:image\\/[a-zA-Z0-9.+-]+;base64,[a-zA-Z0-9+/=]+$"},{"type":"null"}]},"hasShare":{"type":"boolean"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"uiLinks":{"type":"object","properties":{"studio":{"type":"string","minLength":1}},"required":["studio"],"additionalProperties":false}},"required":["revisionId","version","hash","timestamp","projectId","title","thumbnailUrl","hasShare","updatedAt","uiLinks"],"additionalProperties":false}},"nextCursor":{"anyOf":[{"type":"string","minLength":1,"maxLength":512},{"type":"null"}]},"requestId":{"type":"string","minLength":1,"maxLength":128}},"required":["items","nextCursor","requestId"],"additionalProperties":false},"MolecularProject":{"type":"object","properties":{"project":{"type":"object","properties":{"revisionId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"version":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"hash":{"type":"string","pattern":"^[a-f0-9]{64}$"},"timestamp":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"projectId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"title":{"type":"string","minLength":1,"maxLength":200},"scene":{"anyOf":[{"description":"A Molecular Studio SceneState accepted by the canonical runtime parser.","anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/components/schemas/JsonValue"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/components/schemas/JsonValue"}}],"$ref":"#/components/schemas/JsonValue"},{"type":"null"}]},"shots":{"maxItems":100,"type":"array","items":{"type":"object","properties":{"description":{"type":"string","maxLength":2000},"focus":{"$ref":"#/components/schemas/JsonValue"},"preset":{"type":"string","enum":["front","back","left","right","top","bottom","default"]},"orbitDegrees":{"type":"number"},"durationMs":{"type":"number","exclusiveMinimum":0,"maximum":3600000}},"required":["durationMs"],"additionalProperties":false}},"transcript":{"maxItems":1000,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":200},"role":{"type":"string","enum":["user","assistant"]},"content":{"type":"string","maxLength":20000},"tools":{"$ref":"#/components/schemas/JsonValue"},"progress":{"$ref":"#/components/schemas/JsonValue"},"videoUrl":{"$ref":"#/components/schemas/JsonValue"},"videoFilename":{"$ref":"#/components/schemas/JsonValue"},"renderProposal":{"$ref":"#/components/schemas/JsonValue"},"jobProposal":{"$ref":"#/components/schemas/JsonValue"}},"required":["id","role","content"],"additionalProperties":false}},"thumbnailUrl":{"anyOf":[{"type":"string","maxLength":300000,"pattern":"^data:image\\/[a-zA-Z0-9.+-]+;base64,[a-zA-Z0-9+/=]+$"},{"type":"null"}]},"uiLinks":{"type":"object","properties":{"studio":{"type":"string","minLength":1}},"required":["studio"],"additionalProperties":false}},"required":["revisionId","version","hash","timestamp","id","projectId","title","scene","shots","transcript","thumbnailUrl","uiLinks"],"additionalProperties":false},"requestId":{"type":"string","minLength":1,"maxLength":128}},"required":["project","requestId"],"additionalProperties":false},"MolecularProjectCreateResponse":{"type":"object","properties":{"revisionId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"version":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"hash":{"type":"string","pattern":"^[a-f0-9]{64}$"},"timestamp":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"projectId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"uiLinks":{"type":"object","properties":{"studio":{"type":"string","minLength":1}},"required":["studio"],"additionalProperties":false},"requestId":{"type":"string","minLength":1,"maxLength":128}},"required":["revisionId","version","hash","timestamp","projectId","uiLinks","requestId"],"additionalProperties":false},"MolecularProjectSaveResponse":{"type":"object","properties":{"revisionId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"version":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"hash":{"type":"string","pattern":"^[a-f0-9]{64}$"},"timestamp":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"projectId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"uiLinks":{"type":"object","properties":{"studio":{"type":"string","minLength":1}},"required":["studio"],"additionalProperties":false},"requestId":{"type":"string","minLength":1,"maxLength":128}},"required":["revisionId","version","hash","timestamp","projectId","uiLinks","requestId"],"additionalProperties":false},"MolecularProjectRevisionPage":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"revisionId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"version":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"hash":{"type":"string","pattern":"^[a-f0-9]{64}$"},"timestamp":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"title":{"type":"string","minLength":1,"maxLength":200},"thumbnailUrl":{"anyOf":[{"type":"string","maxLength":300000,"pattern":"^data:image\\/[a-zA-Z0-9.+-]+;base64,[a-zA-Z0-9+/=]+$"},{"type":"null"}]},"restoredFromVersion":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},{"type":"null"}]},"uiLinks":{"type":"object","properties":{"studio":{"type":"string","minLength":1}},"required":["studio"],"additionalProperties":false}},"required":["revisionId","version","hash","timestamp","title","thumbnailUrl","restoredFromVersion","uiLinks"],"additionalProperties":false}},"nextCursor":{"anyOf":[{"type":"string","minLength":1,"maxLength":512},{"type":"null"}]},"requestId":{"type":"string","minLength":1,"maxLength":128}},"required":["items","nextCursor","requestId"],"additionalProperties":false},"MolecularProjectRevision":{"type":"object","properties":{"revision":{"type":"object","properties":{"revisionId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"version":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"hash":{"type":"string","pattern":"^[a-f0-9]{64}$"},"timestamp":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"projectId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"title":{"type":"string","minLength":1,"maxLength":200},"thumbnailUrl":{"anyOf":[{"type":"string","maxLength":300000,"pattern":"^data:image\\/[a-zA-Z0-9.+-]+;base64,[a-zA-Z0-9+/=]+$"},{"type":"null"}]},"restoredFromVersion":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},{"type":"null"}]},"contentSha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"scene":{"description":"A Molecular Studio SceneState accepted by the canonical runtime parser.","anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/components/schemas/JsonValue"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/components/schemas/JsonValue"}}],"$ref":"#/components/schemas/JsonValue"},"shots":{"maxItems":100,"type":"array","items":{"type":"object","properties":{"description":{"type":"string","maxLength":2000},"focus":{"$ref":"#/components/schemas/JsonValue"},"preset":{"type":"string","enum":["front","back","left","right","top","bottom","default"]},"orbitDegrees":{"type":"number"},"durationMs":{"type":"number","exclusiveMinimum":0,"maximum":3600000}},"required":["durationMs"],"additionalProperties":false}},"transcript":{"maxItems":1000,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":200},"role":{"type":"string","enum":["user","assistant"]},"content":{"type":"string","maxLength":20000},"tools":{"$ref":"#/components/schemas/JsonValue"},"progress":{"$ref":"#/components/schemas/JsonValue"},"videoUrl":{"$ref":"#/components/schemas/JsonValue"},"videoFilename":{"$ref":"#/components/schemas/JsonValue"},"renderProposal":{"$ref":"#/components/schemas/JsonValue"},"jobProposal":{"$ref":"#/components/schemas/JsonValue"}},"required":["id","role","content"],"additionalProperties":false}},"uiLinks":{"type":"object","properties":{"studio":{"type":"string","minLength":1}},"required":["studio"],"additionalProperties":false}},"required":["revisionId","version","hash","timestamp","projectId","title","thumbnailUrl","restoredFromVersion","contentSha256","createdAt","scene","shots","transcript","uiLinks"],"additionalProperties":false},"requestId":{"type":"string","minLength":1,"maxLength":128}},"required":["revision","requestId"],"additionalProperties":false},"MolecularProjectRestoreResponse":{"type":"object","properties":{"revisionId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"version":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"hash":{"type":"string","pattern":"^[a-f0-9]{64}$"},"timestamp":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"projectId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"uiLinks":{"type":"object","properties":{"studio":{"type":"string","minLength":1}},"required":["studio"],"additionalProperties":false},"requestId":{"type":"string","minLength":1,"maxLength":128},"restoredFromVersion":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["revisionId","version","hash","timestamp","projectId","uiLinks","requestId","restoredFromVersion"],"additionalProperties":false},"MolecularProjectShareResponse":{"type":"object","properties":{"revisionId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"version":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"hash":{"type":"string","pattern":"^[a-f0-9]{64}$"},"timestamp":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"projectId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"uiLinks":{"type":"object","properties":{"studio":{"type":"string","minLength":1}},"required":["studio"],"additionalProperties":false},"requestId":{"type":"string","minLength":1,"maxLength":128},"token":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"expiresAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"sharePath":{"type":"string","minLength":1}},"required":["revisionId","version","hash","timestamp","projectId","uiLinks","requestId","token","expiresAt","sharePath"],"additionalProperties":false},"MolecularProjectStateResponse":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"state":{"type":"string","enum":["deleted","revoked"]},"version":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"requestId":{"type":"string","minLength":1,"maxLength":128}},"required":["ok","state","version","requestId"],"additionalProperties":false},"MolecularScene":{"type":"object","description":"A Molecular Studio SceneState. Treat as opaque: obtain it from POST /molecular/director and pass it back verbatim.","additionalProperties":true},"RenderManifest":{"type":"object","description":"A complete, declarative description of a movie: what to show (scene), how the camera moves (shots), and at what fidelity. This is the only input the render worker needs — it is rasterised headlessly with an offscreen WebGL context.","required":["scene","shots","resolution","fps","durationSeconds"],"properties":{"scene":{"type":"object","description":"A Molecular Studio SceneState. Treat as opaque: obtain it from POST /molecular/director and pass it back verbatim.","additionalProperties":true},"shots":{"type":"array","minItems":1,"maxItems":100,"description":"The storyboard — the camera beats to render, in order.","items":{"type":"object","additionalProperties":true}},"resolution":{"type":"string","enum":["1280x720","1920x1080","3840x2160"]},"fps":{"type":"integer","enum":[24,30,60]},"durationSeconds":{"type":"number","minimum":1,"maximum":60},"engine":{"type":"string","enum":["molstar","cycles"],"default":"molstar","description":"'molstar' is the full SceneState raster tier. 'cycles' accepts only structure, components, background, and camera shots; use preflightOnly before submission to validate the explicit Cycles subset."},"samples":{"type":"integer","minimum":1,"maximum":4096,"description":"Cycles path-tracing samples per frame. Ignored on the molstar tier."}},"additionalProperties":false},"SubmitMolecularRenderRequest":{"type":"object","required":["manifest"],"properties":{"manifest":{"$ref":"#/components/schemas/RenderManifest"},"jobName":{"type":"string","maxLength":200},"idempotencyKey":{"type":"string","description":"Retries with the same key replay the original job rather than submitting a second one."},"preflightOnly":{"type":"boolean","default":false,"description":"Validate engine capability and the renderer-specific scene subset without uploading a manifest, pricing, holding credits, or submitting a job."}},"additionalProperties":false},"MolecularRenderAccepted":{"type":"object","required":["jobId","frameCount","statusUrl"],"properties":{"jobId":{"type":"string"},"estimatedCost":{"type":"number","nullable":true,"description":"Estimated cost in USD."},"frameCount":{"type":"integer"},"manifestKey":{"type":"string","description":"Storage key the manifest was written to."},"statusUrl":{"type":"string"},"streamUrl":{"type":"string","description":"Server-Sent Events feed of job status."},"outputsUrl":{"type":"string"}},"additionalProperties":false},"DirectorRequest":{"type":"object","required":["messages"],"properties":{"messages":{"type":"array","minItems":1,"description":"Conversation so far, oldest first.","items":{"type":"object","required":["role","content"],"properties":{"role":{"type":"string","enum":["user","assistant"]},"content":{"type":"string"}},"additionalProperties":false}},"scene":{"type":"object","description":"A Molecular Studio SceneState. Treat as opaque: obtain it from POST /molecular/director and pass it back verbatim.","additionalProperties":true},"headless":{"type":"boolean","description":"Execute the billable ops the director proposes instead of merely emitting them. In the browser a render becomes a Confirm card and the viewer submits it; an API caller has no viewer, so the director submits the render itself and returns the job id via a `render_submitted` event. API-key auth with the `jobs:write` scope only — a cookie session is refused (403), because in the browser the Confirm button is the consent to spend."}},"additionalProperties":false},"MvsExportRequest":{"type":"object","required":["scene"],"properties":{"scene":{"type":"object","description":"A Molecular Studio SceneState. Treat as opaque: obtain it from POST /molecular/director and pass it back verbatim.","additionalProperties":true},"metadata":{"type":"object","properties":{"title":{"type":"string","maxLength":200},"description":{"type":"string","maxLength":1000}},"additionalProperties":false},"confirm":{"type":"boolean","description":"Disclosure precedes debit. Omit (or false) to receive a price quote and be charged nothing. Pass true to be charged and receive the MVS."}},"additionalProperties":false},"MvsExportResponse":{"type":"object","description":"Either a quote (when `confirm` was omitted) or the settled export (when it was confirmed).","properties":{"quote":{"type":"object","additionalProperties":true,"description":"Price, when unconfirmed."},"mvsj":{"type":"object","additionalProperties":true,"description":"The compiled MolViewSpec document. Present only on a confirmed, settled export."},"cached":{"type":"boolean","description":"Served from a previous settled export; not re-charged."}},"additionalProperties":true}}},"paths":{"/molecular/docking/experiments":{"get":{"operationId":"listDockingExperiments","tags":["Molecular Docking"],"summary":"List docking experiments","security":[{"ApiKeyAuth":["jobs:read"]}],"parameters":[{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"cursor","in":"query","schema":{"type":"string","maxLength":1024},"description":"Opaque keyset cursor from the previous page; do not construct it."}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DockingExperimentPage"}}}},"400":{"description":"Invalid request or pagination cursor","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API key lacks the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Owned resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Database, simulation, or artifact storage unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"operationId":"createDockingExperiment","tags":["Molecular Docking"],"summary":"Create a durable docking experiment","security":[{"ApiKeyAuth":["jobs:write"]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"Required retry key. Reusing it with identical content replays the durable response; different content returns 409."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateDockingExperimentRequest"}}}},"responses":{"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DockingExperimentResponse"}}}},"400":{"description":"Invalid request or pagination cursor","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API key lacks the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Owned resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotency key is pending or was reused with different content","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Database, simulation, or artifact storage unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/molecular/docking/experiments/{experimentId}":{"get":{"operationId":"getDockingExperiment","tags":["Molecular Docking"],"summary":"Get a docking experiment","security":[{"ApiKeyAuth":["jobs:read"]}],"parameters":[{"name":"experimentId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DockingExperimentResponse"}}}},"400":{"description":"Invalid request or pagination cursor","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API key lacks the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Owned resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Database, simulation, or artifact storage unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/molecular/docking/experiments/{experimentId}/validate":{"post":{"operationId":"validateDockingExperiment","tags":["Molecular Docking"],"summary":"Validate a docking experiment","security":[{"ApiKeyAuth":["jobs:write"]}],"parameters":[{"name":"experimentId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DockingValidation"}}}},"400":{"description":"Invalid request or pagination cursor","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API key lacks the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Owned resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Database, simulation, or artifact storage unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/molecular/docking/experiments/{experimentId}/estimate":{"post":{"operationId":"estimateDockingExperiment","tags":["Molecular Docking"],"summary":"Estimate docking runtime and billable cost","security":[{"ApiKeyAuth":["jobs:read"]}],"parameters":[{"name":"experimentId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DockingEstimate"}}}},"400":{"description":"Invalid request or pagination cursor","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Billing prerequisites are not satisfied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API key lacks the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Owned resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Configured docking engine differs from server authority","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Database, simulation, or artifact storage unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/molecular/docking/experiments/{experimentId}/runs":{"get":{"operationId":"listDockingRuns","tags":["Molecular Docking"],"summary":"List runs for a docking experiment","security":[{"ApiKeyAuth":["jobs:read"]}],"parameters":[{"name":"experimentId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"cursor","in":"query","schema":{"type":"string","maxLength":1024},"description":"Opaque keyset cursor from the previous page; do not construct it."}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DockingRunPage"}}}},"400":{"description":"Invalid request or pagination cursor","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API key lacks the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Owned resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Database, simulation, or artifact storage unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"operationId":"createDockingRun","tags":["Molecular Docking"],"summary":"Submit and durably record a docking run","security":[{"ApiKeyAuth":["jobs:write"]}],"parameters":[{"name":"experimentId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"Required retry key. Reusing it with identical content replays the durable response; different content returns 409."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateDockingRunRequest"}}}},"responses":{"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateDockingRunResponse"}}}},"400":{"description":"Invalid request or pagination cursor","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient credits or billing prerequisite failure","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API key lacks the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Owned resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotency key is pending or was reused with different content","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Cost limit or simulation validation failure","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Database, simulation, or artifact storage unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/molecular/docking/runs/{runId}":{"get":{"operationId":"getDockingRun","tags":["Molecular Docking"],"summary":"Get a docking run","security":[{"ApiKeyAuth":["jobs:read"]}],"parameters":[{"name":"runId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DockingRunResponse"}}}},"400":{"description":"Invalid request or pagination cursor","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API key lacks the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Owned resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Database, simulation, or artifact storage unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/molecular/docking/runs/{runId}/results":{"get":{"operationId":"listDockingResults","tags":["Molecular Docking"],"summary":"List durable results for a docking run","security":[{"ApiKeyAuth":["jobs:read"]}],"parameters":[{"name":"runId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"cursor","in":"query","schema":{"type":"string","maxLength":1024},"description":"Opaque keyset cursor from the previous page; do not construct it."}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DockingResultPage"}}}},"400":{"description":"Invalid request or pagination cursor","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API key lacks the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Owned resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Database, simulation, or artifact storage unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/molecular/docking/results/{resultId}":{"get":{"operationId":"getDockingResult","tags":["Molecular Docking"],"summary":"Get a durable docking result","security":[{"ApiKeyAuth":["jobs:read"]}],"parameters":[{"name":"resultId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DockingResultResponse"}}}},"400":{"description":"Invalid request or pagination cursor","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API key lacks the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Owned resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Database, simulation, or artifact storage unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/molecular/docking/results/{resultId}/poses":{"get":{"operationId":"listDockingPoses","tags":["Molecular Docking"],"summary":"List ranked durable poses for a result","security":[{"ApiKeyAuth":["jobs:read"]}],"parameters":[{"name":"resultId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"cursor","in":"query","schema":{"type":"string","maxLength":1024},"description":"Opaque keyset cursor from the previous page; do not construct it."}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DockingPosePage"}}}},"400":{"description":"Invalid request or pagination cursor","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API key lacks the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Owned resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Database, simulation, or artifact storage unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/molecular/docking/poses/{poseId}":{"get":{"operationId":"getDockingPose","tags":["Molecular Docking"],"summary":"Get a durable docking pose record","security":[{"ApiKeyAuth":["jobs:read"]}],"parameters":[{"name":"poseId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DockingPoseResponse"}}}},"400":{"description":"Invalid request or pagination cursor","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API key lacks the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Owned resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Database, simulation, or artifact storage unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/molecular/docking/poses/{poseId}/interaction-sets":{"get":{"operationId":"listDockingInteractionSets","tags":["Molecular Docking"],"summary":"List immutable interaction sets for a pose, each with its contacts (closest-first)","security":[{"ApiKeyAuth":["jobs:read"]}],"parameters":[{"name":"poseId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"cursor","in":"query","schema":{"type":"string","maxLength":1024},"description":"Opaque keyset cursor from the previous page; do not construct it."}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DockingInteractionSetPage"}}}},"400":{"description":"Invalid request or pagination cursor","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API key lacks the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Owned resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Database, simulation, or artifact storage unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"put":{"operationId":"putDockingInteractionSet","tags":["Molecular Docking"],"summary":"Create or replay an immutable interaction set","security":[{"ApiKeyAuth":["jobs:write"]}],"parameters":[{"name":"poseId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"Required retry key. Reusing it with identical content replays the durable response; different content returns 409."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PutDockingInteractionSetRequest"}}}},"responses":{"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PutDockingInteractionSetResponse"}}}},"400":{"description":"Invalid request or pagination cursor","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API key lacks the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Owned resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotency key is pending or was reused with different content","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Database, simulation, or artifact storage unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/molecular/docking/libraries":{"get":{"operationId":"listDockingLibraries","tags":["Molecular Docking"],"summary":"List registered ligand libraries","security":[{"ApiKeyAuth":["jobs:read"]}],"parameters":[{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"cursor","in":"query","schema":{"type":"string","maxLength":1024},"description":"Opaque keyset cursor from the previous page; do not construct it."}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DockingLibraryPage"}}}},"400":{"description":"Invalid request or pagination cursor","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API key lacks the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Owned resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Database, simulation, or artifact storage unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"operationId":"registerDockingLibrary","tags":["Molecular Docking"],"summary":"Register and validate a completed ligand-library upload","description":"Reads a completed owned upload, verifies its digest and content type, parses all ligands, and durably registers the validated library. Replays return 200.","security":[{"ApiKeyAuth":["jobs:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterDockingLibraryRequest"}}}},"responses":{"200":{"description":"Idempotent registration replay","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterDockingLibraryResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterDockingLibraryResponse"}}}},"400":{"description":"Invalid request or pagination cursor","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API key lacks the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Owned resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Upload metadata or prior registration conflicts","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Library content or upload metadata is invalid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Database, simulation, or artifact storage unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/molecular/docking/libraries/{libraryId}":{"get":{"operationId":"getDockingLibrary","tags":["Molecular Docking"],"summary":"Get registered ligand-library metadata","security":[{"ApiKeyAuth":["jobs:read"]}],"parameters":[{"name":"libraryId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DockingLibraryResponse"}}}},"400":{"description":"Invalid request or pagination cursor","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API key lacks the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Owned resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Database, simulation, or artifact storage unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/molecular/docking/batches":{"post":{"operationId":"createDockingBatch","tags":["Molecular Docking"],"summary":"Create and dispatch a batch docking screen","security":[{"ApiKeyAuth":["jobs:write"]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"Required retry key. Reusing it with identical content replays the durable response; different content returns 409."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateDockingBatchRequest"}}}},"responses":{"200":{"description":"Idempotent batch-creation replay","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateDockingBatchResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateDockingBatchResponse"}}}},"400":{"description":"Invalid request or pagination cursor","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient credits or rolling spend cap exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API key lacks the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Owned resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotency key is pending or was reused with different content","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Batch budget or cost limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Database, simulation, or artifact storage unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/molecular/docking/batches/{batchId}":{"get":{"operationId":"getDockingBatchSummary","tags":["Molecular Docking"],"summary":"Get a reduced docking batch summary","security":[{"ApiKeyAuth":["jobs:read"]}],"parameters":[{"name":"batchId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DockingBatchSummaryResponse"}}}},"400":{"description":"Invalid request or pagination cursor","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API key lacks the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Owned resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Database, simulation, or artifact storage unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/molecular/docking/batches/{batchId}/tasks":{"get":{"operationId":"listDockingBatchTasks","tags":["Molecular Docking"],"summary":"List scalar docking batch task outcomes","security":[{"ApiKeyAuth":["jobs:read"]}],"parameters":[{"name":"batchId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"cursor","in":"query","schema":{"type":"string","maxLength":1024},"description":"Opaque keyset cursor from the previous page; do not construct it."}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DockingBatchTaskPage"}}}},"400":{"description":"Invalid request or pagination cursor","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API key lacks the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Owned resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Database, simulation, or artifact storage unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/molecular/docking/batches/{batchId}/hits":{"get":{"operationId":"listDockingBatchHits","tags":["Molecular Docking"],"summary":"List successful docking batch hits by best affinity","security":[{"ApiKeyAuth":["jobs:read"]}],"parameters":[{"name":"batchId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"cursor","in":"query","schema":{"type":"string","maxLength":1024},"description":"Opaque keyset cursor from the previous page; do not construct it."}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DockingBatchTaskPage"}}}},"400":{"description":"Invalid request or pagination cursor","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API key lacks the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Owned resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Database, simulation, or artifact storage unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/molecular/docking/batches/{batchId}/retry":{"post":{"operationId":"retryDockingBatch","tags":["Molecular Docking"],"summary":"Prepare or dispatch retryable failed ligands","description":"Set prepareOnly=true to return the assembled child request without dispatch or billing. The default dispatches billable work.","security":[{"ApiKeyAuth":["jobs:write"]}],"parameters":[{"name":"batchId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"Required retry key. Reusing it with identical content replays the durable response; different content returns 409."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DockingBatchRetryRequest"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DockingBatchRetryResponse"}}}},"201":{"description":"Retry child batch dispatched","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DockingBatchRetryResponse"}}}},"400":{"description":"Invalid request or pagination cursor","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient credits or rolling spend cap exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API key lacks the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Owned resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Stored batch result or campaign lineage is invalid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Requested retry subset is invalid or not retryable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Database, simulation, or artifact storage unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/molecular/docking/batches/{batchId}/promote":{"post":{"operationId":"promoteDockingBatch","tags":["Molecular Docking"],"summary":"Prepare or dispatch the next funnel tier","description":"Selects survivors using the persisted campaign plan. Set prepareOnly=true for a non-billable preparation; the default dispatches the next tier.","security":[{"ApiKeyAuth":["jobs:write"]}],"parameters":[{"name":"batchId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"Required retry key. Reusing it with identical content replays the durable response; different content returns 409."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DockingBatchPromotionRequest"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DockingBatchPromotionResponse"}}}},"201":{"description":"Promotion child batch dispatched","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DockingBatchPromotionResponse"}}}},"400":{"description":"Invalid request or pagination cursor","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient credits or rolling spend cap exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API key lacks the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Owned resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Campaign lineage or plan does not match","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Tier selection is invalid or has no survivors","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Database, simulation, or artifact storage unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/molecular/docking/batches/{batchId}/poses/{artifactId}":{"get":{"operationId":"getDockingBatchPoseArtifact","tags":["Molecular Docking"],"summary":"Get durable metadata for a pose artifact","description":"Returns durable bucket, key, digest, size, and media type metadata. It does not return or persist a signed URL.","security":[{"ApiKeyAuth":["jobs:read"]}],"parameters":[{"name":"batchId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"artifactId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DockingPoseArtifact"}}}},"400":{"description":"Invalid request or pagination cursor","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API key lacks the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Owned resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Database, simulation, or artifact storage unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/molecular/artifacts/ingest":{"post":{"operationId":"ingestDockingArtifacts","tags":["Molecular Docking"],"summary":"Verify and durably ingest docking result artifacts","description":"Discovers worker outputs under the owned job prefix, verifies size and SHA-256, and persists durable artifact metadata. A repeated completed ingestion returns 200 with replayed=true.","security":[{"ApiKeyAuth":["jobs:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IngestDockingArtifactsRequest"}}}},"responses":{"200":{"description":"Completed ingestion replay","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IngestDockingArtifactsResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IngestDockingArtifactsResponse"}}}},"400":{"description":"Invalid request or pagination cursor","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API key lacks the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Owned resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Manifest, provenance, ownership prefix, or artifact integrity validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Database, simulation, or artifact storage unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/molecular/artifacts/{id}/url":{"get":{"operationId":"resolveDockingArtifactUrl","tags":["Molecular Docking"],"summary":"Mint a short-lived download URL for an owned artifact","description":"Mints a temporary signed URL from durable artifact metadata. Persist the artifact id, storage key, digest, and size—not the returned URL.","security":[{"ApiKeyAuth":["jobs:read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DockingArtifactUrl"}}}},"400":{"description":"Invalid request or pagination cursor","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API key lacks the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Owned resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Database, simulation, or artifact storage unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/molecular/artifacts/urls":{"post":{"operationId":"resolveDockingArtifactUrls","tags":["Molecular Docking"],"summary":"Mint short-lived download URLs for up to 100 artifacts","description":"Returns one outcome per requested id, preserving order and duplicates. Signed URLs are ephemeral capabilities and must not be persisted.","security":[{"ApiKeyAuth":["jobs:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResolveDockingArtifactUrlsRequest"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DockingArtifactUrlBatchResponse"}}}},"400":{"description":"Invalid request or pagination cursor","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API key lacks the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Owned resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Database, simulation, or artifact storage unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/molecular/structures/urls":{"post":{"operationId":"resolveStructureUrls","tags":["Molecular Docking"],"summary":"Mint short-lived read URLs for your own uploaded structures","description":"Resolves owner-scoped storage keys (`uploads/{userId}/…`, `outputs/{userId}/…`) to short-lived read URLs. A scene references an uploaded structure by KEY, never by URL — a signed URL is a bearer credential and a scene is a durable, exportable document — so this exchange is deliberately separate and authenticated. The entire request is refused if any key is malformed or belongs to another account. The URLs returned are ephemeral capabilities and must not be persisted.","security":[{"ApiKeyAuth":["jobs:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResolveStructureUrlsRequest"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StructureUrlBatchResponse"}}}},"400":{"description":"Invalid request or pagination cursor","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API key lacks the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Owned resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Database, simulation, or artifact storage unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/molecular/projects":{"get":{"operationId":"listMolecularProjects","tags":["Molecular Projects"],"summary":"List molecular projects","description":"Cursor-paginates owned project heads. This is the successor to GET /api/molecular/projects.","security":[{"ApiKeyAuth":["projects:read"]}],"parameters":[{"name":"X-Request-Id","in":"header","required":false,"schema":{"type":"string","minLength":1,"maxLength":128},"description":"Optional caller correlation identifier. Values longer than 128 characters are truncated."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":25}},{"name":"cursor","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":512},"description":"Opaque cursor returned as nextCursor by the preceding page."}],"responses":{"200":{"description":"Owned project page","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MolecularProjectPage"}}}},"400":{"description":"Malformed identifier, cursor, header, or request body","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MolecularProjectError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MolecularProjectError"}}}},"403":{"description":"The caller lacks the required project scope or session CSRF validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum requests permitted in the current window.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected service failure","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Project, idempotency, or rate-limit store unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MolecularProjectError"}}}}},"x-legacy-deprecated":true,"x-legacy-path":"/api/molecular/projects"},"post":{"operationId":"createMolecularProject","tags":["Molecular Projects"],"summary":"Create a molecular project","description":"Creates version 1. This is the successor to POST /api/molecular/projects.","security":[{"ApiKeyAuth":["projects:write"]}],"parameters":[{"name":"X-Request-Id","in":"header","required":false,"schema":{"type":"string","minLength":1,"maxLength":128},"description":"Optional caller correlation identifier. Values longer than 128 characters are truncated."},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255,"pattern":"^[\\x21-\\x7E]+$"},"description":"Required retry key. Reuse with identical content replays the durable response; reuse with different content returns 409."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MolecularProjectCreateRequest"}}}},"responses":{"201":{"description":"Project created or replayed","headers":{"Idempotency-Replayed":{"description":"True when the durable response was replayed for the same key and content.","schema":{"type":"string","const":"true","example":"true"}},"Location":{"description":"Canonical API path of the created project.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MolecularProjectCreateResponse"},"examples":{"replay":{"summary":"Durable idempotency replay","value":{"projectId":"e3000000-0000-4000-8000-000000000002","revisionId":"e3000000-0000-4000-8000-000000000003","version":1,"hash":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","timestamp":"2026-08-03T00:00:00Z","uiLinks":{"studio":"/molecular/studio?project=e3000000-0000-4000-8000-000000000002"},"requestId":"req-project-create-01"}}}}}},"400":{"description":"Malformed identifier, cursor, header, or request body","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MolecularProjectError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MolecularProjectError"}}}},"403":{"description":"The caller lacks the required project scope or session CSRF validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Optimistic-concurrency conflict or idempotency-key conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MolecularProjectError"},"examples":{"versionConflict":{"summary":"The project head advanced after the client read it","value":{"error":"Project version conflict","code":"VERSION_CONFLICT","requestId":"req-project-save-01","currentVersion":8}},"idempotencyMismatch":{"summary":"The key was reused with different request content","value":{"error":"Idempotency-Key was already used with different content","code":"IDEMPOTENCY_MISMATCH","requestId":"req-project-save-02"}}}}}},"413":{"description":"Request payload exceeds the deployment limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum requests permitted in the current window.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected service failure","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Project, idempotency, or rate-limit store unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MolecularProjectError"}}}}},"x-legacy-deprecated":true,"x-legacy-path":"/api/molecular/projects"}},"/molecular/projects/{id}":{"get":{"operationId":"getMolecularProject","tags":["Molecular Projects"],"summary":"Get a molecular project head","description":"Returns the current owned project head and immutable revision identity.","security":[{"ApiKeyAuth":["projects:read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Request-Id","in":"header","required":false,"schema":{"type":"string","minLength":1,"maxLength":128},"description":"Optional caller correlation identifier. Values longer than 128 characters are truncated."}],"responses":{"200":{"description":"Current project head","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MolecularProject"}}}},"400":{"description":"Malformed identifier, cursor, header, or request body","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MolecularProjectError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MolecularProjectError"}}}},"403":{"description":"The caller lacks the required project scope or session CSRF validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Owned project or revision not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MolecularProjectError"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum requests permitted in the current window.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected service failure","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Project, idempotency, or rate-limit store unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MolecularProjectError"}}}}},"x-legacy-deprecated":true,"x-legacy-path":"/api/molecular/projects/{id}"},"put":{"operationId":"saveMolecularProject","tags":["Molecular Projects"],"summary":"Append a project revision","description":"Requires expectedVersion and atomically appends one successor revision.","security":[{"ApiKeyAuth":["projects:write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Request-Id","in":"header","required":false,"schema":{"type":"string","minLength":1,"maxLength":128},"description":"Optional caller correlation identifier. Values longer than 128 characters are truncated."},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255,"pattern":"^[\\x21-\\x7E]+$"},"description":"Required retry key. Reuse with identical content replays the durable response; reuse with different content returns 409."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MolecularProjectSaveRequest"}}}},"responses":{"200":{"description":"Revision appended or replayed","headers":{"Idempotency-Replayed":{"description":"True when the durable response was replayed for the same key and content.","schema":{"type":"string","const":"true","example":"true"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MolecularProjectSaveResponse"}}}},"400":{"description":"Malformed identifier, cursor, header, or request body","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MolecularProjectError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MolecularProjectError"}}}},"403":{"description":"The caller lacks the required project scope or session CSRF validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Owned project or revision not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MolecularProjectError"}}}},"409":{"description":"Optimistic-concurrency conflict or idempotency-key conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MolecularProjectError"},"examples":{"versionConflict":{"summary":"The project head advanced after the client read it","value":{"error":"Project version conflict","code":"VERSION_CONFLICT","requestId":"req-project-save-01","currentVersion":8}},"idempotencyMismatch":{"summary":"The key was reused with different request content","value":{"error":"Idempotency-Key was already used with different content","code":"IDEMPOTENCY_MISMATCH","requestId":"req-project-save-02"}}}}}},"413":{"description":"Request payload exceeds the deployment limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum requests permitted in the current window.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected service failure","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Project, idempotency, or rate-limit store unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MolecularProjectError"}}}}},"x-legacy-deprecated":true,"x-legacy-path":"/api/molecular/projects/{id}"},"delete":{"operationId":"deleteMolecularProject","tags":["Molecular Projects"],"summary":"Delete a molecular project","description":"Requires expectedVersion and deletes the owned project.","security":[{"ApiKeyAuth":["projects:write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Request-Id","in":"header","required":false,"schema":{"type":"string","minLength":1,"maxLength":128},"description":"Optional caller correlation identifier. Values longer than 128 characters are truncated."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MolecularProjectExpectedVersionRequest"}}}},"responses":{"200":{"description":"Project deleted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MolecularProjectStateResponse"}}}},"400":{"description":"Malformed identifier, cursor, header, or request body","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MolecularProjectError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MolecularProjectError"}}}},"403":{"description":"The caller lacks the required project scope or session CSRF validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Owned project or revision not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MolecularProjectError"}}}},"409":{"description":"Optimistic-concurrency conflict or idempotency-key conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MolecularProjectError"},"examples":{"versionConflict":{"summary":"The project head advanced after the client read it","value":{"error":"Project version conflict","code":"VERSION_CONFLICT","requestId":"req-project-save-01","currentVersion":8}},"idempotencyMismatch":{"summary":"The key was reused with different request content","value":{"error":"Idempotency-Key was already used with different content","code":"IDEMPOTENCY_MISMATCH","requestId":"req-project-save-02"}}}}}},"429":{"description":"Rate limit exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum requests permitted in the current window.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected service failure","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Project, idempotency, or rate-limit store unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MolecularProjectError"}}}}},"x-legacy-deprecated":true,"x-legacy-path":"/api/molecular/projects/{id}"}},"/molecular/projects/{id}/revisions":{"get":{"operationId":"listMolecularProjectRevisions","tags":["Molecular Projects"],"summary":"List immutable project revisions","security":[{"ApiKeyAuth":["projects:read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Request-Id","in":"header","required":false,"schema":{"type":"string","minLength":1,"maxLength":128},"description":"Optional caller correlation identifier. Values longer than 128 characters are truncated."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":25}},{"name":"cursor","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":512},"description":"Opaque cursor returned as nextCursor by the preceding page."}],"responses":{"200":{"description":"Revision page","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MolecularProjectRevisionPage"}}}},"400":{"description":"Malformed identifier, cursor, header, or request body","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MolecularProjectError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MolecularProjectError"}}}},"403":{"description":"The caller lacks the required project scope or session CSRF validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Owned project or revision not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MolecularProjectError"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum requests permitted in the current window.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected service failure","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Project, idempotency, or rate-limit store unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MolecularProjectError"}}}}},"x-legacy-deprecated":true,"x-legacy-path":"/api/molecular/projects/{id}/revisions"}},"/molecular/projects/{id}/revisions/{version}":{"get":{"operationId":"getMolecularProjectRevision","tags":["Molecular Projects"],"summary":"Get an immutable project revision","security":[{"ApiKeyAuth":["projects:read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"version","in":"path","required":true,"schema":{"type":"integer","minimum":1}},{"name":"X-Request-Id","in":"header","required":false,"schema":{"type":"string","minLength":1,"maxLength":128},"description":"Optional caller correlation identifier. Values longer than 128 characters are truncated."}],"responses":{"200":{"description":"Immutable revision","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MolecularProjectRevision"}}}},"400":{"description":"Malformed identifier, cursor, header, or request body","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MolecularProjectError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MolecularProjectError"}}}},"403":{"description":"The caller lacks the required project scope or session CSRF validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Owned project or revision not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MolecularProjectError"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum requests permitted in the current window.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected service failure","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Project, idempotency, or rate-limit store unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MolecularProjectError"}}}}},"x-legacy-deprecated":true,"x-legacy-path":"/api/molecular/projects/{id}/revisions/{version}"}},"/molecular/projects/{id}/revisions/{version}/restore":{"post":{"operationId":"restoreMolecularProjectRevision","tags":["Molecular Projects"],"summary":"Restore a revision as a successor","description":"Requires expectedVersion and appends the selected historical state as a new project head.","security":[{"ApiKeyAuth":["projects:write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"version","in":"path","required":true,"schema":{"type":"integer","minimum":1}},{"name":"X-Request-Id","in":"header","required":false,"schema":{"type":"string","minLength":1,"maxLength":128},"description":"Optional caller correlation identifier. Values longer than 128 characters are truncated."},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255,"pattern":"^[\\x21-\\x7E]+$"},"description":"Required retry key. Reuse with identical content replays the durable response; reuse with different content returns 409."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MolecularProjectRestoreRequest"}}}},"responses":{"200":{"description":"Revision restored or replayed","headers":{"Idempotency-Replayed":{"description":"True when the durable response was replayed for the same key and content.","schema":{"type":"string","const":"true","example":"true"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MolecularProjectRestoreResponse"}}}},"400":{"description":"Malformed identifier, cursor, header, or request body","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MolecularProjectError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MolecularProjectError"}}}},"403":{"description":"The caller lacks the required project scope or session CSRF validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Owned project or revision not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MolecularProjectError"}}}},"409":{"description":"Optimistic-concurrency conflict or idempotency-key conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MolecularProjectError"},"examples":{"versionConflict":{"summary":"The project head advanced after the client read it","value":{"error":"Project version conflict","code":"VERSION_CONFLICT","requestId":"req-project-save-01","currentVersion":8}},"idempotencyMismatch":{"summary":"The key was reused with different request content","value":{"error":"Idempotency-Key was already used with different content","code":"IDEMPOTENCY_MISMATCH","requestId":"req-project-save-02"}}}}}},"429":{"description":"Rate limit exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum requests permitted in the current window.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected service failure","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Project, idempotency, or rate-limit store unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MolecularProjectError"}}}}},"x-legacy-deprecated":true,"x-legacy-path":"/api/molecular/projects/{id}/revisions/{version}/restore"}},"/molecular/projects/{id}/shares":{"post":{"operationId":"shareMolecularProject","tags":["Molecular Projects"],"summary":"Save and share a project revision","description":"Requires expectedVersion, appends a revision, and pins a capability to that immutable revision.","security":[{"ApiKeyAuth":["projects:write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Request-Id","in":"header","required":false,"schema":{"type":"string","minLength":1,"maxLength":128},"description":"Optional caller correlation identifier. Values longer than 128 characters are truncated."},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255,"pattern":"^[\\x21-\\x7E]+$"},"description":"Required retry key. Reuse with identical content replays the durable response; reuse with different content returns 409."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MolecularProjectShareRequest"}}}},"responses":{"200":{"description":"Revision shared or replayed","headers":{"Idempotency-Replayed":{"description":"True when the durable response was replayed for the same key and content.","schema":{"type":"string","const":"true","example":"true"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MolecularProjectShareResponse"}}}},"400":{"description":"Malformed identifier, cursor, header, or request body","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MolecularProjectError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MolecularProjectError"}}}},"403":{"description":"The caller lacks the required project scope or session CSRF validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Owned project or revision not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MolecularProjectError"}}}},"409":{"description":"Optimistic-concurrency conflict or idempotency-key conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MolecularProjectError"},"examples":{"versionConflict":{"summary":"The project head advanced after the client read it","value":{"error":"Project version conflict","code":"VERSION_CONFLICT","requestId":"req-project-save-01","currentVersion":8}},"idempotencyMismatch":{"summary":"The key was reused with different request content","value":{"error":"Idempotency-Key was already used with different content","code":"IDEMPOTENCY_MISMATCH","requestId":"req-project-save-02"}}}}}},"413":{"description":"Request payload exceeds the deployment limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"The project cannot be shared safely","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MolecularProjectError"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum requests permitted in the current window.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected service failure","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Project, idempotency, or rate-limit store unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MolecularProjectError"}}}}},"x-legacy-deprecated":true,"x-legacy-path":"/api/molecular/projects/{id}/share"},"delete":{"operationId":"revokeMolecularProjectShare","tags":["Molecular Projects"],"summary":"Revoke a project share","description":"Requires expectedVersion and invalidates the current share capability.","security":[{"ApiKeyAuth":["projects:write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Request-Id","in":"header","required":false,"schema":{"type":"string","minLength":1,"maxLength":128},"description":"Optional caller correlation identifier. Values longer than 128 characters are truncated."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MolecularProjectRevokeShareRequest"}}}},"responses":{"200":{"description":"Share revoked","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MolecularProjectStateResponse"}}}},"400":{"description":"Malformed identifier, cursor, header, or request body","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MolecularProjectError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MolecularProjectError"}}}},"403":{"description":"The caller lacks the required project scope or session CSRF validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Owned project or revision not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MolecularProjectError"}}}},"409":{"description":"Optimistic-concurrency conflict or idempotency-key conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MolecularProjectError"},"examples":{"versionConflict":{"summary":"The project head advanced after the client read it","value":{"error":"Project version conflict","code":"VERSION_CONFLICT","requestId":"req-project-save-01","currentVersion":8}},"idempotencyMismatch":{"summary":"The key was reused with different request content","value":{"error":"Idempotency-Key was already used with different content","code":"IDEMPOTENCY_MISMATCH","requestId":"req-project-save-02"}}}}}},"429":{"description":"Rate limit exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum requests permitted in the current window.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected service failure","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Project, idempotency, or rate-limit store unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MolecularProjectError"}}}}},"x-legacy-deprecated":true,"x-legacy-path":"/api/molecular/projects/{id}/share"}},"/molecular/ligands/resolve":{"post":{"operationId":"resolveMolecularLigand","tags":["Molecular Docking"],"summary":"Resolve and preview an explicit ligand identity","description":"Resolves a name/brand, SMILES, InChIKey, or PubChem CID. The namespace is explicit so short values such as CCO, ATP, REA, and IBP are never guessed. Returns provenance, an optional depiction, and a short-lived user-bound HMAC confirmation token for direct docking-experiment creation.","security":[{"ApiKeyAuth":["jobs:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["query","namespace"],"properties":{"query":{"type":"string","minLength":1,"maxLength":512},"namespace":{"type":"string","enum":["name","smiles","inchikey","cid"]},"includeDepiction":{"type":"boolean","default":false}},"additionalProperties":false}}}},"responses":{"200":{"description":"Resolved identity awaiting explicit confirmation","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request or pagination cursor","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API key lacks the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No matching PubChem compound","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"The name matched multiple compounds; body includes selectable signed candidates","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Database, simulation, or artifact storage unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/molecular/director":{"post":{"operationId":"directMolecularScene","tags":["Molecular Studio"],"summary":"Direct a molecular scene in plain English","description":"The conversational director. A plain-English instruction goes in; a stream of viewer operations and a short reply come out. The scene is reduced server-side, so the response is authoritative.\n\nResponds as `text/event-stream`. Events: `op` (a viewer operation), `delta`/`message` (the reply), `tool` (an action taken), `usage`, and — in headless mode — `render_submitted` / `render_failed` (carrying the job id and poll URLs) and `scene` (the resulting SceneState, which you pass back on the next turn).\n\nBillable: each turn consumes credits.","security":[{"ApiKeyAuth":["jobs:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DirectorRequest"}}}},"responses":{"200":{"description":"Server-Sent Events stream of viewer operations and the reply","content":{"text/event-stream":{"schema":{"type":"string"}}}},"400":{"description":"Invalid request or pagination cursor","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient credits to run the turn","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API key lacks the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Owned resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Database, simulation, or artifact storage unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/molecular/renders":{"post":{"operationId":"submitMolecularRender","tags":["Molecular Studio"],"summary":"Submit a publication render from a declarative manifest","description":"Render a molecular movie on the farm — headlessly. No browser and no viewer are involved: the manifest is pure declarative JSON and the worker rasterises it with an offscreen WebGL context.\n\nThe manifest is validated before anything is priced: every URL the worker would fetch (structure, overlays, volumes, annotation sources) must be on the allowlist, the cost knobs are bounded, and Cycles scenes must fit its explicit supported subset. A rejected manifest is a 400 and is never charged. Set `preflightOnly: true` to return the capability result without upload, pricing, a credit hold, or submission.\n\nBillable unless `preflightOnly` is true: places a credit hold. Poll `statusUrl`, then fetch the movie from `outputsUrl`.","security":[{"ApiKeyAuth":["jobs:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmitMolecularRenderRequest"}}}},"responses":{"200":{"description":"Renderer capability preflight result; no job was submitted","content":{"application/json":{"schema":{"type":"object","required":["preflight"]}}}},"202":{"description":"Render accepted and queued on the farm","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MolecularRenderAccepted"}}}},"400":{"description":"Invalid request or pagination cursor","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient credits to place the hold","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API key lacks the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Owned resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Database, simulation, or artifact storage unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/molecular/scenes/export":{"post":{"operationId":"exportSceneMvsj","tags":["Molecular Studio"],"summary":"Export a scene as MolViewSpec (.mvsj)","description":"Convert a scene to MolViewSpec — the open, viewer-independent standard for describing a molecular visualisation, which tools outside KinoCloud can load. This is a paid provenance/interchange artifact, charged from KinoCloud credits at the configured export price. It is a static snapshot: animation and camera storyboards are excluded, and consumer-specific styling may differ.\n\nDisclosure precedes debit: a POST without `confirm: true` returns only a price quote and charges nothing. Pass `confirm: true` only after presenting that quote. Re-exporting an identical scene is served from cache and is never charged twice.\n\nReturns 404 when `MVS_EXPORT_ENABLED` is off — a disabled export is indistinguishable from an absent route.","security":[{"ApiKeyAuth":["jobs:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MvsExportRequest"}}}},"responses":{"200":{"description":"A price quote, or the settled MolViewSpec export","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MvsExportResponse"}}}},"400":{"description":"Invalid request or pagination cursor","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API key lacks the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Owned resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Scene does not compile to valid MolViewSpec","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Database, simulation, or artifact storage unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/jobs/estimate":{"post":{"operationId":"estimateJob","tags":["Jobs"],"summary":"Estimate the cost of a render or simulation job before submitting","security":[{"ApiKeyAuth":["jobs:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EstimateJobRequest"}}}},"responses":{"200":{"description":"Estimated cost","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EstimateJobResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Active subscription or payment method required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API key missing the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/jobs/upload-url":{"post":{"operationId":"createUploadUrl","tags":["Jobs"],"summary":"Presign an upload URL for a scene / input file","description":"For a project package, send projectId and logicalPath together. Every object is stored as uploads/{userId}/{projectId}/project/{logicalPath}; both fields are required together. Optional sha256 is the 64-character hexadecimal SHA-256 of the entire file, not a base64 per-part checksum, and is retained as object metadata for worker-side integrity verification.","security":[{"ApiKeyAuth":["jobs:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadUrlRequest"}}}},"responses":{"200":{"description":"Presigned upload URL","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadUrlResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Active subscription or payment method required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API key missing the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/uploads":{"post":{"operationId":"initMultipartUpload","tags":["Jobs"],"summary":"Initiate a resumable multipart upload","description":"Presigns up to 1,000 part PUT URLs inline (none in checksum mode — see POST /uploads/{uploadId}/parts). Upload parts directly to storage (in parallel, resumable), then call POST /uploads/{uploadId}/complete. Bytes never transit the API, so this scales to multi-GB datasets (no 25 MB-class body ceiling). For project packages, send projectId and project-relative logicalPath together to use the shared uploads/{userId}/{projectId}/project/{logicalPath} namespace. The optional sha256 is the 64-character hexadecimal SHA-256 of the entire final file. Per-part checksumSha256 values are standard padded base64 of each raw 32-byte digest and are never interchangeable with it.","security":[{"ApiKeyAuth":["jobs:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultipartInitRequest"}}}},"responses":{"201":{"description":"Multipart upload initiated; presigned part URLs returned","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultipartInitResponse"}}}},"400":{"description":"Invalid checksum, project ID, logical path, or paired project fields","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API key missing the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"413":{"description":"Declared size exceeds the maximum","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"415":{"description":"Content type not permitted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Upload storage or database unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/uploads/{uploadId}":{"get":{"operationId":"getMultipartUploadStatus","tags":["Jobs"],"summary":"List received parts and the gaps (resume)","security":[{"ApiKeyAuth":["jobs:read"]}],"parameters":[{"name":"uploadId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Upload status with received parts and missing part numbers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultipartStatusResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Upload not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"operationId":"abortMultipartUpload","tags":["Jobs"],"summary":"Abort an in-progress multipart upload","security":[{"ApiKeyAuth":["jobs:write"]}],"parameters":[{"name":"uploadId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Upload aborted"},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Upload not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/uploads/{uploadId}/parts":{"post":{"operationId":"mintMultipartPartUrls","tags":["Jobs"],"summary":"Mint (or re-mint) presigned URLs for specific parts","description":"Pages part URLs beyond the 1,000 returned inline by init, replaces expired URLs mid-upload, and — for uploads initiated with checksumAlgorithm sha256 — signs each URL with that part's base64 SHA-256 so the store rejects corrupted bytes.","security":[{"ApiKeyAuth":["jobs:write"]}],"parameters":[{"name":"uploadId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultipartPartUrlsRequest"}}}},"responses":{"200":{"description":"Presigned part URLs minted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultipartPartUrlsResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Upload not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/uploads/{uploadId}/complete":{"post":{"operationId":"completeMultipartUpload","tags":["Jobs"],"summary":"Assemble parts into the final object (integrity gate)","security":[{"ApiKeyAuth":["jobs:write"]}],"parameters":[{"name":"uploadId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultipartCompleteRequest"}}}},"responses":{"200":{"description":"Object assembled and verified; key is submittable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultipartCompleteResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Upload not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"413":{"description":"Assembled object exceeds the maximum","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Integrity gate failed (empty or size mismatch)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/jobs/submit":{"post":{"operationId":"submitJob","tags":["Jobs"],"summary":"Submit a render or simulation job","security":[{"ApiKeyAuth":["jobs:write"]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Optional client key; retries replay the original job."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmitJobRequest"}}}},"responses":{"200":{"description":"Job submitted (or idempotent replay)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmitJobResponse"}}}},"400":{"description":"Invalid checksum, project ID, logical path, or paired project fields","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API key missing the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"413":{"description":"Declared size exceeds the maximum","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"415":{"description":"Content type not permitted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Upload storage unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/jobs":{"get":{"operationId":"listJobs","tags":["Jobs"],"summary":"List the caller's jobs","security":[{"ApiKeyAuth":["jobs:read"]}],"parameters":[{"name":"limit","in":"query","schema":{"type":"integer","maximum":100,"default":25}},{"name":"offset","in":"query","schema":{"type":"integer","default":0}},{"name":"status","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"A page of jobs"},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/jobs/{id}/status":{"get":{"operationId":"getJobStatus","tags":["Jobs"],"summary":"Get a job's status","security":[{"ApiKeyAuth":["jobs:read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Job status"},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/jobs/{id}/status/stream":{"get":{"operationId":"streamJobStatus","tags":["Jobs"],"summary":"Stream a job's status with Server-Sent Events","description":"Opens a text/event-stream channel that emits ready, status, error, and done events. Use this for live dashboards; use GET /jobs/{id}/status for polling clients.","security":[{"ApiKeyAuth":["jobs:read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Server-Sent Events stream of job status updates","content":{"text/event-stream":{"schema":{"type":"string","description":"SSE frames containing JSON event payloads."}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API key missing the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Job not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/jobs/{id}/outputs":{"get":{"operationId":"getJobOutputs","tags":["Jobs"],"summary":"Get presigned download URLs for a completed job's outputs","security":[{"ApiKeyAuth":["jobs:read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Output files (may be empty if still running)"},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Active subscription or payment method required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Job not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/jobs/{id}/cancel":{"post":{"operationId":"cancelJob","tags":["Jobs"],"summary":"Cancel a job","security":[{"ApiKeyAuth":["jobs:write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Job cancelled"},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/credits/balance":{"get":{"operationId":"getCreditBalance","tags":["Credits"],"summary":"Get the caller's credit balance","security":[{"ApiKeyAuth":["credits:read"]}],"responses":{"200":{"description":"Credit balance","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreditBalanceResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/credits/transactions":{"get":{"operationId":"listCreditTransactions","tags":["Credits"],"summary":"List credit ledger transactions","security":[{"ApiKeyAuth":["credits:read"]}],"responses":{"200":{"description":"A page of transactions"},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/credits/topup":{"post":{"operationId":"createCreditTopup","tags":["Credits"],"summary":"Start a credit top-up (session only) and get a Stripe Checkout URL","description":"Creates a one-time-payment Stripe Checkout session for a credit top-up tier. Managed from the browser, so it uses the cookie session — API keys cannot call it. Charged in GBP; balance integers use GBP pence despite the legacy `_cents` field suffix.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreditTopupRequest"}}}},"responses":{"200":{"description":"Checkout session created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreditTopupResponse"}}}},"400":{"description":"Unknown or missing tier id","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/credits/card-bonus":{"get":{"operationId":"getCardBonusEligibility","tags":["Credits"],"summary":"Check card-on-file bonus eligibility (session only)","description":"Whether the signed-in user can still claim the card-on-file promo bonus, and its current value (operator-configured in promo_config — PRD_CREDIT_EXPOSURE.md).","responses":{"200":{"description":"Eligibility and bonus amount"},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"operationId":"createCardBonusSetupSession","tags":["Credits"],"summary":"Start a card-on-file setup (no charge) and get a Stripe Checkout URL","description":"Creates a mode=setup Stripe Checkout session that saves a card without charging it. On completion the webhook grants the card-on-file bonus — once per user and once per physical card. Managed from the browser, so it uses the cookie session — API keys cannot call it.","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"successUrl":{"type":"string","description":"Same-origin path to return to on success"},"cancelUrl":{"type":"string","description":"Same-origin path to return to on cancel"}}}}}},"responses":{"200":{"description":"Checkout session created (url)"},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Bonus already claimed or promo disabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/keys":{"get":{"operationId":"listApiKeys","tags":["API Keys"],"summary":"List the caller's API keys (session only)","responses":{"200":{"description":"API keys"},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"operationId":"createApiKey","tags":["API Keys"],"summary":"Create an API key (session only)","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateApiKeyRequest"}}}},"responses":{"201":{"description":"Created; the plaintext key is returned once"},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/keys/{id}":{"delete":{"operationId":"revokeApiKey","tags":["API Keys"],"summary":"Revoke an API key (session only)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Revoked"},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found or already revoked","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/public/estimate":{"post":{"operationId":"publicEstimate","tags":["Public"],"summary":"Estimate render cost without authentication (marketing calculator)","description":"Unauthenticated pricing estimate used by the public site. Rate limited to 60 requests/min per IP. All body fields are optional and fall back to documented defaults.","security":[],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicEstimateRequest"}}}},"responses":{"200":{"description":"Estimated cost","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicEstimateResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}}}}