{"openapi":"3.1.0","info":{"title":"Aurora API","version":"1.0.0"},"servers":[{"url":"/v1"}],"paths":{"/":{"get":{"tags":["Discovery"],"summary":"Service discovery","operationId":"discovery__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Discovery"}}}},"default":{"description":"Refused. The `code` says why.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/models":{"get":{"tags":["Discovery"],"summary":"The models this deployment serves","description":"Every model this deployment serves: its id, what it accepts, the runtime\nit runs on and its gene output.","operationId":"list_models_models_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ModelCardView"},"type":"array","title":"Response List Models Models Get"}}}},"default":{"description":"Refused. The `code` says why.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"ApiKey":["read"]}]}},"/encoders":{"get":{"tags":["Discovery"],"summary":"The encoders a client may run locally","description":"The encoders a caller may run on their own machine to turn tiles into\nembeddings, each pinned so that two machines compute the same embedding. The\nPython package reads this list when it embeds locally.","operationId":"list_encoders_encoders_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Encoders Encoders Get"}}}},"default":{"description":"Refused. The `code` says why.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"ApiKey":["read"]}]}},"/auth/request-code":{"post":{"tags":["Account"],"summary":"Request a sign-in code","operationId":"request_code_auth_request_code_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RequestCodeBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RequestCodeOut"}}}},"422":{"description":"The request does not match this schema.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"default":{"description":"Refused. The `code` says why.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/auth/verify-code":{"post":{"tags":["Account"],"summary":"Exchange the code for a short-lived token","operationId":"verify_code_auth_verify_code_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyCodeBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyCodeOut"}}}},"422":{"description":"The request does not match this schema.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"default":{"description":"Refused. The `code` says why.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api-keys":{"get":{"tags":["Account"],"summary":"List my API keys","operationId":"list_keys_api_keys_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/KeyRow"},"type":"array","title":"Response List Keys Api Keys Get"}}}},"default":{"description":"Refused. The `code` says why.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"SessionToken":[]}]},"post":{"tags":["Account"],"summary":"Mint an API key","operationId":"mint_key_api_keys_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MintKeyBody"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MintedKey"}}}},"422":{"description":"The request does not match this schema.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"default":{"description":"Refused. The `code` says why.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"SessionToken":[]}]}},"/api-keys/terms":{"get":{"tags":["Account"],"summary":"The terms a mint must accept, and where to read them","description":"Read them with the session token before minting a key, or with an API key,\nincluding one refused because the Terms changed after it was minted.","operationId":"terms_api_keys_terms_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TermsOut"}}}},"default":{"description":"Refused. The `code` says why.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"SessionToken":[]},{"ApiKey":[]}]}},"/api-keys/{key_id}/rotate":{"post":{"tags":["Account"],"summary":"Rotate one of my API keys","operationId":"rotate_key_api_keys__key_id__rotate_post","security":[{"SessionToken":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"integer","title":"Key Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RotateBody"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RotatedKey"}}}},"422":{"description":"The request does not match this schema.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"default":{"description":"Refused. The `code` says why.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api-keys/{key_id}":{"delete":{"tags":["Account"],"summary":"Revoke one of my API keys","operationId":"revoke_key_api_keys__key_id__delete","security":[{"SessionToken":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"integer","title":"Key Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/RevokeBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"204":{"description":"Successful Response"},"422":{"description":"The request does not match this schema.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"default":{"description":"Refused. The `code` says why.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/me":{"get":{"tags":["Account"],"summary":"The calling key and its remaining life","description":"The calling key: whose it is, what it may do, and when it expires. Inside\nthe warning window, every response the key authenticates also carries its\nexpiry headers.","operationId":"me_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Me"}}}},"default":{"description":"Refused. The `code` says why.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"ApiKey":["read"]}]}},"/genes":{"get":{"tags":["Genes"],"summary":"Search the gene set","operationId":"search_genes_genes_get","security":[{"ApiKey":["read"]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","maxLength":64,"description":"symbol, alias or Ensembl id prefix","default":"","title":"Q"},"description":"symbol, alias or Ensembl id prefix"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GeneSetOut"}}}},"422":{"description":"The request does not match this schema.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"default":{"description":"Refused. The `code` says why.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/genes/resolve":{"post":{"tags":["Genes"],"summary":"Resolve names to Ensembl ids","operationId":"resolve_genes_genes_resolve_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResolveBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResolveOut"}}}},"422":{"description":"The request does not match this schema.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"default":{"description":"Refused. The `code` says why.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"ApiKey":["read"]}]}},"/uploads":{"post":{"tags":["Uploads"],"summary":"Start an upload","description":"Declare a file by its kind, name, size and tree hash. The response gives\nthe signed URL to send it to, the chunk size, and when that URL expires.","operationId":"start_upload_uploads_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadInitBody"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadInit"}}}},"422":{"description":"The request does not match this schema.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"default":{"description":"Refused. The `code` says why.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"security":[{"ApiKey":["submit"]}]}},"/uploads/{upload_id}/complete":{"post":{"tags":["Uploads"],"summary":"Finalise an upload and read its verdict","description":"Close an upload once every chunk is sent. A valid file is verified and\ncharged; anything else is refused with the reason.","operationId":"finish_upload_uploads__upload_id__complete_post","security":[{"ApiKey":["submit"]}],"parameters":[{"name":"upload_id","in":"path","required":true,"schema":{"type":"string","title":"Upload Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadVerdict"}}}},"422":{"description":"The request does not match this schema.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"default":{"description":"Refused. The `code` says why.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/jobs":{"post":{"tags":["Jobs"],"summary":"Create a job","description":"Start a prediction from a model id, an uploaded observation and any\ncovariates. The response is the job. Follow it with `GET /jobs/{job_id}`.","operationId":"create_job_jobs_post","security":[{"ApiKey":["submit"]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PredictionBody"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"}}}},"422":{"description":"The request does not match this schema.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"default":{"description":"Refused. The `code` says why.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"get":{"tags":["Jobs"],"summary":"List my jobs","description":"The account's jobs, newest first, one page at a time.","operationId":"list_jobs_jobs_get","security":[{"ApiKey":["read"]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"cursor","in":"query","required":false,"schema":{"type":"string","maxLength":64,"default":"","title":"Cursor"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobPage"}}}},"422":{"description":"The request does not match this schema.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"default":{"description":"Refused. The `code` says why.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/predictions":{"post":{"tags":["Predictions"],"summary":"Submit a prediction","description":"Use `POST /jobs` instead: it takes the same body and answers the same way.\nA job created through this route is the one `POST /jobs` would create, so a\nretry under the same `Idempotency-Key` through either route returns it.","operationId":"create_prediction_predictions_post","deprecated":true,"security":[{"ApiKey":["submit"]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PredictionBody"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"}}}},"422":{"description":"The request does not match this schema.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"default":{"description":"Refused. The `code` says why.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/jobs/{job_id}":{"get":{"tags":["Jobs"],"summary":"Read one job","operationId":"read_job_jobs__job_id__get","security":[{"ApiKey":["read"]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"}}}},"422":{"description":"The request does not match this schema.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"default":{"description":"Refused. The `code` says why.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"delete":{"tags":["Jobs"],"summary":"Purge a job","description":"Delete a job, its result and the job's own copy of what it read. A\nresult already imported into a workspace stays there. It cannot be\nundone.","operationId":"delete_job_jobs__job_id__delete","security":[{"ApiKey":["submit"]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"The request does not match this schema.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"default":{"description":"Refused. The `code` says why.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/jobs/{job_id}/result":{"get":{"tags":["Jobs"],"summary":"Download the result","description":"A signed link to the finished result, its size, and when the result\nexpires. Asked of a job that has not succeeded, it refuses with\n`result_not_ready`. Once the result is past its window, it refuses with\n`result_expired`.","operationId":"read_job_result_jobs__job_id__result_get","security":[{"ApiKey":["read"]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobResult"}}}},"422":{"description":"The request does not match this schema.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"default":{"description":"Refused. The `code` says why.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/jobs/{job_id}/cancel":{"post":{"tags":["Jobs"],"summary":"Cancel a job","description":"Stop a job. A waiting job is canceled at once; a running one keeps its\nstate until it stops. A finished job refuses with `job_not_cancelable`.","operationId":"cancel_job_jobs__job_id__cancel_post","security":[{"ApiKey":["submit"]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"}}}},"422":{"description":"The request does not match this schema.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"default":{"description":"Refused. The `code` says why.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}}},"components":{"schemas":{"Discovery":{"properties":{"service":{"type":"string","title":"Service"},"api_version":{"type":"string","title":"Api Version"},"docs":{"type":"string","title":"Docs"},"openapi":{"type":"string","title":"Openapi"},"llms_txt":{"type":"string","title":"Llms Txt"},"models":{"type":"string","title":"Models"},"access_request":{"type":"string","title":"Access Request"},"lanes":{"items":{"type":"string"},"type":"array","title":"Lanes","description":"The runtimes accepting work."},"retention":{"additionalProperties":true,"type":"object","title":"Retention"},"qc":{"additionalProperties":true,"type":"object","title":"Qc"}},"additionalProperties":false,"type":"object","required":["service","api_version","docs","openapi","llms_txt","models","access_request","lanes","retention","qc"],"title":"Discovery"},"GeneOut":{"properties":{"symbol":{"type":"string","title":"Symbol"},"ensembl_gene_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ensembl Gene Id"},"hgnc_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hgnc Id"},"biotype":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Biotype"},"in_ensembl":{"type":"boolean","title":"In Ensembl"}},"additionalProperties":false,"type":"object","required":["symbol","ensembl_gene_id","hgnc_id","biotype","in_ensembl"],"title":"GeneOut"},"GeneSetOut":{"properties":{"n_genes":{"type":"integer","title":"N Genes"},"ensembl_release":{"type":"integer","title":"Ensembl Release"},"fetch_date":{"type":"string","title":"Fetch Date"},"matches":{"items":{"$ref":"#/components/schemas/GeneOut"},"type":"array","title":"Matches"}},"additionalProperties":false,"type":"object","required":["n_genes","ensembl_release","fetch_date","matches"],"title":"GeneSetOut"},"Job":{"properties":{"id":{"type":"string","title":"Id"},"state":{"type":"string","title":"State","description":"One of `queued`, `validating`, `running`, `succeeded`, `failed`, `canceled`, `expired`."},"lane":{"type":"string","title":"Lane","description":"The runtime the job runs on."},"model":{"type":"string","title":"Model","description":"The id of the model the job runs."},"observation":{"type":"string","title":"Observation","description":"Read `observation_kind` instead; it carries the same value.","deprecated":true},"observation_kind":{"type":"string","title":"Observation Kind","description":"The kind of the observation the job reads."},"items":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Items","description":"How many tiles or rows the observation holds; null when they were not counted."},"queue_position":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Queue Position","description":"Its place in its runtime's queue while it waits, 1 being next; 0 while it runs; null once it is over."},"eta_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Eta Seconds","description":"The service's estimate of the seconds until the result exists; null when it has none."},"created_at":{"type":"string","title":"Created At"},"updated_at":{"type":"string","title":"Updated At"},"started_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Started At"},"finished_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Finished At"},"expires_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expires At"},"landed":{"type":"boolean","title":"Landed","description":"Whether the result was offered to the submitter's workspace."},"error":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Error","description":"Why the job failed, as a `code` and a `detail`; null otherwise."},"events":{"items":{"$ref":"#/components/schemas/JobEvent"},"type":"array","title":"Events","default":[]}},"additionalProperties":false,"type":"object","required":["id","state","lane","model","observation","observation_kind","items","queue_position","eta_seconds","created_at","updated_at","started_at","finished_at","expires_at","landed","error"],"title":"Job"},"JobEvent":{"properties":{"name":{"type":"string","title":"Name"},"seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Seconds"},"at":{"type":"string","title":"At"}},"additionalProperties":false,"type":"object","required":["name","seconds","at"],"title":"JobEvent"},"JobPage":{"properties":{"jobs":{"items":{"$ref":"#/components/schemas/Job"},"type":"array","title":"Jobs"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor","description":"Send it back as `cursor` for the next page; null on the last."}},"additionalProperties":false,"type":"object","required":["jobs","next_cursor"],"title":"JobPage"},"JobResult":{"properties":{"url":{"type":"string","title":"Url","description":"A signed link to the result file."},"format":{"type":"string","title":"Format"},"size_bytes":{"type":"integer","title":"Size Bytes"},"expires_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expires At","description":"When the result stops being available."}},"additionalProperties":false,"type":"object","required":["url","format","size_bytes","expires_at"],"title":"JobResult"},"KeyRow":{"properties":{"id":{"type":"integer","title":"Id"},"prefix":{"type":"string","title":"Prefix"},"name":{"type":"string","title":"Name"},"scopes":{"items":{"type":"string"},"type":"array","title":"Scopes"},"tier":{"type":"string","title":"Tier"},"terms_version":{"type":"string","title":"Terms Version"},"created_at":{"type":"string","title":"Created At"},"expires_at":{"type":"string","title":"Expires At"},"last_used_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Used At"},"revoked_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Revoked At"},"days_remaining":{"type":"integer","title":"Days Remaining"},"expiring_soon":{"type":"boolean","title":"Expiring Soon"},"rotated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rotated At"},"replaced_by":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Replaced By"}},"additionalProperties":false,"type":"object","required":["id","prefix","name","scopes","tier","terms_version","created_at","expires_at","last_used_at","revoked_at","days_remaining","expiring_soon","rotated_at","replaced_by"],"title":"KeyRow"},"Me":{"properties":{"email":{"type":"string","title":"Email"},"tier":{"type":"string","title":"Tier"},"key_prefix":{"type":"string","title":"Key Prefix"},"scopes":{"items":{"type":"string"},"type":"array","title":"Scopes"},"expires_at":{"type":"string","title":"Expires At"},"api_access":{"type":"string","title":"Api Access"},"days_remaining":{"type":"integer","title":"Days Remaining"},"expiring_soon":{"type":"boolean","title":"Expiring Soon"},"warning_days":{"type":"integer","title":"Warning Days","description":"How many days before expiry `expiring_soon` turns true."}},"additionalProperties":false,"type":"object","required":["email","tier","key_prefix","scopes","expires_at","api_access","days_remaining","expiring_soon","warning_days"],"title":"Me","description":"Who the calling key belongs to, what it may do, and how long it has left."},"MintKeyBody":{"properties":{"name":{"type":"string","maxLength":120,"title":"Name","description":"A label for the key, for your own records.","default":""},"scopes":{"items":{"type":"string","maxLength":80},"type":"array","maxItems":12,"title":"Scopes","description":"What the key may do. Every scope when omitted."},"accept_terms_version":{"type":"string","maxLength":40,"minLength":1,"title":"Accept Terms Version","description":"The version of the Terms you accept, as `GET /api-keys/terms` gives it."},"ttl_days":{"type":"integer","maximum":365.0,"minimum":1.0,"title":"Ttl Days","description":"How many days the key lives.","default":90}},"additionalProperties":false,"type":"object","required":["accept_terms_version"],"title":"MintKeyBody"},"MintedKey":{"properties":{"id":{"type":"integer","title":"Id"},"key":{"type":"string","title":"Key","description":"The key itself. It is shown in this response only."},"prefix":{"type":"string","title":"Prefix"},"name":{"type":"string","title":"Name"},"scopes":{"items":{"type":"string"},"type":"array","title":"Scopes"},"tier":{"type":"string","title":"Tier"},"terms_version":{"type":"string","title":"Terms Version"},"created_at":{"type":"string","title":"Created At"},"expires_at":{"type":"string","title":"Expires At"}},"additionalProperties":false,"type":"object","required":["id","key","prefix","name","scopes","tier","terms_version","created_at","expires_at"],"title":"MintedKey"},"ModelCardView":{"properties":{"id":{"type":"string","title":"Id","description":"The id a submission names as its `model`."},"name":{"type":"string","title":"Name"},"family":{"type":"string","title":"Family"},"accepts":{"additionalProperties":true,"type":"object","title":"Accepts"},"lane":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lane","description":"The runtime the model runs on."},"input_spec":{"additionalProperties":true,"type":"object","title":"Input Spec"},"output":{"$ref":"#/components/schemas/ModelOutputView"},"postprocess":{"items":{"type":"string"},"type":"array","title":"Postprocess"},"released_at":{"type":"string","title":"Released At"},"sunset":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sunset"}},"additionalProperties":false,"type":"object","required":["id","name","family","accepts","lane","input_spec","output","postprocess","released_at"],"title":"ModelCardView","description":"A model as the catalogue lists it: what a caller needs to choose one and\nprepare its input."},"ModelOutputView":{"properties":{"gene_table":{"type":"string","title":"Gene Table"},"n_genes":{"type":"integer","title":"N Genes"},"n_genes_measured":{"type":"integer","title":"N Genes Measured"},"panel_sha256":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Panel Sha256"},"transform":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Transform","description":"The space the returned values are in."}},"additionalProperties":false,"type":"object","required":["gene_table","n_genes","n_genes_measured"],"title":"ModelOutputView"},"PredictionBody":{"properties":{"model":{"type":"string","maxLength":200,"minLength":1,"title":"Model","description":"The id of the model to run, as `GET /models` lists it."},"observation":{"anyOf":[{"type":"string","maxLength":200,"minLength":1},{"type":"null"}],"title":"Observation","description":"The upload id of the one observation to predict from. Its kind is the kind it was uploaded as. Required unless the deprecated `observations` is sent instead."},"observations":{"anyOf":[{"additionalProperties":{"type":"string","maxLength":200,"minLength":1},"propertyNames":{"maxLength":64,"minLength":1},"type":"object","maxProperties":2},{"type":"null"}],"title":"Observations","description":"Send `observation` instead. The one observation to predict from, as `{kind: upload_id}`.","deprecated":true},"covariates":{"additionalProperties":{"type":"string","maxLength":200,"minLength":1},"propertyNames":{"maxLength":64,"minLength":1},"type":"object","maxProperties":3,"title":"Covariates","description":"Further inputs the model accepts, as `{kind: upload_id}` or `{kind: value}`.","default":{}},"options":{"$ref":"#/components/schemas/PredictionOptions","default":{"land_in_workspace":false}}},"additionalProperties":false,"type":"object","required":["model"],"title":"PredictionBody"},"PredictionOptions":{"properties":{"land_in_workspace":{"type":"boolean","title":"Land In Workspace","description":"Offer the result to the submitter's workspace when it succeeds.","default":false}},"additionalProperties":false,"type":"object","title":"PredictionOptions","description":"What a caller may ask for beyond the prediction itself."},"ReplacedKey":{"properties":{"id":{"type":"integer","title":"Id"},"prefix":{"type":"string","title":"Prefix"},"expires_at":{"type":"string","title":"Expires At","description":"When the replaced key stops working: the end of the overlap."},"days_remaining":{"type":"integer","title":"Days Remaining"},"rotated_at":{"type":"string","title":"Rotated At"}},"additionalProperties":false,"type":"object","required":["id","prefix","expires_at","days_remaining","rotated_at"],"title":"ReplacedKey","description":"The key a rotation replaced, and when it now stops working."},"RequestCodeBody":{"properties":{"email":{"type":"string","title":"Email"}},"type":"object","required":["email"],"title":"RequestCodeBody"},"RequestCodeOut":{"properties":{"sent":{"type":"boolean","title":"Sent","default":true}},"additionalProperties":false,"type":"object","title":"RequestCodeOut"},"ResolveBody":{"properties":{"genes":{"items":{"type":"string","maxLength":64,"minLength":1},"type":"array","maxItems":500,"minItems":1,"title":"Genes"}},"additionalProperties":false,"type":"object","required":["genes"],"title":"ResolveBody"},"ResolveOut":{"properties":{"genes":{"items":{"$ref":"#/components/schemas/GeneOut"},"type":"array","title":"Genes"}},"additionalProperties":false,"type":"object","required":["genes"],"title":"ResolveOut"},"RevokeBody":{"properties":{"reason":{"type":"string","maxLength":200,"title":"Reason","description":"Why the key is revoked.","default":""}},"additionalProperties":false,"type":"object","title":"RevokeBody"},"RotateBody":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Name","description":"The replacement's label. The old key's when omitted."},"accept_terms_version":{"type":"string","maxLength":40,"minLength":1,"title":"Accept Terms Version","description":"The version of the Terms you accept, as `GET /api-keys/terms` gives it."},"ttl_days":{"type":"integer","maximum":365.0,"minimum":1.0,"title":"Ttl Days","description":"How many days the replacement lives.","default":90}},"additionalProperties":false,"type":"object","required":["accept_terms_version"],"title":"RotateBody"},"RotatedKey":{"properties":{"id":{"type":"integer","title":"Id"},"key":{"type":"string","title":"Key","description":"The key itself. It is shown in this response only."},"prefix":{"type":"string","title":"Prefix"},"name":{"type":"string","title":"Name"},"scopes":{"items":{"type":"string"},"type":"array","title":"Scopes"},"tier":{"type":"string","title":"Tier"},"terms_version":{"type":"string","title":"Terms Version"},"created_at":{"type":"string","title":"Created At"},"expires_at":{"type":"string","title":"Expires At"},"replaces":{"$ref":"#/components/schemas/ReplacedKey"}},"additionalProperties":false,"type":"object","required":["id","key","prefix","name","scopes","tier","terms_version","created_at","expires_at","replaces"],"title":"RotatedKey"},"TermsOut":{"properties":{"terms_version":{"type":"string","title":"Terms Version"},"terms_url":{"type":"string","title":"Terms Url"}},"additionalProperties":false,"type":"object","required":["terms_version","terms_url"],"title":"TermsOut"},"UploadInit":{"properties":{"upload_id":{"type":"string","title":"Upload Id"},"url":{"type":"string","title":"Url","description":"Where to send the file, in chunks."},"chunk_size_bytes":{"type":"integer","title":"Chunk Size Bytes","description":"The chunk size to send, every chunk but the last."},"expires_at":{"type":"string","title":"Expires At","description":"When `url` stops accepting chunks."}},"additionalProperties":false,"type":"object","required":["upload_id","url","chunk_size_bytes","expires_at"],"title":"UploadInit"},"UploadInitBody":{"properties":{"kind":{"type":"string","maxLength":64,"title":"Kind","description":"The input kind this file is. A model's `accepts` names the kinds it reads."},"filename":{"type":"string","maxLength":255,"minLength":1,"title":"Filename","description":"The file's name."},"size_bytes":{"type":"integer","minimum":1.0,"title":"Size Bytes","description":"The file's exact size in bytes."},"sha256":{"type":"string","maxLength":64,"minLength":64,"title":"Sha256","description":"The file's tree hash, in hex: the sha256 over the raw sha256 digests of the chunks it will be sent in, in order. It is not the sha256 of the file."}},"additionalProperties":false,"type":"object","required":["kind","filename","size_bytes","sha256"],"title":"UploadInitBody"},"UploadVerdict":{"properties":{"upload_id":{"type":"string","title":"Upload Id"},"kind":{"type":"string","title":"Kind"},"status":{"type":"string","title":"Status"},"size_bytes":{"type":"integer","title":"Size Bytes"},"completed_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Completed At"},"verdict":{"additionalProperties":true,"type":"object","title":"Verdict"}},"additionalProperties":false,"type":"object","required":["upload_id","kind","status","size_bytes","completed_at","verdict"],"title":"UploadVerdict"},"VerifyCodeBody":{"properties":{"email":{"type":"string","title":"Email"},"code":{"type":"string","title":"Code"}},"type":"object","required":["email","code"],"title":"VerifyCodeBody"},"VerifyCodeOut":{"properties":{"token":{"type":"string","title":"Token"},"approved":{"type":"boolean","title":"Approved"}},"additionalProperties":false,"type":"object","required":["token","approved"],"title":"VerifyCodeOut"},"Problem":{"additionalProperties":false,"description":"Every refusal, as a problem document (RFC 9457) served as\n`application/problem+json`. Branch on `code`.","properties":{"type":{"description":"The address of this code's entry in the error catalogue.","title":"Type","type":"string"},"title":{"description":"The code, in words.","title":"Title","type":"string"},"status":{"description":"The HTTP status, the one this code is always sent with.","title":"Status","type":"integer"},"code":{"description":"What was refused, as a code from the error catalogue.","title":"Code","type":"string"},"detail":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"What was refused, when there is more to say than the code.","title":"Detail"},"param":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The field the refusal is about, when there is one.","title":"Param"},"hint":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"What to do next.","title":"Hint"},"request_id":{"description":"This request's id, also sent as `X-Request-Id`. Quote it when you get in touch.","title":"Request Id","type":"string"}},"required":["type","title","status","code","detail","param","hint","request_id"],"title":"Problem","type":"object"}},"securitySchemes":{"ApiKey":{"type":"http","description":"An API key, sent as `Authorization: Bearer aok_…`. An operation lists the scopes the key must hold.","scheme":"bearer"},"SessionToken":{"type":"http","description":"A session token from signing in with an emailed code, sent as `Authorization: Bearer <token>`.","scheme":"bearer"}}},"tags":[{"name":"Discovery","description":"What the service is and which models it runs."},{"name":"Uploads","description":"Get an input onto the service, resumably."},{"name":"Jobs","description":"Create a job from a model, an observation and any covariates, follow it, take its result, cancel or purge it."},{"name":"Genes","description":"Search and resolve the gene identifiers every result is keyed by."},{"name":"Account","description":"Sign in, mint and revoke API keys, and read what the calling key may do."},{"name":"Predictions","description":"The first name of `POST /jobs`, deprecated and still answered."}]}