Simulate Routing
/v1/routers/{id}/simulateOverview
Requires an active workspace membership with owner, admin, developer, or viewer role.
Routing and provider details
Billing-only members and inference API keys are rejected. workspace_id is always required; a router ID from a different authorized workspace returns 404. Cookie-authenticated POST requests also require the same-origin proof described by the Routers tag.
This operation does not write a revision or call a provider. Evaluates the first matching route, then deterministically assigns an integer bucket 0–99 to its weighted variants. Assignment is scoped by workspace, router, draft generation/config hash or immutable revision, route, and assignment_key. Auto mode ranks eligible candidates by exact native token cost; ordered mode preserves candidate order.
The response includes the route trace, field-wise effective defaults, eligible/excluded models and validation issues. Empty candidate pools remain explainable. Malformed request or configuration envelopes return 400; invalid simulation facts and selection violations return issues with selection null. Metadata never grants workspace or model entitlement. inference_enabled is always false because simulation never calls a model. To see which A/B variant a caller gets in production, simulate the published revision (revision) with the caller's session_id as assignment_key; assignment is scoped to the revision, so a draft simulation can differ.
Parameters
idpath · stringRequiredRouter identity in the explicitly supplied workspace.
Request Body
workspace_idstringRequiredexpected_generationintegerCurrent generation observed by the caller. Re-read the router after a 409; do not overwrite a concurrent edit.
Minimum 1 · Maximum 2147483646
revisionintegerMinimum 1 · Maximum 1000
configobjectVersioned declarative LLM router configuration, normalized to at most 65536 UTF-8 JSON bytes. Unknown fields and undocumented null values are rejected. Structurally valid but incomplete drafts are permitted; validation/publication enforce final-default, nonempty pools, uniqueness, exact weights and current model eligibility.
Example: {"schema_version":1,"task":"llm","protocol":"chat","requirements":[],"defaults":{},"request_overrides":[],"policy":{"max_input_tokens":128000,"max_output_tokens":8192,"deadline_ms":120000,"regions":[],"zero_retention":false},"routes":[{"id":"default","name":"Default","condition":null,"defaults":{},"variants":[{"id":"primary","name":"Primary","weight":100,"selection":{"mode":"ordered","models":[]},"defaults":{}}]}]}
Show nested fields
schema_versionintegerRequiredtaskstringRequiredprotocolstringRequiredValues: "chat""responses""messages"
requirementsstring[]Default: []
Show nested fields
string
defaultsobjectField-wise inheritance: router defaults, then route defaults, then variant defaults, then explicitly permitted request parameters. Omitted fields inherit; null does not clear a field. max_tokens defaults to policy.max_output_tokens and cannot exceed that policy. Every effective and overridable parameter must be supported by every selected model.
Show nested fields
max_tokensintegerMinimum 1 · Maximum 1000000
temperaturenumberMinimum 0 · Maximum 2
top_pnumberMinimum 0 · Maximum 1
system_promptstringrequest_overridesstring[]Default: []
Show nested fields
string
policyobjectDeclarative upper limits, intersected with current operator/workspace/model restrictions. A model must support the full configured input plus output context budget. Region and zero-retention requirements cannot widen workspace policy.
Show nested fields
max_input_tokensintegerDefault: 128000
Minimum 1 · Maximum 1000000
max_output_tokensintegerDefault: 8192
Minimum 1 · Maximum 1000000
deadline_msintegerDefault: 120000
Minimum 1000 · Maximum 1800000
regionsstring[]Regions every route requires: us, eu or a documented country code, any of which an endpoint may process in. Empty or global means none. Each model must have an endpoint documented in one of them, and requests can narrow it but never widen it. A region no endpoint documents is refused with 422 on create, update and duplicate, and validate reports it as region_unavailable.
Default: []
Show nested fields
See the OpenAPI schema for this nested object.
zero_retentionbooleanReserved. Router-level zero retention is not available, so true is refused with 422 and validate reports zero_retention_unavailable. Workspace Privacy settings, including zero data retention per provider family, still apply to every route.
Default: false
max_priceobjectShow nested fields
inputstringRequiredExact decimal USD per native token. Strings avoid binary floating-point ambiguity. A limit of zero is allowed; approved native catalog prices must be positive.
outputstringRequiredExact decimal USD per native token. Strings avoid binary floating-point ambiguity. A limit of zero is allowed; approved native catalog prices must be positive.
routesobject[]RequiredShow nested fields
idstringRequirednamestringRequiredconditionobject | object | object | object | object | object | object | nullRequiredShow nested fields
See the OpenAPI schema for this nested object.
defaultsobjectField-wise inheritance: router defaults, then route defaults, then variant defaults, then explicitly permitted request parameters. Omitted fields inherit; null does not clear a field. max_tokens defaults to policy.max_output_tokens and cannot exceed that policy. Every effective and overridable parameter must be supported by every selected model.
Show nested fields
See the OpenAPI schema for this nested object.
variantsobject[]RequiredShow nested fields
See the OpenAPI schema for this nested object.
inputobjectSynthetic simulation facts, never authorization claims. Unspecified protocol uses the router protocol. Input/output counts cannot exceed router policy. Parameters must be explicitly allowed by request_overrides and cannot widen policy. No prompt or paid inference is needed.
Show nested fields
assignment_keystringDefault: "preview"
metadataobjectDefault: {}
input_tokensintegerDefault: 0
Minimum 0 · Maximum 1000000
output_tokensintegerDefault: 0
Minimum 0 · Maximum 1000000
protocolstringValues: "chat""responses""messages"
parametersobjectField-wise inheritance: router defaults, then route defaults, then variant defaults, then explicitly permitted request parameters. Omitted fields inherit; null does not clear a field. max_tokens defaults to policy.max_output_tokens and cannot exceed that policy. Every effective and overridable parameter must be supported by every selected model.
Show nested fields
max_tokensintegerMinimum 1 · Maximum 1000000
temperaturenumberMinimum 0 · Maximum 2
top_pnumberMinimum 0 · Maximum 1
system_promptstringResponses
200Operation completed.
generationintegerRequiredOptimistic version of the router record. Every successful mutation increments it. Send the observed value as expected_generation; stale values return 409.
Minimum 1 · Maximum 2147483647
validbooleanRequiredpublishablebooleanRequiredcatalog_revisionstring | nullRequiredShow nested fields
Option 1: string
string
Option 2: null
null
issuesobject[]RequiredShow nested fields
codestringRequiredpathstringRequiredmessagestringRequiredmodelsobject[]RequiredShow nested fields
modelstringRequiredA catalog model ID: a model several hosts serve (its hosts are ranked as for a request), a host's own ID, either with :nitro, :floor, :exacto, :free or :thinking, or a ~author/family-latest alias. An entry is eligible when one endpoint it can route to is. Recursive router aliases are forbidden.
eligiblebooleanRequiredreasonsstring[]RequiredShow nested fields
See the OpenAPI schema for this nested object.
selectionobject | nullRequiredShow nested fields
Option 1: object
route_idstringRequiredvariant_idstringRequiredbucketintegerRequiredMinimum 0 · Maximum 99
traceobject[]RequiredShow nested fields
See the OpenAPI schema for this nested object.
modelsstring[]RequiredShow nested fields
See the OpenAPI schema for this nested object.
modestringRequiredValues: "ordered""auto"
effective_defaultsobjectRequiredField-wise inheritance: router defaults, then route defaults, then variant defaults, then explicitly permitted request parameters. Omitted fields inherit; null does not clear a field. max_tokens defaults to policy.max_output_tokens and cannot exceed that policy. Every effective and overridable parameter must be supported by every selected model.
Show nested fields
max_tokensintegerMinimum 1 · Maximum 1000000
temperaturenumberMinimum 0 · Maximum 2
top_pnumberMinimum 0 · Maximum 1
system_promptstringeligible_modelsstring[]RequiredShow nested fields
See the OpenAPI schema for this nested object.
excluded_modelsobject[]RequiredShow nested fields
See the OpenAPI schema for this nested object.
Option 2: null
null
inference_enabledbooleanRequiredAlways false: simulation never calls a model. Published routers run through Chat Completions, Responses and Messages.
400Request validation failed.
errorobjectRequiredShow nested fields
codestringRequiredmessagestringRequiredparamstring | nullrequest_idstring | nullmetadataobjectTyped detail for some refusals. budget_exceeded (402): limit (key_budget or workspace_budget) and budget with scope, period, limit, usage and resets_at. key_limit_exceeded (402): limit key_spend_limit. access_denied (403): policy (workspace or key), rule (models, providers or products), product, provider and model.
401Authentication is missing or invalid.
errorobjectRequiredShow nested fields
codestringRequiredmessagestringRequiredparamstring | nullrequest_idstring | nullmetadataobjectTyped detail for some refusals. budget_exceeded (402): limit (key_budget or workspace_budget) and budget with scope, period, limit, usage and resets_at. key_limit_exceeded (402): limit key_spend_limit. access_denied (403): policy (workspace or key), rule (models, providers or products), product, provider and model.
403Authenticated principal lacks permission.
errorobjectRequiredShow nested fields
codestringRequiredmessagestringRequiredparamstring | nullrequest_idstring | nullmetadataobjectTyped detail for some refusals. budget_exceeded (402): limit (key_budget or workspace_budget) and budget with scope, period, limit, usage and resets_at. key_limit_exceeded (402): limit key_spend_limit. access_denied (403): policy (workspace or key), rule (models, providers or products), product, provider and model.
404Resource was not found.
errorobjectRequiredShow nested fields
codestringRequiredmessagestringRequiredparamstring | nullrequest_idstring | nullmetadataobjectTyped detail for some refusals. budget_exceeded (402): limit (key_budget or workspace_budget) and budget with scope, period, limit, usage and resets_at. key_limit_exceeded (402): limit key_spend_limit. access_denied (403): policy (workspace or key), rule (models, providers or products), product, provider and model.
409Stale expected_generation, archived state, reserved slug, or an Idempotency-Key reused with different command content. Re-read current state before editing; do not blindly retry with a new generation.
errorobjectRequiredShow nested fields
codestringRequiredmessagestringRequiredparamstring | nullrequest_idstring | nullmetadataobjectTyped detail for some refusals. budget_exceeded (402): limit (key_budget or workspace_budget) and budget with scope, period, limit, usage and resets_at. key_limit_exceeded (402): limit key_spend_limit. access_denied (403): policy (workspace or key), rule (models, providers or products), product, provider and model.
413JSON body exceeds 131072 bytes.
errorobjectRequiredShow nested fields
codestringRequiredmessagestringRequiredparamstring | nullrequest_idstring | nullmetadataobjectTyped detail for some refusals. budget_exceeded (402): limit (key_budget or workspace_budget) and budget with scope, period, limit, usage and resets_at. key_limit_exceeded (402): limit key_spend_limit. access_denied (403): policy (workspace or key), rule (models, providers or products), product, provider and model.
422Draft cannot publish or the requested restore is no longer eligible under current policy/catalog. Also used for workspace router or revision limits. Use validate for structured blocking issues. No revision, active-pointer change or idempotency claim is committed on failure.
errorobjectRequiredShow nested fields
codestringRequiredmessagestringRequiredparamstring | nullrequest_idstring | nullmetadataobjectTyped detail for some refusals. budget_exceeded (402): limit (key_budget or workspace_budget) and budget with scope, period, limit, usage and resets_at. key_limit_exceeded (402): limit key_spend_limit. access_denied (403): policy (workspace or key), rule (models, providers or products), product, provider and model.
429Rate limit exceeded.
errorobjectRequiredShow nested fields
codestringRequiredmessagestringRequiredparamstring | nullrequest_idstring | nullmetadataobjectTyped detail for some refusals. budget_exceeded (402): limit (key_budget or workspace_budget) and budget with scope, period, limit, usage and resets_at. key_limit_exceeded (402): limit key_spend_limit. access_denied (403): policy (workspace or key), rule (models, providers or products), product, provider and model.
500Internal server error.
errorobjectRequiredShow nested fields
codestringRequiredmessagestringRequiredparamstring | nullrequest_idstring | nullmetadataobjectTyped detail for some refusals. budget_exceeded (402): limit (key_budget or workspace_budget) and budget with scope, period, limit, usage and resets_at. key_limit_exceeded (402): limit key_spend_limit. access_denied (403): policy (workspace or key), rule (models, providers or products), product, provider and model.