{"openapi":"3.1.0","info":{"title":"Sidekick Robotics","summary":"The API for Physical AI.","description":"One endpoint for world models, vision-language-action policies and embodied reasoning. Sidekick routes a request to whichever model and provider fit it best (price, latency, region, embodiment, action space) and falls past whichever one is down.\n\n**Four contracts**, because these outputs are not interchangeable:\n- `POST /v1/predict`: roll the world forward, frames out\n- `POST /v1/act`: an action chunk in a declared action space\n- `POST /v1/ground`: embodied reasoning, points and boxes in image space\n- `POST /v1/evaluate`: score a policy inside a world model\n\nEvery response carries `route.simulated`. `true` means placeholder output, not a model prediction.","version":"0.1.0"},"servers":[{"url":"https://sidekickrobotics.ai/api","description":"public (proxied)"},{"url":"sidekick-api-production-2b96.up.railway.app","description":"direct: no proxy timeout, use for streaming and long rollouts"}],"paths":{"/v1/orgs/{org_id}/members":{"post":{"tags":["identity"],"summary":"Invite a user and assign a role","operationId":"add_member_v1_orgs__org_id__members_post","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["identity"],"summary":"List Members","operationId":"list_members_v1_orgs__org_id__members_get","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/{org_id}/members/{user_id}":{"delete":{"tags":["identity"],"summary":"Remove Member","operationId":"remove_member_v1_orgs__org_id__members__user_id__delete","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/permissions":{"get":{"tags":["identity"],"summary":"The role/permission matrix","operationId":"permissions_v1_permissions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/oauth/clients":{"post":{"tags":["identity"],"summary":"Create Oauth Client","operationId":"create_oauth_client_v1_oauth_clients_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/oauth/authorize":{"post":{"tags":["identity"],"summary":"PKCE consent step: returns a single-use code","operationId":"oauth_authorize_v1_oauth_authorize_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/oauth/token":{"post":{"tags":["identity"],"summary":"Exchange a PKCE code for a user-scoped API key","operationId":"oauth_token_v1_oauth_token_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/scim/v2/Groups/{group}/map":{"post":{"tags":["identity"],"summary":"Map an IdP group to a role","operationId":"scim_map_group_v1_scim_v2_Groups__group__map_post","parameters":[{"name":"group","in":"path","required":true,"schema":{"type":"string","title":"Group"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/scim/v2/Groups/{group}":{"put":{"tags":["identity"],"summary":"Push a group's member list (SCIM sync)","operationId":"scim_sync_group_v1_scim_v2_Groups__group__put","parameters":[{"name":"group","in":"path","required":true,"schema":{"type":"string","title":"Group"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/scim/v2/Users":{"get":{"tags":["identity"],"summary":"Scim List Users","operationId":"scim_list_users_v1_scim_v2_Users_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/scim/v2/Users/{user_id}":{"patch":{"tags":["identity"],"summary":"Deactivate a user (SCIM soft delete)","operationId":"scim_deactivate_v1_scim_v2_Users__user_id__patch","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/{org_id}/workspaces":{"post":{"tags":["accounts"],"summary":"Create Workspace","operationId":"create_workspace_v1_orgs__org_id__workspaces_post","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["accounts"],"summary":"List Workspaces","operationId":"list_workspaces_v1_orgs__org_id__workspaces_get","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/{org_id}/settings":{"get":{"tags":["accounts"],"summary":"Get Settings","operationId":"get_settings_v1_orgs__org_id__settings_get","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["accounts"],"summary":"Retention / ZDR, cache sharing, BYOK mode","operationId":"patch_settings_v1_orgs__org_id__settings_patch","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/presets/{name}":{"put":{"tags":["presets"],"summary":"Save a named provider config","operationId":"save_preset_v1_presets__name__put","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["presets"],"summary":"Delete Preset","operationId":"delete_preset_v1_presets__name__delete","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/presets":{"get":{"tags":["presets"],"summary":"List Presets","operationId":"list_presets_v1_presets_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/credentials/{provider}":{"put":{"tags":["byok"],"summary":"Store your own provider key","operationId":"put_credential_v1_credentials__provider__put","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["byok"],"summary":"Delete Credential","operationId":"delete_credential_v1_credentials__provider__delete","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/credentials":{"get":{"tags":["byok"],"summary":"List Credentials","operationId":"list_credentials_v1_credentials_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/credentials/{provider}/verify":{"post":{"tags":["byok"],"summary":"Confirm the stored secret still decrypts","operationId":"verify_credential_v1_credentials__provider__verify_post","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/supply/providers":{"post":{"tags":["supply"],"summary":"Register yourself as a provider","operationId":"register_provider_v1_supply_providers_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/supply/providers/{provider}/models":{"post":{"tags":["supply"],"summary":"Declare an endpoint that serves a model","operationId":"register_offering_v1_supply_providers__provider__models_post","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/supply/offerings/{offering_id}/verify":{"post":{"tags":["supply"],"summary":"Run the conformance probe; passing makes it routable","operationId":"verify_offering_v1_supply_offerings__offering_id__verify_post","parameters":[{"name":"offering_id","in":"path","required":true,"schema":{"type":"string","title":"Offering Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/supply/offerings/{offering_id}":{"patch":{"tags":["supply"],"summary":"Correct an offering's cost basis without re-registering","description":"Set `hardware`, `cost_usd_per_second`, `scaledown_s`, `timeout_s` or\n`cold_timeout_s` on an existing offering.\n\nRe-registering would work and is the wrong shape for this. It mints a new\noffering id, leaves the old row in the supply store, needs the conformance\nprobe run again, and silently resets every field the caller did not restate:\nan offering priced at $0.0012 per action step comes back at the $0.002\ndefault because the body omitted it. That is a lot of blast radius for\ncorrecting one word.\n\nOnly the cost basis is patchable. Price, endpoint, contracts and action\nspaces stay immutable through this path, because changing what an offering\n*serves* is exactly the case that should be re-verified rather than edited.","operationId":"patch_offering_v1_supply_offerings__offering_id__patch","parameters":[{"name":"offering_id","in":"path","required":true,"schema":{"type":"string","title":"Offering Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["supply"],"summary":"De-register an offering","description":"Remove a supply row for good.\n\nThe case this exists for is the dead one: a registration that failed its\nconformance probe leaves a `rejected` row behind forever. Those rows are\ninert, never projected into the registry and never routable, but they\naccumulate in every listing until the real offerings are outnumbered by\nattempts to create them.\n\nA `live` row needs `?force=true`, because deleting one withdraws capacity\nthe router is currently ranking and the request that notices is a customer's.","operationId":"delete_offering_v1_supply_offerings__offering_id__delete","parameters":[{"name":"offering_id","in":"path","required":true,"schema":{"type":"string","title":"Offering Id"}},{"name":"force","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Force"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/supply/offerings":{"get":{"tags":["supply"],"summary":"List Supply","operationId":"list_supply_v1_supply_offerings_get","parameters":[{"name":"mine","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Mine"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/supply/hardware":{"get":{"tags":["supply"],"summary":"Accelerator names an offering may declare","description":"The vocabulary for the `hardware` field, which registration requires.\n\nNames only. The per-second rates behind them are Sidekick's cost basis and\nlive behind the admin token at `GET /v1/usage/margin`, because a partner who\ncan read our unit cost can price against our margin rather than against\ntheir own. The names are enough to register correctly, which is all this\nendpoint is for.\n\nMatching is case- and separator-insensitive, so \"A100-40GB\", \"a100 40gb\" and\n\"A100_40GB\" are the same entry, and an unrecognised name is priced at the\nmost expensive accelerator on the card rather than rejected.","operationId":"supply_hardware_v1_supply_hardware_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/batch":{"post":{"tags":["batch"],"summary":"Submit many predict/act requests as one job","operationId":"submit_batch_v1_batch_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"examples":[{"contract":"predict","requests":[{"model":"sidekick/auto","observations":[],"horizon":8}]}],"title":"Payload"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/batch/{job_id}":{"get":{"tags":["batch"],"summary":"Get Batch","operationId":"get_batch_v1_batch__job_id__get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"items","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Items"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["batch"],"summary":"Cancel a job","operationId":"cancel_batch_v1_batch__job_id__delete","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/batch/{job_id}/results":{"get":{"tags":["batch"],"summary":"Per-item results as JSONL","operationId":"batch_results_v1_batch__job_id__results_get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"text/plain":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/jobs":{"get":{"tags":["batch"],"summary":"List Jobs","operationId":"list_jobs_v1_jobs_get","parameters":[{"name":"kind","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kind"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/logs":{"get":{"tags":["observability"],"summary":"List Logs","operationId":"list_logs_v1_logs_get","parameters":[{"name":"kind","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kind"}},{"name":"workspace_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace Id"}},{"name":"since_minutes","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Since Minutes"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":100,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/logs/export":{"get":{"tags":["observability"],"summary":"Activity export as JSONL","operationId":"export_logs_v1_logs_export_get","parameters":[{"name":"kind","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kind"}},{"name":"since_minutes","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Since Minutes"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"text/plain":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/webhooks":{"post":{"tags":["observability"],"summary":"Create Webhook","operationId":"create_webhook_v1_webhooks_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["observability"],"summary":"List Webhooks","operationId":"list_webhooks_v1_webhooks_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/webhooks/{hook_id}":{"delete":{"tags":["observability"],"summary":"Delete Webhook","operationId":"delete_webhook_v1_webhooks__hook_id__delete","parameters":[{"name":"hook_id","in":"path","required":true,"schema":{"type":"string","title":"Hook Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/broadcast":{"post":{"tags":["observability"],"summary":"Send OTLP spans to an observability platform","operationId":"create_broadcast_v1_broadcast_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["observability"],"summary":"List Broadcast","operationId":"list_broadcast_v1_broadcast_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/broadcast/{target_id}":{"delete":{"tags":["observability"],"summary":"Delete Broadcast","operationId":"delete_broadcast_v1_broadcast__target_id__delete","parameters":[{"name":"target_id","in":"path","required":true,"schema":{"type":"string","title":"Target Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/platform":{"get":{"tags":["ops"],"summary":"What the platform layer is doing right now","operationId":"platform_status_v1_platform_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/billing":{"get":{"tags":["billing"],"summary":"Is self-serve billing available, and what are the limits","operationId":"billing_status_v1_billing_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/billing/balance":{"get":{"tags":["billing"],"summary":"Credit balance and spend for the calling org","operationId":"balance_v1_billing_balance_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/billing/topup":{"post":{"tags":["billing"],"summary":"Buy credits: returns a Stripe Checkout URL","operationId":"topup_v1_billing_topup_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/billing/payments":{"get":{"tags":["billing"],"summary":"Payment history for the calling org","operationId":"payments_v1_billing_payments_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/billing/payments/{payment_id}/reconcile":{"post":{"tags":["billing"],"summary":"Ask Stripe directly what happened (for a lost webhook)","operationId":"reconcile_v1_billing_payments__payment_id__reconcile_post","parameters":[{"name":"payment_id","in":"path","required":true,"schema":{"type":"string","title":"Payment Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/predict":{"post":{"tags":["inference"],"summary":"Roll the world forward","operationId":"predict_v1_predict_post","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PredictRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PredictResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/predict/stream":{"post":{"tags":["inference"],"summary":"Roll the world forward, streaming frames as they are generated","operationId":"predict_stream_v1_predict_stream_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PredictRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/act":{"post":{"tags":["inference"],"summary":"World-action rollout: observations in, action chunk out","operationId":"act_v1_act_post","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/ground":{"post":{"tags":["inference"],"summary":"Embodied reasoning: where are the things I care about?","description":"Spatial grounding over an observation.\n\nA separate contract from `/v1/act` because the output is a different kind of\nthing: points and boxes in image coordinates, not steps in a robot's action\nspace. Folding them together would let a caller execute pixel coordinates as\njoint targets.\n\nOne provider today (Gemini Robotics ER), so this endpoint calls it directly\nrather than through the router. It graduates into the routing plan, with\nfallback, variants and price sorting like every other contract, as soon as a\nsecond grounding model is servable. Routing across a fleet of one is\nceremony, and pretending otherwise would put a fake `attempts` list in the\nresponse.","operationId":"ground_v1_ground_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GroundRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GroundResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/runtimes":{"get":{"tags":["ops"],"summary":"Wire protocols the gateway can serve supply over","description":"What it takes to bring a checkpoint online.\n\nPublished because supply is the bottleneck in robotics, not demand. A partner\nwith weights and a GPU should be able to read this, pick a protocol, and be\nroutable without a conversation.","operationId":"runtimes_v1_runtimes_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/evaluate":{"post":{"tags":["inference"],"summary":"Score a policy inside a world model (async)","operationId":"evaluate_v1_evaluate_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluateRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationJob"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/evaluate/{job_id}":{"get":{"tags":["inference"],"summary":"Evaluation Status","operationId":"evaluation_status_v1_evaluate__job_id__get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationJob"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/models":{"get":{"tags":["registry"],"summary":"List the catalog","operationId":"list_models_v1_models_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"domain","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"embodied|driving|game|science|general","title":"Domain"},"description":"embodied|driving|game|science|general"},{"name":"family","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"see GET /v1/taxonomy for the full list","title":"Family"},"description":"see GET /v1/taxonomy for the full list"},{"name":"tier","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"servable|integration|catalog","title":"Tier"},"description":"servable|integration|catalog"},{"name":"contract","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"predict|act|evaluate","title":"Contract"},"description":"predict|act|evaluate"},{"name":"embodiment","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"arm|humanoid|quadruped|mobile-base|vehicle|virtual-agent|agnostic|none","title":"Embodiment"},"description":"arm|humanoid|quadruped|mobile-base|vehicle|virtual-agent|agnostic|none"},{"name":"action_space","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"see GET /v1/taxonomy","title":"Action Space"},"description":"see GET /v1/taxonomy"},{"name":"era","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"current|classic","title":"Era"},"description":"current|classic"},{"name":"kind","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"world-model|policy|reasoning: the registry holds all three and they serve different contracts","title":"Kind"},"description":"world-model|policy|reasoning: the registry holds all three and they serve different contracts"},{"name":"featured","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Featured"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/taxonomy":{"get":{"tags":["registry"],"summary":"Every value the catalog filters accept, with counts","operationId":"taxonomy_v1_taxonomy_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/scenarios":{"get":{"tags":["registry"],"summary":"Benchmark registry: what /v1/evaluate can run a policy against","operationId":"list_scenarios_v1_scenarios_get","parameters":[{"name":"target","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"embodied|driving|game|science|general","title":"Target"},"description":"embodied|driving|game|science|general"},{"name":"runnable","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"only benchmarks with released code","title":"Runnable"},"description":"only benchmarks with released code"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/literature":{"get":{"tags":["registry"],"summary":"Surveys, position papers and theory: catalogued, never routable","operationId":"list_literature_v1_literature_get","parameters":[{"name":"kind","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"survey|position|theory|tutorial","title":"Kind"},"description":"survey|position|theory|tutorial"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/models/{owner}/{name}":{"get":{"tags":["registry"],"summary":"Model detail with all offerings","operationId":"get_model_v1_models__owner___name__get","parameters":[{"name":"owner","in":"path","required":true,"schema":{"type":"string","title":"Owner"}},{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/providers":{"get":{"tags":["registry"],"summary":"List Providers","operationId":"list_providers_v1_providers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/routes":{"get":{"tags":["registry"],"summary":"Jobs you can ask for, and what is serving them right now","description":"Ask for a job, not a checkpoint.\n\nEvery alias listed here has live supply behind it as of this request. An\nalias whose models are catalogued but not wired to a deployment is omitted,\nbecause listing it would be advertising a route that 409s. `GET /v1/models`\nis where the full 617-model catalog lives, and it is explicit about what is\nservable versus published research.","operationId":"list_routes_v1_routes_get","parameters":[{"name":"contract","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Narrow to one contract: act, predict or evaluate.","title":"Contract"},"description":"Narrow to one contract: act, predict or evaluate."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/routes/preview":{"post":{"tags":["registry"],"summary":"Dry-run the router: see the plan without paying for inference","operationId":"preview_route_v1_routes_preview_post","parameters":[{"name":"contract","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"act, predict or evaluate. Omit to let the router pick one the model can actually serve.","title":"Contract"},"description":"act, predict or evaluate. Omit to let the router pick one the model can actually serve."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PredictRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs":{"post":{"tags":["accounts"],"summary":"Create an org (admin token, or public signup if enabled)","operationId":"create_org_v1_orgs_post","parameters":[{"name":"x-sidekick-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Sidekick-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/{org_id}/keys":{"post":{"tags":["accounts"],"summary":"Create Key","operationId":"create_key_v1_orgs__org_id__keys_post","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"x-sidekick-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Sidekick-Admin-Token"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"type":"object","additionalProperties":true},{"type":"null"}],"title":"Payload"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/{org_id}/credits":{"post":{"tags":["accounts"],"summary":"Add Credits","operationId":"add_credits_v1_orgs__org_id__credits_post","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"x-sidekick-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Sidekick-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/{org_id}/commitment":{"post":{"tags":["accounts"],"summary":"Set an org's minimum monthly spend (admin token)","description":"The floor under an account's monthly revenue.\n\nUsage draws down against it. Whatever is unused when the month closes is\ncharged as an availability fee, because keeping models reachable costs money\non a serverless host whether or not anyone calls: idle after every request,\ncold starts, weight pulls. None of that has a request to attach to, so no\namount of per-request pricing recovers it.\n\nAdmin-gated rather than self-serve: a commitment is a contract term, agreed\nwhen the account is opened, not a dial a customer turns down on a slow month.","operationId":"set_commitment_v1_orgs__org_id__commitment_post","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"x-sidekick-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Sidekick-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/usage":{"get":{"tags":["accounts"],"summary":"Usage","operationId":"usage_v1_usage_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/usage/margin":{"get":{"tags":["ops"],"summary":"Gross margin on served inference (admin token)","description":"Revenue less COGS, per org and per model, plus the active cost model.\n\nThis is the report that answers the question the cost floor was built for:\nis serving traffic profitable *before* the top-up fee. Two fields deserve\nattention before the margin number is trusted:\n\n* `reconciliation`: the gateway's own reconstruction of the host invoice,\n  from container-seconds it attributed rather than from anything the host\n  reported. Compare `modelled_infra_usd` against the real invoice for the\n  same window. They should agree within a percent or two; if they do not,\n  the scaledown windows on file are wrong and every `infra_usd` here is\n  wrong with them. This is the check that keeps the model honest, and it is\n  the one number in this report that can be falsified from outside.\n* `assumed_scaledown_requests`: requests priced against a default warm\n  window because the offering never declared one. Not an error, but each is\n  a guess inside a bill, so the count is here to be driven to zero.\n* `uncharged_idle_usd`: idle that was real, attributed, and deliberately not\n  passed on, because one request's share of it exceeded what any single\n  caller can fairly be billed. A cost we chose not to charge, which is a\n  different thing from one we failed to see.\n* `unmetered_requests`: routes where the GPU was not ours (BYO-fleet, BYOK,\n  simulated). They contribute revenue and no cost, so a fleet-heavy month\n  reads as a suspiciously good margin. Counted separately for that reason.","operationId":"usage_margin_v1_usage_margin_get","parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Restrict to one org.","title":"Org Id"},"description":"Restrict to one org."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":2000,"minimum":1,"default":200,"title":"Limit"}},{"name":"x-sidekick-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Sidekick-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/key":{"get":{"tags":["accounts"],"summary":"Inspect the calling key","operationId":"key_info_v1_key_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/health":{"get":{"tags":["ops"],"summary":"Liveness. Send the admin token for deployment detail.","description":"Public by necessity, detailed only for operators.\n\nA load balancer, an uptime monitor and Railway's own healthcheck all need an\nunauthenticated 200 here, so the endpoint cannot be gated outright.\n\nWhat it must *not* do unauthenticated is describe its own weaknesses. The\n`warnings` array is written for an operator and says things like \"admin token\nunset: org creation and credit grants are UNAUTHENTICATED\", an accurate,\nactionable map of which door is open, served to anyone who asks. Same for\n`admin_token_set`, `public_signup` and the upstream host in `direct_url`.\n\nSo the public body is liveness plus the one fact a caller genuinely needs\n(whether inference is real or simulated), and everything an operator needs\nmoves behind the admin token. This is not security through obscurity: the\nendpoints are authenticated either way. It is declining to hand an attacker\nthe reconnaissance step for free.","operationId":"healthcheck_health_get","parameters":[{"name":"x-sidekick-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Sidekick-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ready":{"get":{"tags":["ops"],"summary":"Readiness. 503 while this instance should not receive traffic.","description":"Liveness and readiness are different questions and need different answers.\n\n`/health` asks \"is this process alive\". `/ready` asks \"should this instance\nbe given work\". A platform healthcheck pointed at the first question sends\ntraffic to an instance whose registry has not finished loading, and keeps\nsending it to one that is shutting down. Both look like intermittent\ncustomer-facing errors and neither shows up in the process's own logs as a\nfault, which is why they are hard to chase.\n\nNot ready, and why:\n\n* **draining**: a shutdown has begun. Saying so before the process stops\n  accepting connections is what lets a load balancer move traffic off\n  first, rather than discovering it by getting a connection refused.\n* **registry empty**: the catalog has not loaded. A router with no models\n  answers every request with a 404 that looks like a customer mistake.\n* **state unloaded**: a store was corrupt and could not be recovered from\n  its backup. It started empty, which means every existing API key would be\n  rejected as unknown. That is a case for a human, not for quietly serving.","operationId":"readiness_ready_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/status":{"get":{"tags":["ops"],"summary":"Live provider health / circuit-breaker state","operationId":"status_v1_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"ActRequest":{"properties":{"model":{"type":"string","title":"Model","description":"Model slug ('agibot/genie-envisioner'), a router alias ('sidekick/auto:driving'), or either with a variant suffix ('agibot/genie-envisioner:nitro'). See GET /v1/routes."},"models":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Models","description":"explicit fallback chain of model slugs"},"preference":{"anyOf":[{"type":"string","enum":["balanced","fastest","cheapest","reliable"]},{"type":"null"}],"title":"Preference","description":"What matters for this call. 'fastest' routes on measured latency, 'cheapest' on cost per step or frame, 'reliable' on uptime and precision, 'balanced' (the default) spreads load across healthy offerings weighted toward the cheaper ones. An explicit provider.sort or a variant suffix on the model slug wins over this."},"provider":{"$ref":"#/components/schemas/ProviderPreferences"},"seed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Seed"},"stream":{"type":"boolean","title":"Stream","default":false},"preset":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preset","description":"Name of a saved provider preset (see /v1/presets). Explicit fields on this request win over the preset's values."},"metadata":{"additionalProperties":true,"type":"object","title":"Metadata"},"idempotency_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency Key","description":"Replay protection for retries. Reusing a key within 24h returns the original response without re-running or re-billing the rollout, which matters because these models are stochastic, so a naive retry would return a *different* future. Reusing a key with a changed request body is a 409. May also be sent as the `Idempotency-Key` header; this field wins if both are present. Not supported on /v1/predict/stream."},"observations":{"items":{"$ref":"#/components/schemas/Observation"},"type":"array","minItems":1,"title":"Observations"},"instruction":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instruction"},"goal_image":{"anyOf":[{"$ref":"#/components/schemas/Frame"},{"type":"null"}]},"action_space":{"type":"string","title":"Action Space","default":"ee_delta_6d_grip"},"horizon":{"type":"integer","maximum":256.0,"minimum":1.0,"title":"Horizon","description":"action steps to return","default":16},"temperature":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Temperature"},"return_prediction":{"type":"boolean","title":"Return Prediction","description":"also return the imagined frames the model conditioned on","default":false}},"type":"object","required":["model","observations"],"title":"ActRequest","description":"Ask a world-action model what to do next."},"ActResponse":{"properties":{"id":{"type":"string","title":"Id"},"object":{"type":"string","const":"world.action","title":"Object","default":"world.action"},"created":{"type":"integer","title":"Created"},"model":{"type":"string","title":"Model"},"action":{"$ref":"#/components/schemas/ActionChunk"},"confidence":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Confidence"},"predicted_frames":{"items":{"$ref":"#/components/schemas/Frame"},"type":"array","title":"Predicted Frames"},"route":{"$ref":"#/components/schemas/RouteInfo"},"usage":{"$ref":"#/components/schemas/Usage"}},"type":"object","required":["id","created","model","action","route","usage"],"title":"ActResponse"},"ActionChunk":{"properties":{"space":{"type":"string","title":"Space","description":"e.g. ee_delta_6d_grip, joint_pos_7, joint_pos_23, base_twist_2d","default":"ee_delta_6d_grip"},"steps":{"items":{"items":{"type":"number"},"type":"array"},"type":"array","title":"Steps"},"dt_ms":{"type":"integer","title":"Dt Ms","default":100}},"type":"object","title":"ActionChunk","description":"A sequence of actions in a named action space.\n\n`space` matters: a 7-DoF end-effector delta and a 23-DoF humanoid joint\ntarget are both \"actions\" but are not interchangeable. The gateway rejects\na request whose action space the target model does not declare."},"EvaluateRequest":{"properties":{"model":{"type":"string","title":"Model","description":"Model slug ('agibot/genie-envisioner'), a router alias ('sidekick/auto:driving'), or either with a variant suffix ('agibot/genie-envisioner:nitro'). See GET /v1/routes."},"models":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Models","description":"explicit fallback chain of model slugs"},"preference":{"anyOf":[{"type":"string","enum":["balanced","fastest","cheapest","reliable"]},{"type":"null"}],"title":"Preference","description":"What matters for this call. 'fastest' routes on measured latency, 'cheapest' on cost per step or frame, 'reliable' on uptime and precision, 'balanced' (the default) spreads load across healthy offerings weighted toward the cheaper ones. An explicit provider.sort or a variant suffix on the model slug wins over this."},"provider":{"$ref":"#/components/schemas/ProviderPreferences"},"seed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Seed"},"stream":{"type":"boolean","title":"Stream","default":false},"preset":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preset","description":"Name of a saved provider preset (see /v1/presets). Explicit fields on this request win over the preset's values."},"metadata":{"additionalProperties":true,"type":"object","title":"Metadata"},"idempotency_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency Key","description":"Replay protection for retries. Reusing a key within 24h returns the original response without re-running or re-billing the rollout, which matters because these models are stochastic, so a naive retry would return a *different* future. Reusing a key with a changed request body is a 409. May also be sent as the `Idempotency-Key` header; this field wins if both are present. Not supported on /v1/predict/stream."},"policy_endpoint":{"type":"string","title":"Policy Endpoint","description":"HTTPS endpoint the evaluator will call to query the policy"},"policy_auth_header":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Policy Auth Header"},"scenario":{"type":"string","title":"Scenario","description":"registered scenario id, e.g. 'simpler/put-spoon-on-towel'"},"episodes":{"type":"integer","maximum":1000.0,"minimum":1.0,"title":"Episodes","default":25},"initial_states":{"anyOf":[{"items":{"$ref":"#/components/schemas/Observation"},"type":"array"},{"type":"null"}],"title":"Initial States"},"metrics":{"items":{"type":"string"},"type":"array","title":"Metrics"}},"type":"object","required":["model","policy_endpoint","scenario"],"title":"EvaluateRequest","description":"Score a policy inside a world model. Async, returns a job."},"EvaluationJob":{"properties":{"id":{"type":"string","title":"Id"},"object":{"type":"string","const":"world.evaluation","title":"Object","default":"world.evaluation"},"created":{"type":"integer","title":"Created"},"model":{"type":"string","title":"Model"},"status":{"type":"string","enum":["queued","running","succeeded","failed","cancelled"],"title":"Status"},"scenario":{"type":"string","title":"Scenario"},"episodes":{"type":"integer","title":"Episodes"},"progress":{"type":"number","title":"Progress","default":0.0},"results":{"anyOf":[{"additionalProperties":{"type":"number"},"type":"object"},{"type":"null"}],"title":"Results"},"route":{"anyOf":[{"$ref":"#/components/schemas/RouteInfo"},{"type":"null"}]},"usage":{"$ref":"#/components/schemas/Usage"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["id","created","model","status","scenario","episodes"],"title":"EvaluationJob"},"Frame":{"properties":{"camera":{"type":"string","title":"Camera","default":"primary"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"b64":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"B64"},"timestamp_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Timestamp Ms"},"intrinsics":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"Intrinsics","description":"fx, fy, cx, cy: required by 3D/4D models"}},"type":"object","title":"Frame","description":"A single camera frame.\n\nExactly one of `url` or `b64` must be set. `camera` names the mount point so\nmulti-view models (wrist + head + third-person) can align streams; models\nthat only take one view use `camera=\"primary\"`."},"GroundRequest":{"properties":{"model":{"type":"string","title":"Model","description":"'sidekick/ground' (recommended) or an explicit grounding model slug","default":"sidekick/ground"},"models":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Models","description":"explicit fallback chain of model slugs"},"preference":{"anyOf":[{"type":"string","enum":["balanced","fastest","cheapest","reliable"]},{"type":"null"}],"title":"Preference","description":"What matters for this call. 'fastest' routes on measured latency, 'cheapest' on cost per step or frame, 'reliable' on uptime and precision, 'balanced' (the default) spreads load across healthy offerings weighted toward the cheaper ones. An explicit provider.sort or a variant suffix on the model slug wins over this."},"provider":{"$ref":"#/components/schemas/ProviderPreferences"},"seed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Seed"},"stream":{"type":"boolean","title":"Stream","default":false},"preset":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preset","description":"Name of a saved provider preset (see /v1/presets). Explicit fields on this request win over the preset's values."},"metadata":{"additionalProperties":true,"type":"object","title":"Metadata"},"idempotency_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency Key","description":"Replay protection for retries. Reusing a key within 24h returns the original response without re-running or re-billing the rollout, which matters because these models are stochastic, so a naive retry would return a *different* future. Reusing a key with a changed request body is a 409. May also be sent as the `Idempotency-Key` header; this field wins if both are present. Not supported on /v1/predict/stream."},"observations":{"items":{"$ref":"#/components/schemas/Observation"},"type":"array","minItems":1,"title":"Observations"},"instruction":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instruction","description":"what to look for, e.g. 'point at every graspable object'"},"max_images":{"type":"integer","maximum":8.0,"minimum":1.0,"title":"Max Images","default":3},"max_tokens":{"type":"integer","maximum":8192.0,"minimum":64.0,"title":"Max Tokens","default":1024}},"type":"object","required":["observations"],"title":"GroundRequest","description":"Ask an embodied-reasoning model *where* things are.\n\nA distinct contract from `act` on purpose. Grounding models return spatial\nreferences: points, boxes, trajectories in image coordinates, not actions in\na robot's action space. Returning coordinates through `act` would hand a\ncaller a list of pixels labelled as joint targets, which their robot would\nexecute. Perception and action generation are different products and the API\nsays so."},"GroundResponse":{"properties":{"id":{"type":"string","title":"Id"},"model":{"type":"string","title":"Model"},"route":{"$ref":"#/components/schemas/RouteInfo"},"points":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Points","description":"[{label, x, y}] with x and y normalised 0-1, x first"},"boxes":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Boxes","description":"[{label, x0, y0, x1, y1}] normalised 0-1"},"raw":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Raw","description":"the model's unparsed answer, so nothing is hidden"},"usage":{"$ref":"#/components/schemas/Usage"}},"type":"object","required":["id","model","route","usage"],"title":"GroundResponse"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HedgePolicy":{"properties":{"after_ms":{"type":"integer","maximum":10000.0,"minimum":0.0,"title":"After Ms","description":"Dispatch the next provider if the first has not answered within this long. Set it near your p50, not your p99: hedging at p99 fires too late to save the request."},"max_parallel":{"type":"integer","maximum":3.0,"minimum":2.0,"title":"Max Parallel","description":"How many providers may be in flight at once, including the first. Capped at 3: the third attempt rarely wins and always bills.","default":2},"cross_model":{"type":"boolean","title":"Cross Model","description":"Allow the hedge to use a DIFFERENT model, not just a different provider for the same one. Off by default and it should usually stay off: two policies produce different action distributions, so racing them makes which one drives the robot depend on network timing. That is a nondeterminism a control loop cannot reason about. Racing two providers serving the same checkpoint returns the same distribution either way.","default":false}},"type":"object","required":["after_ms"],"title":"HedgePolicy","description":"Speculative execution: dispatch a second provider if the first is slow.\n\nThe trade is explicit. You pay for both attempts, because both really ran on\nreal GPUs and a remote rollout cannot be recalled once dispatched. In\nexchange the tail shrinks: a provider having a bad minute stops being your\np99, because a healthy one was already working on the same request.\n\nThat trade is worth making for a closed loop and wasteful for a batch job,\nwhich is why it is opt-in per request rather than a global setting."},"Observation":{"properties":{"frames":{"items":{"$ref":"#/components/schemas/Frame"},"type":"array","title":"Frames"},"depth":{"items":{"$ref":"#/components/schemas/Frame"},"type":"array","title":"Depth"},"proprio":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"Proprio","description":"joint positions / base pose, model-specific ordering"},"tactile":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"Tactile"},"point_cloud_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Point Cloud Url"},"timestamp_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Timestamp Ms"}},"type":"object","title":"Observation","description":"The robot's view of the world at one instant."},"PredictRequest":{"properties":{"model":{"type":"string","title":"Model","description":"Model slug ('agibot/genie-envisioner'), a router alias ('sidekick/auto:driving'), or either with a variant suffix ('agibot/genie-envisioner:nitro'). See GET /v1/routes."},"models":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Models","description":"explicit fallback chain of model slugs"},"preference":{"anyOf":[{"type":"string","enum":["balanced","fastest","cheapest","reliable"]},{"type":"null"}],"title":"Preference","description":"What matters for this call. 'fastest' routes on measured latency, 'cheapest' on cost per step or frame, 'reliable' on uptime and precision, 'balanced' (the default) spreads load across healthy offerings weighted toward the cheaper ones. An explicit provider.sort or a variant suffix on the model slug wins over this."},"provider":{"$ref":"#/components/schemas/ProviderPreferences"},"seed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Seed"},"stream":{"type":"boolean","title":"Stream","default":false},"preset":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preset","description":"Name of a saved provider preset (see /v1/presets). Explicit fields on this request win over the preset's values."},"metadata":{"additionalProperties":true,"type":"object","title":"Metadata"},"idempotency_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency Key","description":"Replay protection for retries. Reusing a key within 24h returns the original response without re-running or re-billing the rollout, which matters because these models are stochastic, so a naive retry would return a *different* future. Reusing a key with a changed request body is a 409. May also be sent as the `Idempotency-Key` header; this field wins if both are present. Not supported on /v1/predict/stream."},"observations":{"items":{"$ref":"#/components/schemas/Observation"},"type":"array","minItems":1,"title":"Observations","description":"context window, oldest first"},"actions":{"anyOf":[{"$ref":"#/components/schemas/ActionChunk"},{"type":"null"}],"description":"action-conditioned prediction; omit for free-running rollout"},"instruction":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instruction","description":"language conditioning, if the model accepts it"},"goal":{"anyOf":[{"$ref":"#/components/schemas/Frame"},{"type":"null"}],"description":"target observation for goal-conditioned planning: generate the rollout that gets from `observations` to here"},"horizon":{"type":"integer","maximum":512.0,"minimum":1.0,"title":"Horizon","description":"future frames to generate","default":16},"fps":{"type":"integer","maximum":60.0,"minimum":1.0,"title":"Fps","default":10},"resolution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolution","description":"e.g. '256x256'; defaults to model native"},"return_latents":{"type":"boolean","title":"Return Latents","default":false},"guidance_scale":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Guidance Scale"}},"type":"object","required":["model","observations"],"title":"PredictRequest","description":"Roll the world forward.\n\nGive the model what the robot has seen and (optionally) what it intends to\ndo; get back predicted future observations."},"PredictResponse":{"properties":{"id":{"type":"string","title":"Id"},"object":{"type":"string","const":"world.prediction","title":"Object","default":"world.prediction"},"created":{"type":"integer","title":"Created"},"model":{"type":"string","title":"Model"},"frames":{"items":{"$ref":"#/components/schemas/Frame"},"type":"array","title":"Frames"},"latents_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latents Url"},"route":{"$ref":"#/components/schemas/RouteInfo"},"usage":{"$ref":"#/components/schemas/Usage"}},"type":"object","required":["id","created","model","route","usage"],"title":"PredictResponse"},"ProviderPreferences":{"properties":{"order":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Order","description":"provider slugs to try in order"},"allow_fallbacks":{"type":"boolean","title":"Allow Fallbacks","default":true},"only":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Only"},"ignore":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Ignore"},"sort":{"anyOf":[{"type":"string","enum":["price","latency","throughput","quality"]},{"type":"null"}],"title":"Sort"},"max_price_per_frame":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Price Per Frame"},"require_parameters":{"type":"boolean","title":"Require Parameters","description":"skip providers that would silently drop a requested parameter","default":false},"data_collection":{"type":"string","enum":["allow","deny"],"title":"Data Collection","default":"allow"},"region":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Region","description":"restrict to regions, e.g. ['us-west','eu-central'] for data residency"},"max_latency_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Latency Ms","description":"drop providers whose p95 exceeds this, closed-loop control needs a deadline"},"on_prem_only":{"type":"boolean","title":"On Prem Only","description":"route only to the caller's own registered fleet/edge nodes","default":false},"min_precision":{"anyOf":[{"type":"string","enum":["int4","int8","fp8","bf16","fp16","fp32"]},{"type":"null"}],"title":"Min Precision"},"allow_simulated":{"type":"boolean","title":"Allow Simulated","description":"Allow routing to a catalogued offering that is not wired to a real deployment. Off by default: those offerings return structurally valid placeholder output, and a placeholder action chunk is indistinguishable from a prediction once it reaches a robot. Turn it on to exercise the API shape against models that have no live supply yet; every such response carries route.simulated = true.","default":false},"objective":{"anyOf":[{"additionalProperties":{"type":"number"},"type":"object"},{"type":"null"}],"title":"Objective","description":"Weighted multi-objective ranking, e.g. {'latency': 0.6, 'price': 0.3, 'reliability': 0.1}. Keys: price, latency, throughput, reliability. Use instead of `sort` when no single axis describes the trade-off you actually want. Weights are normalised; only the ratios matter."},"max_price_per_action_step":{"anyOf":[{"type":"number","exclusiveMinimum":0.0},{"type":"null"}],"title":"Max Price Per Action Step","description":"Per-unit ceiling for act, the companion to max_price_per_frame. Without it a price ceiling binds on predict traffic and silently does nothing on act."},"min_uptime_30d":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Min Uptime 30D","description":"Reliability floor, e.g. 0.995. A hard constraint, not a sort preference: sorting by quality still routes to a flaky provider when it happens to rank first, and a robot in a production cell needs the unreliable option removed from the plan entirely."},"deadline_ms":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"Deadline Ms","description":"End-to-end wall clock for the whole request, fallbacks included. Not the same as max_latency_ms, which filters providers on their advertised p95 before anything runs. This is the real clock: a control loop that asked for an answer within 200ms is better served by a fast error at 200ms than a correct answer at 600ms."},"max_cost_usd":{"anyOf":[{"type":"number","exclusiveMinimum":0.0},{"type":"null"}],"title":"Max Cost Usd","description":"Ceiling on what this one request may cost, evaluated against its own shape: frames out for predict, action steps for act. The per-unit ceilings bound a rate, this bounds the bill."},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id","description":"Pin a task or episode to the model and provider that served its first call, for as long as that choice stays healthy and legal under the other constraints. Switching policy mid-episode changes the action distribution discontinuously, which is a safety property in robotics, not a caching nicety."},"hedge":{"anyOf":[{"$ref":"#/components/schemas/HedgePolicy"},{"type":"null"}],"description":"Speculative parallel execution. See HedgePolicy: you pay for every attempt dispatched, and the response itemises it."}},"type":"object","title":"ProviderPreferences"},"RouteHop":{"properties":{"model":{"type":"string","title":"Model"},"provider":{"type":"string","title":"Provider"},"region":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region"},"status":{"type":"string","enum":["ok","error","timeout","skipped","rate_limited","hedged"],"title":"Status"},"latency_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Latency Ms"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","required":["model","provider","status"],"title":"RouteHop","description":"One attempt. The full list is the audit trail of what the router did."},"RouteInfo":{"properties":{"model":{"type":"string","title":"Model"},"provider":{"type":"string","title":"Provider"},"region":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region"},"precision":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Precision"},"attempts":{"items":{"$ref":"#/components/schemas/RouteHop"},"type":"array","title":"Attempts"},"fallback_used":{"type":"boolean","title":"Fallback Used","default":false},"byok":{"type":"boolean","title":"Byok","description":"True when the org's own provider credential paid for the compute; the charge is a routing fee, not inference.","default":false},"hedged":{"type":"boolean","title":"Hedged","description":"True when a second provider was dispatched speculatively. Every attempt, winner and losers, appears in `attempts`.","default":false},"hedge_cost_usd":{"type":"number","title":"Hedge Cost Usd","description":"What the losing hedge attempts cost. Already included in usage.cost_usd; itemised here so the trade is visible rather than buried in a total.","default":0.0},"simulated":{"type":"boolean","title":"Simulated","description":"True when no real provider served this request and the output is a structurally-valid placeholder, not a model prediction. Never suppress this field when displaying results.","default":false}},"type":"object","required":["model","provider"],"title":"RouteInfo"},"Usage":{"properties":{"frames_in":{"type":"integer","title":"Frames In","default":0},"frames_out":{"type":"integer","title":"Frames Out","default":0},"action_steps":{"type":"integer","title":"Action Steps","default":0},"gpu_seconds":{"type":"number","title":"Gpu Seconds","default":0.0},"cost_usd":{"type":"number","title":"Cost Usd","default":0.0}},"type":"object","title":"Usage"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}