Creates a route draft. Omit graph to seed a complete default graph, then use data.draft.graph as a starting point. Empty graphs are invalid. Omit deploy or set deploy=false to keep the route unpublished; deploy=true changes live routing immediately. Review data.draft.validation, save changes with update_dynamic_route_draft, then use simulate_dynamic_route without version_number to test the draft before deploy_dynamic_route. Optional display_name is a human label separate from the route identifier; it preserves case and spaces. Invoke a deployed route with model=dynamic/<name>; invocation_model contains the exact string. Requires the `dynamic_routes:write` scope.
Graph format: an object with an `elements` array. Each element has a unique `id`, a `type`, optional `properties`, and `outputs`, an object mapping output names to `{"elementId":"target-node-id"}`. Include `id: START, type: start` and `id: END, type: end`; `input` and `output` are not node types. A minimal deployable graph (replace the model with an available catalog ID permitted by your policy):
```json
{"elements":[{"id":"START","type":"start","outputs":{"next":{"elementId":"primary"}}},{"id":"primary","type":"model","properties":{"model":"cerebras/gpt-oss-120b"},"outputs":{"success":{"elementId":"END"},"fallback":{"elementId":"END"}}},{"id":"END","type":"end","outputs":{}}]}
```
Supported node types and properties:
- `start`: the START node; `outputs.next` selects the first node.
- `end`: the END node; `outputs` is `{}`.
- `model`: `properties.model` is a catalog model ID. `outputs.success` targets END or an observe node; `outputs.fallback` targets another model, pool, or END.
- `pool`: `properties.models` contains 2-10 `{model,metrics}` candidates; `properties.expression` is a numeric CEL expression such as `model.cost`, sorted ascending. Uses the same success/fallback outputs as model.
- `conditional`: `properties.cases` contains `{id,expression}` entries; each expression is a CEL predicate over `metadata`, `auth`, and `input`. Connect an output for each case ID and a `default` output. The first true case wins.
- `percentage`: `properties.buckets` contains at least two `{id,weight}` entries with positive integer weights totaling 100. Connect an output for each bucket ID.
- `classifier`: `properties.cases` contains 2-10 `{id,label,instructions}` entries with unique labels, plus optional `context` and `model` properties. Connect an output per case ID; no default output. Classification failures fail the route.
- `observe`: `properties.criteria` defines an asynchronous evaluation, with optional `score_type` (`score` or `binary`), `model`, `threshold`, and `sample_rate` (both greater than 0 and at most 1). Place after model/pool success or another observe node; `outputs.next` leads to another observe node or END.
Graphs must be acyclic. Every node except END accepts at most one incoming edge; use separate model nodes on separate branches. Deployment requires each path from START to reach a model or pool before END. The route name is the model identifier on chat completions, responses, messages and native calls.
Management API authentication. Pass an op-mak-… management token as a Bearer token. Runtime op-… API keys are rejected with 403 — they belong on the data-plane endpoints. Mint a management key from the platform UI under Settings → API keys.
Routing graph object with elements. Each node has id, type, outputs mapping output names to {elementId: targetID}, and optional properties. Include START/start and END/end. Supported types: start, end, model, pool, conditional, percentage, classifier, observe. Omit graph on create to seed a default; copy its returned draft.graph to customize. See tool description for node properties and topology.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Opper","description":"The European AI gateway for agents: 700+ models from 50+ providers through one EU-hosted API, drop-in for the OpenAI, Anthropic and Gemini SDKs.","colors":{"primary":"#14cdcd","light":"#24cdcd","dark":"#2d9393"},"logo":{"light":"https://mintcdn.com/opper/EXrQN6z6604ZsBuP/logo/light.svg?fit=max\u0026auto=format\u0026n=EXrQN6z6604ZsBuP\u0026q=85\u0026s=fd4170c482c6cebc3c20d8f7f7e033f8","dark":"https://mintcdn.com/opper/EXrQN6z6604ZsBuP/logo/dark.svg?fit=max\u0026auto=format\u0026n=EXrQN6z6604ZsBuP\u0026q=85\u0026s=328888ac1f44b63c468d022fda86421d"},"favicon":"https://mintcdn.com/opper/EXrQN6z6604ZsBuP/favicon.png?fit=max\u0026auto=format\u0026n=EXrQN6z6604ZsBuP\u0026q=85\u0026s=f1229b80ac7eee56ba2c14789e5fe22e","api":{"examples":{"defaults":"required","languages":["Shell","python","typescript"]}},"appearance":{"default":"system"},"navbar":{"links":[{"href":"mailto:support@opper.ai","label":"Support"},{"href":"https://discord.gg/wcT3bc7Y4Y","label":"Discord"}],"primary":{"type":"button","label":"Login","href":"https://platform.opper.ai/auth/signin"}},"footer":{"socials":{"x":"https://x.com/opperai","github":"https://github.com/opper-ai","linkedin":"https://linkedin.com/company/opper-ai"}},"integrations":{"plausible":{"domain":"docs.opper.ai"}},"contextual":{"options":["copy","view"],"display":"header"},"metadata":{"timestamp":true},"styling":{"latex":true},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"opper","hasAudioNarration":false,"actualSubdomain":"opper","customDomains":["docs.opper.ai"],"gitSource":{"type":"github","owner":"opper-ai","repo":"mintlify-docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ae0ad9c01e51dac894f6d4e","collectionId":"4ead9cb2-39d9-4bcb-81f3-3f794f8c797b","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae0ad9c01e51dac894f6d4e"},"feedback":{"thumbs":false},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6ae0b5930040e29b5214e279","clientVersion":"0.0.3971","searchFilterCounts":[{"language":"default","tag":"Documentation","count":87},{"language":"default","tag":"API Reference","count":78},{"language":"default","tag":"Platform APIs","count":41},{"language":"default","tag":"Management","count":30},{"language":"default","tag":"Apps","count":29},{"language":"default","tag":"Build","count":25},{"language":"default","tag":"Multimodality","count":22},{"language":"default","tag":"Observe \u0026 Control","count":15},{"language":"default","tag":"Gateway","count":13},{"language":"default","tag":"Compatibility","count":13}]},"assistantConfig":{},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"isAtlas":false,"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":"@keyframes oppFade{0%{opacity:0;transform:translateY(5px)}to{opacity:1;transform:none}}@keyframes oppBlink{0%,49%{opacity:1}50%,to{opacity:0}}@keyframes oppDot{0%,80%,to{opacity:.25}40%{opacity:1}}.opp-term .opp-line{opacity:0;animation:oppFade .4s ease forwards}.opp-term a{color:inherit;text-decoration:none;cursor:default}.opp-cursor{display:inline-block;width:7px;height:1em;margin-left:5px;vertical-align:text-bottom;border-radius:1px;background:#14cdcd;animation:oppBlink 1.1s step-end infinite}.opp-dots span{display:inline-block;width:5px;height:5px;margin-right:3px;border-radius:50%;background:#6e7681;animation:oppDot 1.2s infinite}.opp-dots span:nth-child(2){animation-delay:.2s}.opp-dots span:nth-child(3){animation-delay:.4s}.opp-replay{margin-left:auto;background:0 0;border:1px solid #2b3440;color:#8b949e;font:inherit;font-size:11px;padding:2px 9px;border-radius:6px;cursor:pointer;opacity:0;pointer-events:none;transition:opacity .3s,color .2s,border-color .2s}.opp-replay.show{opacity:1;pointer-events:auto}.opp-replay:hover{color:#14cdcd;border-color:#14cdcd}"}],"page":{"pagePath":"v3-api-reference/management/create-dynamic-route","slug":"/v3-api-reference/management/create-dynamic-route","pageMetadata":{"openapi":"post /management/v1/dynamic-routes","title":"Create a dynamic route","description":"Creates a route draft. Omit graph to seed a complete default graph, then use data.draft.graph as a starting point. Empty graphs are invalid. Omit deploy or set deploy=false to keep the route unpublished; deploy=true changes live routing immediately. Review data.draft.validation, save changes with update_dynamic_route_draft, then use simulate_dynamic_route without version_number to test the draft before deploy_dynamic_route. Optional display_name is a human label separate from the route identifier; it preserves case and spaces. Invoke a deployed route with model=dynamic/\u003cname>; invocation_model contains the exact string. Requires the `dynamic_routes:write` scope.\n\nGraph format: an object with an `elements` array. Each element has a unique `id`, a `type`, optional `properties`, and `outputs`, an object mapping output names to `{\"elementId\":\"target-node-id\"}`. Include `id: START, type: start` and `id: END, type: end`; `input` and `output` are not node types. A minimal deployable graph (replace the model with an available catalog ID permitted by your policy):\n```json\n{\"elements\":[{\"id\":\"START\",\"type\":\"start\",\"outputs\":{\"next\":{\"elementId\":\"primary\"}}},{\"id\":\"primary\",\"type\":\"model\",\"properties\":{\"model\":\"cerebras/gpt-oss-120b\"},\"outputs\":{\"success\":{\"elementId\":\"END\"},\"fallback\":{\"elementId\":\"END\"}}},{\"id\":\"END\",\"type\":\"end\",\"outputs\":{}}]}\n```\n\nSupported node types and properties:\n- `start`: the START node; `outputs.next` selects the first node.\n- `end`: the END node; `outputs` is `{}`.\n- `model`: `properties.model` is a catalog model ID. `outputs.success` targets END or an observe node; `outputs.fallback` targets another model, pool, or END.\n- `pool`: `properties.models` contains 2-10 `{model,metrics}` candidates; `properties.expression` is a numeric CEL expression such as `model.cost`, sorted ascending. Uses the same success/fallback outputs as model.\n- `conditional`: `properties.cases` contains `{id,expression}` entries; each expression is a CEL predicate over `metadata`, `auth`, and `input`. Connect an output for each case ID and a `default` output. The first true case wins.\n- `percentage`: `properties.buckets` contains at least two `{id,weight}` entries with positive integer weights totaling 100. Connect an output for each bucket ID.\n- `classifier`: `properties.cases` contains 2-10 `{id,label,instructions}` entries with unique labels, plus optional `context` and `model` properties. Connect an output per case ID; no default output. Classification failures fail the route.\n- `observe`: `properties.criteria` defines an asynchronous evaluation, with optional `score_type` (`score` or `binary`), `model`, `threshold`, and `sample_rate` (both greater than 0 and at most 1). Place after model/pool success or another observe node; `outputs.next` leads to another observe node or END.\n\nGraphs must be acyclic. Every node except END accepts at most one incoming edge; use separate model nodes on separate branches. Deployment requires each path from START to reach a model or pool before END. The route name is the model identifier on chat completions, responses, messages and native calls.","href":"/v3-api-reference/management/create-dynamic-route"},"description":"Creates a route draft. Omit graph to seed a complete default graph, then use data.draft.graph as a starting point. Empty graphs are invalid. Omit deploy or set deploy=false to keep the route unpublished; deploy=true changes live routing immediately. Review data.draft.validation, save changes with update_dynamic_route_draft, then use simulate_dynamic_route without version_number to test the draft before deploy_dynamic_route. Optional display_name is a human label separate from the route identifier; it preserves case and spaces. Invoke a deployed route with model=dynamic/\u003cname>; invocation_model contains the exact string. Requires the `dynamic_routes:write` scope.\n\nGraph format: an object with an `elements` array. Each element has a unique `id`, a `type`, optional `properties`, and `outputs`, an object mapping output names to `{\"elementId\":\"target-node-id\"}`. Include `id: START, type: start` and `id: END, type: end`; `input` and `output` are not node types. A minimal deployable graph (replace the model with an available catalog ID permitted by your policy):\n```json\n{\"elements\":[{\"id\":\"START\",\"type\":\"start\",\"outputs\":{\"next\":{\"elementId\":\"primary\"}}},{\"id\":\"primary\",\"type\":\"model\",\"properties\":{\"model\":\"cerebras/gpt-oss-120b\"},\"outputs\":{\"success\":{\"elementId\":\"END\"},\"fallback\":{\"elementId\":\"END\"}}},{\"id\":\"END\",\"type\":\"end\",\"outputs\":{}}]}\n```\n\nSupported node types and properties:\n- `start`: the START node; `outputs.next` selects the first node.\n- `end`: the END node; `outputs` is `{}`.\n- `model`: `properties.model` is a catalog model ID. `outputs.success` targets END or an observe node; `outputs.fallback` targets another model, pool, or END.\n- `pool`: `properties.models` contains 2-10 `{model,metrics}` candidates; `properties.expression` is a numeric CEL expression such as `model.cost`, sorted ascending. Uses the same success/fallback outputs as model.\n- `conditional`: `properties.cases` contains `{id,expression}` entries; each expression is a CEL predicate over `metadata`, `auth`, and `input`. Connect an output for each case ID and a `default` output. The first true case wins.\n- `percentage`: `properties.buckets` contains at least two `{id,weight}` entries with positive integer weights totaling 100. Connect an output for each bucket ID.\n- `classifier`: `properties.cases` contains 2-10 `{id,label,instructions}` entries with unique labels, plus optional `context` and `model` properties. Connect an output per case ID; no default output. Classification failures fail the route.\n- `observe`: `properties.criteria` defines an asynchronous evaluation, with optional `score_type` (`score` or `binary`), `model`, `threshold`, and `sample_rate` (both greater than 0 and at most 1). Place after model/pool success or another observe node; `outputs.next` leads to another observe node or END.\n\nGraphs must be acyclic. Every node except END accepts at most one incoming edge; use separate model nodes on separate branches. Deployment requires each path from START to reach a model or pool before END. The route name is the model identifier on chat completions, responses, messages and native calls.","pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"openapi":"post /management/v1/dynamic-routes","title":"Create a dynamic route","description":"Creates a route draft. Omit graph to seed a complete default graph, then use data.draft.graph as a starting point. Empty graphs are invalid. Omit deploy or set deploy=false to keep the route unpublished; deploy=true changes live routing immediately. Review data.draft.validation, save changes with update_dynamic_route_draft, then use simulate_dynamic_route without version_number to test the draft before deploy_dynamic_route. Optional display_name is a human label separate from the route identifier; it preserves case and spaces. Invoke a deployed route with model=dynamic/\u003cname>; invocation_model contains the exact string. Requires the `dynamic_routes:write` scope.\n\nGraph format: an object with an `elements` array. Each element has a unique `id`, a `type`, optional `properties`, and `outputs`, an object mapping output names to `{\"elementId\":\"target-node-id\"}`. Include `id: START, type: start` and `id: END, type: end`; `input` and `output` are not node types. A minimal deployable graph (replace the model with an available catalog ID permitted by your policy):\n```json\n{\"elements\":[{\"id\":\"START\",\"type\":\"start\",\"outputs\":{\"next\":{\"elementId\":\"primary\"}}},{\"id\":\"primary\",\"type\":\"model\",\"properties\":{\"model\":\"cerebras/gpt-oss-120b\"},\"outputs\":{\"success\":{\"elementId\":\"END\"},\"fallback\":{\"elementId\":\"END\"}}},{\"id\":\"END\",\"type\":\"end\",\"outputs\":{}}]}\n```\n\nSupported node types and properties:\n- `start`: the START node; `outputs.next` selects the first node.\n- `end`: the END node; `outputs` is `{}`.\n- `model`: `properties.model` is a catalog model ID. `outputs.success` targets END or an observe node; `outputs.fallback` targets another model, pool, or END.\n- `pool`: `properties.models` contains 2-10 `{model,metrics}` candidates; `properties.expression` is a numeric CEL expression such as `model.cost`, sorted ascending. Uses the same success/fallback outputs as model.\n- `conditional`: `properties.cases` contains `{id,expression}` entries; each expression is a CEL predicate over `metadata`, `auth`, and `input`. Connect an output for each case ID and a `default` output. The first true case wins.\n- `percentage`: `properties.buckets` contains at least two `{id,weight}` entries with positive integer weights totaling 100. Connect an output for each bucket ID.\n- `classifier`: `properties.cases` contains 2-10 `{id,label,instructions}` entries with unique labels, plus optional `context` and `model` properties. Connect an output per case ID; no default output. Classification failures fail the route.\n- `observe`: `properties.criteria` defines an asynchronous evaluation, with optional `score_type` (`score` or `binary`), `model`, `threshold`, and `sample_rate` (both greater than 0 and at most 1). Place after model/pool success or another observe node; `outputs.next` leads to another observe node or END.\n\nGraphs must be acyclic. Every node except END accepts at most one incoming edge; use separate model nodes on separate branches. Deployment requires each path from START to reach a model or pool before END. The route name is the model identifier on chat completions, responses, messages and native calls.","href":"/v3-api-reference/management/create-dynamic-route"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":["/_mintlify/custom/opper/40a2b9bd0ec03258/script.js"],"openApiReferenceData":{"operation":{"description":"Creates a route draft. Omit graph to seed a complete default graph, then use data.draft.graph as a starting point. Empty graphs are invalid. Omit deploy or set deploy=false to keep the route unpublished; deploy=true changes live routing immediately. Review data.draft.validation, save changes with update_dynamic_route_draft, then use simulate_dynamic_route without version_number to test the draft before deploy_dynamic_route. Optional display_name is a human label separate from the route identifier; it preserves case and spaces. Invoke a deployed route with model=dynamic/\u003cname>; invocation_model contains the exact string. Requires the `dynamic_routes:write` scope.\n\nGraph format: an object with an `elements` array. Each element has a unique `id`, a `type`, optional `properties`, and `outputs`, an object mapping output names to `{\"elementId\":\"target-node-id\"}`. Include `id: START, type: start` and `id: END, type: end`; `input` and `output` are not node types. A minimal deployable graph (replace the model with an available catalog ID permitted by your policy):\n```json\n{\"elements\":[{\"id\":\"START\",\"type\":\"start\",\"outputs\":{\"next\":{\"elementId\":\"primary\"}}},{\"id\":\"primary\",\"type\":\"model\",\"properties\":{\"model\":\"cerebras/gpt-oss-120b\"},\"outputs\":{\"success\":{\"elementId\":\"END\"},\"fallback\":{\"elementId\":\"END\"}}},{\"id\":\"END\",\"type\":\"end\",\"outputs\":{}}]}\n```\n\nSupported node types and properties:\n- `start`: the START node; `outputs.next` selects the first node.\n- `end`: the END node; `outputs` is `{}`.\n- `model`: `properties.model` is a catalog model ID. `outputs.success` targets END or an observe node; `outputs.fallback` targets another model, pool, or END.\n- `pool`: `properties.models` contains 2-10 `{model,metrics}` candidates; `properties.expression` is a numeric CEL expression such as `model.cost`, sorted ascending. Uses the same success/fallback outputs as model.\n- `conditional`: `properties.cases` contains `{id,expression}` entries; each expression is a CEL predicate over `metadata`, `auth`, and `input`. Connect an output for each case ID and a `default` output. The first true case wins.\n- `percentage`: `properties.buckets` contains at least two `{id,weight}` entries with positive integer weights totaling 100. Connect an output for each bucket ID.\n- `classifier`: `properties.cases` contains 2-10 `{id,label,instructions}` entries with unique labels, plus optional `context` and `model` properties. Connect an output per case ID; no default output. Classification failures fail the route.\n- `observe`: `properties.criteria` defines an asynchronous evaluation, with optional `score_type` (`score` or `binary`), `model`, `threshold`, and `sample_rate` (both greater than 0 and at most 1). Place after model/pool success or another observe node; `outputs.next` leads to another observe node or END.\n\nGraphs must be acyclic. Every node except END accepts at most one incoming edge; use separate model nodes on separate branches. Deployment requires each path from START to reach a model or pool before END. The route name is the model identifier on chat completions, responses, messages and native calls.","operationId":"createManagementDynamicRoute","requestBody":"b00d8c33-446f-4f4c-b5ba-9a303d92c932","responses":{"201":"7f3baa88-24ac-4b50-87ab-eb85a6b49767","400":"042528d4-d0e3-4cc2-b5f9-4d40a01a3ec3","401":"04fac31d-9f9c-495a-86d2-dad9573547bb","403":"f51fb566-f97e-4225-9b27-05e506eced8f","409":"0d53f384-cf95-4f13-962d-8a26c2a9172a","422":"c47aa5aa-9dcd-4548-b8f0-4c6906a42de3","500":"657e7245-364c-44b9-87c0-01bbb975ccfe"},"security":["badac86c-a04d-4880-a176-7a20ddadb65b"],"summary":"Create a dynamic route","tags":["Management"],"method":"post","type":"path","servers":["d0348d3f-9dd8-4bec-8f22-f3106a445993","104317ae-b662-455a-a843-3dce425edafe"],"path":"/management/v1/dynamic-routes","baseUrlOptions":["https://api.opper.ai","http://localhost:8080"],"title":"Create a dynamic route","codeSamples":[],"requestExampleLanguages":["bash","python","typescript"],"requiredOnlyExamples":true,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{},"requestBody":{"content":{"application/json":{"schema":{"properties":{"name":{"description":"Route name; callers invoke the route as dynamic/\u003cname>. Lowercase letters and digits plus '.' '_' '-'; up to 128 characters; unique per organization.","type":"string","isRequired":true,"uniqueKey":"name","typeLabel":"string"},"deploy":{"description":"When true the draft is validated and deployed as version 1 in the same call; the response then carries deployed_version in meta.","type":"boolean","uniqueKey":"deploy","typeLabel":"boolean"},"description":{"description":"Free-text description shown in the platform.","type":"string","uniqueKey":"description","typeLabel":"string"},"display_name":{"description":"Optional human label; preserves case and spaces. Empty uses the route identifier. Editable without deploying.","maxLength":128,"type":"string","uniqueKey":"display_name","typeLabel":"string"},"graph":{"description":"Routing graph object with elements. Each node has id, type, outputs mapping output names to {elementId: targetID}, and optional properties. Include START/start and END/end. Supported types: start, end, model, pool, conditional, percentage, classifier, observe. Omit graph on create to seed a default; copy its returned draft.graph to customize. See tool description for node properties and topology.","examples":[{"elements":[{"id":"START","outputs":{"next":{"elementId":"model_default"}},"type":"start"},{"id":"model_default","outputs":{"fallback":{"elementId":"END"},"success":{"elementId":"END"}},"properties":{"label":"Default model","model":"cerebras/gpt-oss-120b"},"type":"model"},{"id":"END","outputs":{},"type":"end"}]}],"properties":{"elements":{"items":{"properties":{"id":{"type":"string","isRequired":true,"uniqueKey":"graph.elements.items.[INDEX].id","typeLabel":"string"},"outputs":{"additionalProperties":{"properties":{"elementId":{"type":"string","isRequired":true,"uniqueKey":"graph.elements.items.[INDEX].outputs.additionalProperties.elementId","typeLabel":"string"}},"required":["elementId"],"type":"object","uniqueKey":"graph.elements.items.[INDEX].outputs.additionalProperties","typeLabel":"object"},"type":"object","isRequired":true,"uniqueKey":"graph.elements.items.[INDEX].outputs","typeLabel":"object"},"type":{"type":"string","isRequired":true,"uniqueKey":"graph.elements.items.[INDEX].type","typeLabel":"string"},"properties":{"type":"object","uniqueKey":"graph.elements.items.[INDEX].properties","typeLabel":"object"}},"required":["id","type","outputs"],"type":"object","uniqueKey":"graph.elements.items.[INDEX]","typeLabel":"object"},"type":"array","isRequired":true,"uniqueKey":"graph.elements","typeLabel":"object[]"}},"required":["elements"],"type":"object","uniqueKey":"graph","typeLabel":"object"},"layout":{"description":"Editor canvas positions keyed by element id. Opaque to the gateway; omit when authoring from code.","type":"object","uniqueKey":"layout","typeLabel":"object"},"note":{"description":"Release note recorded on the deployed version. Only read when deploy is true.","type":"string","uniqueKey":"note","typeLabel":"string"}},"required":["name"],"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"name":"\u003cstring>","deploy":true,"description":"\u003cstring>","display_name":"\u003cstring>","graph":{"elements":[{"id":"START","outputs":{"next":{"elementId":"model_default"}},"type":"start"},{"id":"model_default","outputs":{"fallback":{"elementId":"END"},"success":{"elementId":"END"}},"properties":{"label":"Default model","model":"cerebras/gpt-oss-120b"},"type":"model"},{"id":"END","outputs":{},"type":"end"}]},"layout":{},"note":"\u003cstring>"}}},"exampleType":"generated"}},"required":true,"exampleType":"generated"},"responses":{"7f3baa88-24ac-4b50-87ab-eb85a6b49767":{"content":{"application/json":{"schema":{"properties":{"data":{"properties":{"draft":{"properties":{"graph":{"description":"The draft graph (DynamicRouteGraph).","type":"object","isRequired":true,"uniqueKey":"data.draft.graph","typeLabel":"object"},"layout":{"description":"Editor canvas positions keyed by element id.","type":"object","isRequired":true,"uniqueKey":"data.draft.layout","typeLabel":"object"},"revision":{"type":"integer","isRequired":true,"uniqueKey":"data.draft.revision","typeLabel":"integer"},"validation":{"description":"Validation issues on the draft (DynamicRouteValidationIssue); empty when it is deployable.","type":"array","isRequired":true,"uniqueKey":"data.draft.validation","typeLabel":"array"}},"required":["graph","layout","validation","revision"],"type":"object","isRequired":true,"uniqueKey":"data.draft","typeLabel":"object"},"route":{"properties":{"created_at":{"format":"date-time","type":"string","isRequired":true,"uniqueKey":"data.route.created_at","typeLabel":"string\u003cdate-time>"},"description":{"type":"string","isRequired":true,"uniqueKey":"data.route.description","typeLabel":"string"},"display_name":{"type":"string","isRequired":true,"uniqueKey":"data.route.display_name","typeLabel":"string"},"draft_revision":{"type":"integer","isRequired":true,"uniqueKey":"data.route.draft_revision","typeLabel":"integer"},"invocation_model":{"type":"string","isRequired":true,"uniqueKey":"data.route.invocation_model","typeLabel":"string"},"name":{"type":"string","isRequired":true,"uniqueKey":"data.route.name","typeLabel":"string"},"updated_at":{"format":"date-time","type":"string","isRequired":true,"uniqueKey":"data.route.updated_at","typeLabel":"string\u003cdate-time>"},"uuid":{"format":"uuid","type":"string","isRequired":true,"uniqueKey":"data.route.uuid","typeLabel":"string\u003cuuid>"},"deleted_at":{"format":"date-time","type":"string","uniqueKey":"data.route.deleted_at","typeLabel":"string\u003cdate-time>"},"draft_graph":{"description":"The draft graph (DynamicRouteGraph).","type":"object","uniqueKey":"data.route.draft_graph","typeLabel":"object"},"draft_layout":{"description":"Editor canvas positions keyed by element id.","type":"object","uniqueKey":"data.route.draft_layout","typeLabel":"object"},"draft_validation":{"description":"Validation issues on the draft (DynamicRouteValidationIssue); empty when it is deployable.","type":"array","uniqueKey":"data.route.draft_validation","typeLabel":"array"}},"required":["uuid","name","display_name","invocation_model","description","draft_revision","created_at","updated_at"],"type":"object","isRequired":true,"uniqueKey":"data.route","typeLabel":"object"},"version_count":{"type":"integer","isRequired":true,"uniqueKey":"data.version_count","typeLabel":"integer"},"active_version":{"properties":{"created_at":{"format":"date-time","type":"string","isRequired":true,"uniqueKey":"data.active_version.created_at","typeLabel":"string\u003cdate-time>"},"note":{"type":"string","isRequired":true,"uniqueKey":"data.active_version.note","typeLabel":"string"},"uuid":{"format":"uuid","type":"string","isRequired":true,"uniqueKey":"data.active_version.uuid","typeLabel":"string\u003cuuid>"},"version_number":{"type":"integer","isRequired":true,"uniqueKey":"data.active_version.version_number","typeLabel":"integer"}},"required":["uuid","version_number","note","created_at"],"type":"object","uniqueKey":"data.active_version","typeLabel":"object"},"latest_version_number":{"type":"integer","uniqueKey":"data.latest_version_number","typeLabel":"integer"}},"required":["route","draft","version_count"],"type":"object","uniqueKey":"data","typeLabel":"object"},"meta":{"properties":{"deployed_version":{"properties":{"created_at":{"format":"date-time","type":"string","isRequired":true,"uniqueKey":"meta.deployed_version.created_at","typeLabel":"string\u003cdate-time>"},"description":{"type":"string","isRequired":true,"uniqueKey":"meta.deployed_version.description","typeLabel":"string"},"draft_revision":{"type":"integer","isRequired":true,"uniqueKey":"meta.deployed_version.draft_revision","typeLabel":"integer"},"note":{"type":"string","isRequired":true,"uniqueKey":"meta.deployed_version.note","typeLabel":"string"},"route_name":{"type":"string","isRequired":true,"uniqueKey":"meta.deployed_version.route_name","typeLabel":"string"},"uuid":{"format":"uuid","type":"string","isRequired":true,"uniqueKey":"meta.deployed_version.uuid","typeLabel":"string\u003cuuid>"},"version_number":{"type":"integer","isRequired":true,"uniqueKey":"meta.deployed_version.version_number","typeLabel":"integer"},"graph":{"description":"The graph this version serves (DynamicRouteGraph).","type":"object","uniqueKey":"meta.deployed_version.graph","typeLabel":"object"},"layout":{"description":"Editor canvas positions keyed by element id.","type":"object","uniqueKey":"meta.deployed_version.layout","typeLabel":"object"},"validation":{"description":"Validation issues recorded at deploy time (DynamicRouteValidationIssue).","type":"array","uniqueKey":"meta.deployed_version.validation","typeLabel":"array"}},"required":["uuid","version_number","route_name","description","note","draft_revision","created_at"],"type":"object","uniqueKey":"meta.deployed_version","typeLabel":"object"},"model_access_locks":{"description":"Present when projects of the organization hold a Model access lock. In those projects the route can send a call only to models on the locked routes; a call it sends to any other model is refused. The deploy itself is not refused.","properties":{"locked_projects":{"description":"How many projects of the organization hold a lock.","type":"integer","uniqueKey":"meta.model_access_locks.locked_projects","typeLabel":"integer"},"message":{"type":"string","uniqueKey":"meta.model_access_locks.message","typeLabel":"string"},"project_uuids":{"items":{"format":"uuid","type":"string","uniqueKey":"meta.model_access_locks.project_uuids.items.[INDEX]","typeLabel":"string\u003cuuid>"},"type":"array","uniqueKey":"meta.model_access_locks.project_uuids","typeLabel":"string\u003cuuid>[]"}},"type":"object","uniqueKey":"meta.model_access_locks","typeLabel":"object"}},"type":"object","uniqueKey":"meta","typeLabel":"object"}},"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"data":{"draft":{"graph":{},"layout":{},"revision":123,"validation":"\u003carray>"},"route":{"created_at":"2023-11-07T05:31:56Z","description":"\u003cstring>","display_name":"\u003cstring>","draft_revision":123,"invocation_model":"\u003cstring>","name":"\u003cstring>","updated_at":"2023-11-07T05:31:56Z","uuid":"3c90c3cc-0d44-4b50-8888-8dd25736052a","deleted_at":"2023-11-07T05:31:56Z","draft_graph":{},"draft_layout":{},"draft_validation":"\u003carray>"},"version_count":123,"active_version":{"created_at":"2023-11-07T05:31:56Z","note":"\u003cstring>","uuid":"3c90c3cc-0d44-4b50-8888-8dd25736052a","version_number":123},"latest_version_number":123},"meta":{"deployed_version":{"created_at":"2023-11-07T05:31:56Z","description":"\u003cstring>","draft_revision":123,"note":"\u003cstring>","route_name":"\u003cstring>","uuid":"3c90c3cc-0d44-4b50-8888-8dd25736052a","version_number":123,"graph":{},"layout":{},"validation":"\u003carray>"},"model_access_locks":{"locked_projects":123,"message":"\u003cstring>","project_uuids":["3c90c3cc-0d44-4b50-8888-8dd25736052a"]}}}}},"exampleType":"generated"}},"description":"Successful response","exampleType":"generated"},"042528d4-d0e3-4cc2-b5f9-4d40a01a3ec3":{"content":{"application/json":{"schema":{"properties":{"error":{"properties":{"code":{"type":"string","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"details":{"description":"Any value","uniqueKey":"error.details","typeLabel":"any"}},"required":["code","message"],"type":"object","isRequired":true,"uniqueKey":"error","typeLabel":"object"},"meta":{"type":"object","uniqueKey":"meta","typeLabel":"object"}},"required":["error"],"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"\u003cstring>","message":"\u003cstring>","details":"\u003cunknown>"},"meta":{}}}},"exampleType":"generated"}},"description":"Bad request","exampleType":"generated"},"04fac31d-9f9c-495a-86d2-dad9573547bb":{"description":"Unauthorized - missing or invalid API key","content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}},"f51fb566-f97e-4225-9b27-05e506eced8f":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string","uniqueKey":"error","typeLabel":"string"},"required_scope":{"description":"Present on the scope refusal.","type":"string","uniqueKey":"required_scope","typeLabel":"string"}},"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"\u003cstring>","required_scope":"\u003cstring>"}}},"exampleType":"generated"}},"description":"The token lacks the scope this endpoint requires (`required_scope` is returned). Presenting a runtime `op-…` key instead of a management `op-mak-…` token also lands here.","exampleType":"generated"},"0d53f384-cf95-4f13-962d-8a26c2a9172a":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string","uniqueKey":"error","typeLabel":"string"}},"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"\u003cstring>"}}},"exampleType":"generated"}},"description":"A route with this name already exists in the organization.","exampleType":"generated"},"c47aa5aa-9dcd-4548-b8f0-4c6906a42de3":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string","uniqueKey":"error","typeLabel":"string"}},"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"\u003cstring>"}}},"exampleType":"generated"}},"description":"The draft parses but fails validation (the issues are on the route's draft.validation), so it cannot be deployed or simulated.","exampleType":"generated"},"657e7245-364c-44b9-87c0-01bbb975ccfe":{"content":{"application/json":{"schema":{"properties":{"error":{"properties":{"code":{"type":"string","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"details":{"description":"Any value","uniqueKey":"error.details","typeLabel":"any"}},"required":["code","message"],"type":"object","isRequired":true,"uniqueKey":"error","typeLabel":"object"},"meta":{"type":"object","uniqueKey":"meta","typeLabel":"object"}},"required":["error"],"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"\u003cstring>","message":"\u003cstring>","details":"\u003cunknown>"},"meta":{}}}},"exampleType":"generated"}},"description":"Internal server error","exampleType":"generated"}},"security":{"badac86c-a04d-4880-a176-7a20ddadb65b":{"ManagementBearer":{"bearerFormat":"Management API Key","description":"Management API authentication. Pass an `op-mak-…` management token as a Bearer token. Runtime `op-…` API keys are rejected with 403 — they belong on the data-plane endpoints. Mint a management key from the platform UI under Settings → API keys.","scheme":"bearer","type":"http","scopes":[],"schemeName":"ManagementBearer"}}},"servers":{"d0348d3f-9dd8-4bec-8f22-f3106a445993":{"description":"Production","url":"https://api.opper.ai"},"104317ae-b662-455a-a843-3dce425edafe":{"description":"Local development","url":"http://localhost:8080"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"bearerFormat":"Management API Key","description":"Management API authentication. Pass an `op-mak-…` management token as a Bearer token. Runtime `op-…` API keys are rejected with 403 — they belong on the data-plane endpoints. Mint a management key from the platform UI under Settings → API keys.","scheme":"bearer","type":"http","scopes":[],"schemeName":"ManagementBearer"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"Management API authentication. Pass an `op-mak-…` management token as a Bearer token. Runtime `op-…` API keys are rejected with 403 — they belong on the data-plane endpoints. Mint a management key from the platform UI under Settings → API keys.","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"ManagementBearer","name":"Authorization"}],"title":"ManagementBearer"}]},"originalFileLocation":"openapi-v3.json"},"subdomain":"opper","siteName":"Opper","title":"Create a dynamic route - Opper","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-15T11:30:37.144Z","gitLastModified":"2026-09-17T07:26:27.000Z","originalFileLocation":"v3-api-reference/management/create-dynamic-route.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Creates a route draft. Omit graph to seed a complete default graph, then use data.draft.graph as a starting point. Empty graphs are invalid. Omit deploy or set deploy=false to keep the route unpublished; deploy=true changes live routing immediately. Review data.draft.validation, save changes with update_dynamic_route_draft, then use simulate_dynamic_route without version_number to test the draft before deploy_dynamic_route. Optional display_name is a human label separate from the route identifier; it preserves case and spaces. Invoke a deployed route with model=dynamic/; invocation_model contains the exact string. Requires the dynamic_routes:write scope. Graph format: an object with an elements array. Each element has a unique id, a type, optional properties, and outputs, an object mapping output names to {\u0026quot;elementId\u0026quot;:\u0026quot;target-node-id\u0026quot;}. Include id: START, type: start and id: END, type: end; input and output are not node types. A minimal deployable graph (replace the model with an available catalog ID permitted by your policy): json {\u0026quot;elements\u0026quot;:[{\u0026quot;id\u0026quot;:\u0026quot;START\u0026quot;,\u0026quot;type\u0026quot;:\u0026quot;start\u0026quot;,\u0026quot;outputs\u0026quot;:{\u0026quot;next\u0026quot;:{\u0026quot;elementId\u0026quot;:\u0026quot;primary\u0026quot;}}},{\u0026quot;id\u0026quot;:\u0026quot;primary\u0026quot;,\u0026quot;type\u0026quot;:\u0026quot;model\u0026quot;,\u0026quot;properties\u0026quot;:{\u0026quot;model\u0026quot;:\u0026quot;cerebras/gpt-oss-120b\u0026quot;},\u0026quot;outputs\u0026quot;:{\u0026quot;success\u0026quot;:{\u0026quot;elementId\u0026quot;:\u0026quot;END\u0026quot;},\u0026quot;fallback\u0026quot;:{\u0026quot;elementId\u0026quot;:\u0026quot;END\u0026quot;}}},{\u0026quot;id\u0026quot;:\u0026quot;END\u0026quot;,\u0026quot;type\u0026quot;:\u0026quot;end\u0026quot;,\u0026quot;outputs\u0026quot;:{}}]} Supported node types and properties: - start: the START node; outputs.next selects the first node. - end: the END node; outputs is {}. - model: properties.model is a catalog model ID. outputs.success targets END or an observe node; outputs.fallback targets another model, pool, or END. - pool: properties.models contains 2-10 {model,metrics} candidates; properties.expression is a numeric CEL expression such as model.cost, sorted ascending. Uses the same success/fallback outputs as model. - conditional: properties.cases contains {id,expression} entries; each expression is a CEL predicate over metadata, auth, and input. Connect an output for each case ID and a default output. The first true case wins. - percentage: properties.buckets contains at least two {id,weight} entries with positive integer weights totaling 100. Connect an output for each bucket ID. - classifier: properties.cases contains 2-10 {id,label,instructions} entries with unique labels, plus optional context and model properties. Connect an output per case ID; no default output. Classification failures fail the route. - observe: properties.criteria defines an asynchronous evaluation, with optional score_type (score or binary), model, threshold, and sample_rate (both greater than 0 and at most 1). Place after model/pool success or another observe node; outputs.next leads to another observe node or END. Graphs must be acyclic. Every node except END accepts at most one incoming edge; use separate model nodes on separate branches. Deployment requires each path from START to reach a model or pool before END. The route name is the model identifier on chat completions, responses, messages and native calls.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Opper\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/opper/QTlMDo19G0sAM5ID/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/opper/QTlMDo19G0sAM5ID/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/opper/QTlMDo19G0sAM5ID/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/opper/QTlMDo19G0sAM5ID/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/opper/QTlMDo19G0sAM5ID/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/opper/QTlMDo19G0sAM5ID/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/opper/QTlMDo19G0sAM5ID/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/opper/QTlMDo19G0sAM5ID/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/opper/QTlMDo19G0sAM5ID/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Create a dynamic route - Opper\">\u003cmeta data-mint-head property=\"og:description\" content=\"Creates a route draft. Omit graph to seed a complete default graph, then use data.draft.graph as a starting point. Empty graphs are invalid. Omit deploy or set deploy=false to keep the route unpublished; deploy=true changes live routing immediately. Review data.draft.validation, save changes with update_dynamic_route_draft, then use simulate_dynamic_route without version_number to test the draft before deploy_dynamic_route. Optional display_name is a human label separate from the route identifier; it preserves case and spaces. Invoke a deployed route with model=dynamic/; invocation_model contains the exact string. Requires the dynamic_routes:write scope. Graph format: an object with an elements array. Each element has a unique id, a type, optional properties, and outputs, an object mapping output names to {\u0026quot;elementId\u0026quot;:\u0026quot;target-node-id\u0026quot;}. Include id: START, type: start and id: END, type: end; input and output are not node types. A minimal deployable graph (replace the model with an available catalog ID permitted by your policy): json {\u0026quot;elements\u0026quot;:[{\u0026quot;id\u0026quot;:\u0026quot;START\u0026quot;,\u0026quot;type\u0026quot;:\u0026quot;start\u0026quot;,\u0026quot;outputs\u0026quot;:{\u0026quot;next\u0026quot;:{\u0026quot;elementId\u0026quot;:\u0026quot;primary\u0026quot;}}},{\u0026quot;id\u0026quot;:\u0026quot;primary\u0026quot;,\u0026quot;type\u0026quot;:\u0026quot;model\u0026quot;,\u0026quot;properties\u0026quot;:{\u0026quot;model\u0026quot;:\u0026quot;cerebras/gpt-oss-120b\u0026quot;},\u0026quot;outputs\u0026quot;:{\u0026quot;success\u0026quot;:{\u0026quot;elementId\u0026quot;:\u0026quot;END\u0026quot;},\u0026quot;fallback\u0026quot;:{\u0026quot;elementId\u0026quot;:\u0026quot;END\u0026quot;}}},{\u0026quot;id\u0026quot;:\u0026quot;END\u0026quot;,\u0026quot;type\u0026quot;:\u0026quot;end\u0026quot;,\u0026quot;outputs\u0026quot;:{}}]} Supported node types and properties: - start: the START node; outputs.next selects the first node. - end: the END node; outputs is {}. - model: properties.model is a catalog model ID. outputs.success targets END or an observe node; outputs.fallback targets another model, pool, or END. - pool: properties.models contains 2-10 {model,metrics} candidates; properties.expression is a numeric CEL expression such as model.cost, sorted ascending. Uses the same success/fallback outputs as model. - conditional: properties.cases contains {id,expression} entries; each expression is a CEL predicate over metadata, auth, and input. Connect an output for each case ID and a default output. The first true case wins. - percentage: properties.buckets contains at least two {id,weight} entries with positive integer weights totaling 100. Connect an output for each bucket ID. - classifier: properties.cases contains 2-10 {id,label,instructions} entries with unique labels, plus optional context and model properties. Connect an output per case ID; no default output. Classification failures fail the route. - observe: properties.criteria defines an asynchronous evaluation, with optional score_type (score or binary), model, threshold, and sample_rate (both greater than 0 and at most 1). Place after model/pool success or another observe node; outputs.next leads to another observe node or END. Graphs must be acyclic. Every node except END accepts at most one incoming edge; use separate model nodes on separate branches. Deployment requires each path from START to reach a model or pool before END. The route name is the model identifier on chat completions, responses, messages and native calls.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Opper\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.opper.ai/v3-api-reference/management/create-dynamic-route\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://opper.mintlify.app/_mintlify/api/og/v2?division=Management\u0026amp;title=Create+a+dynamic+route\u0026amp;description=Creates+a+route+draft.+Omit+graph+to+seed+a+complete+default+graph%2C+then+use+data.draft.graph+as+a+starting+point.+Empty+graphs+are+invalid.+Omit+deploy+or+set+\u0026amp;theme=2bfe23844db8025c327f2519\u0026amp;signature=4b325dbf2b9e39605e464eb912f8501101fe913e2d6d2e1945a628e2ad3167fd\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Create a dynamic route - Opper\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Creates a route draft. Omit graph to seed a complete default graph, then use data.draft.graph as a starting point. Empty graphs are invalid. Omit deploy or set deploy=false to keep the route unpublished; deploy=true changes live routing immediately. Review data.draft.validation, save changes with update_dynamic_route_draft, then use simulate_dynamic_route without version_number to test the draft before deploy_dynamic_route. Optional display_name is a human label separate from the route identifier; it preserves case and spaces. Invoke a deployed route with model=dynamic/; invocation_model contains the exact string. Requires the dynamic_routes:write scope. Graph format: an object with an elements array. Each element has a unique id, a type, optional properties, and outputs, an object mapping output names to {\u0026quot;elementId\u0026quot;:\u0026quot;target-node-id\u0026quot;}. Include id: START, type: start and id: END, type: end; input and output are not node types. A minimal deployable graph (replace the model with an available catalog ID permitted by your policy): json {\u0026quot;elements\u0026quot;:[{\u0026quot;id\u0026quot;:\u0026quot;START\u0026quot;,\u0026quot;type\u0026quot;:\u0026quot;start\u0026quot;,\u0026quot;outputs\u0026quot;:{\u0026quot;next\u0026quot;:{\u0026quot;elementId\u0026quot;:\u0026quot;primary\u0026quot;}}},{\u0026quot;id\u0026quot;:\u0026quot;primary\u0026quot;,\u0026quot;type\u0026quot;:\u0026quot;model\u0026quot;,\u0026quot;properties\u0026quot;:{\u0026quot;model\u0026quot;:\u0026quot;cerebras/gpt-oss-120b\u0026quot;},\u0026quot;outputs\u0026quot;:{\u0026quot;success\u0026quot;:{\u0026quot;elementId\u0026quot;:\u0026quot;END\u0026quot;},\u0026quot;fallback\u0026quot;:{\u0026quot;elementId\u0026quot;:\u0026quot;END\u0026quot;}}},{\u0026quot;id\u0026quot;:\u0026quot;END\u0026quot;,\u0026quot;type\u0026quot;:\u0026quot;end\u0026quot;,\u0026quot;outputs\u0026quot;:{}}]} Supported node types and properties: - start: the START node; outputs.next selects the first node. - end: the END node; outputs is {}. - model: properties.model is a catalog model ID. outputs.success targets END or an observe node; outputs.fallback targets another model, pool, or END. - pool: properties.models contains 2-10 {model,metrics} candidates; properties.expression is a numeric CEL expression such as model.cost, sorted ascending. Uses the same success/fallback outputs as model. - conditional: properties.cases contains {id,expression} entries; each expression is a CEL predicate over metadata, auth, and input. Connect an output for each case ID and a default output. The first true case wins. - percentage: properties.buckets contains at least two {id,weight} entries with positive integer weights totaling 100. Connect an output for each bucket ID. - classifier: properties.cases contains 2-10 {id,label,instructions} entries with unique labels, plus optional context and model properties. Connect an output per case ID; no default output. Classification failures fail the route. - observe: properties.criteria defines an asynchronous evaluation, with optional score_type (score or binary), model, threshold, and sample_rate (both greater than 0 and at most 1). Place after model/pool success or another observe node; outputs.next leads to another observe node or END. Graphs must be acyclic. Every node except END accepts at most one incoming edge; use separate model nodes on separate branches. Deployment requires each path from START to reach a model or pool before END. The route name is the model identifier on chat completions, responses, messages and native calls.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://opper.mintlify.app/_mintlify/api/og/v2?division=Management\u0026amp;title=Create+a+dynamic+route\u0026amp;description=Creates+a+route+draft.+Omit+graph+to+seed+a+complete+default+graph%2C+then+use+data.draft.graph+as+a+starting+point.+Empty+graphs+are+invalid.+Omit+deploy+or+set+\u0026amp;theme=2bfe23844db8025c327f2519\u0026amp;signature=4b325dbf2b9e39605e464eb912f8501101fe913e2d6d2e1945a628e2ad3167fd\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/opper/QTlMDo19G0sAM5ID/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Opper\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#14cdcd\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.opper.ai/v3-api-reference/management/create-dynamic-route\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/v3-api-reference/management/create-dynamic-route.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.opper.ai/#organization\",\"name\":\"Opper\",\"url\":\"https://docs.opper.ai\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/opper/EXrQN6z6604ZsBuP/logo/light.svg?fit=max\u0026auto=format\u0026n=EXrQN6z6604ZsBuP\u0026q=85\u0026s=fd4170c482c6cebc3c20d8f7f7e033f8\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.opper.ai#website\",\"name\":\"Opper\",\"url\":\"https://docs.opper.ai\",\"publisher\":{\"@id\":\"https://docs.opper.ai/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.opper.ai/v3-api-reference/management/create-dynamic-route#webpage\",\"url\":\"https://docs.opper.ai/v3-api-reference/management/create-dynamic-route\",\"name\":\"Create a dynamic route\",\"description\":\"Creates a route draft. Omit graph to seed a complete default graph, then use data.draft.graph as a starting point. Empty graphs are invalid. Omit deploy or set deploy=false to keep the route unpublished; deploy=true changes live routing immediately. Review data.draft.validation, save changes with update_dynamic_route_draft, then use simulate_dynamic_route without version_number to test the draft before deploy_dynamic_route. Optional display_name is a human label separate from the route identifier; it preserves case and spaces. Invoke a deployed route with model=dynamic/; invocation_model contains the exact string. Requires the dynamic_routes:write scope. Graph format: an object with an elements array. Each element has a unique id, a type, optional properties, and outputs, an object mapping output names to {\\\"elementId\\\":\\\"target-node-id\\\"}. Include id: START, type: start and id: END, type: end; input and output are not node types. A minimal deployable graph (replace the model with an available catalog ID permitted by your policy): json {\\\"elements\\\":[{\\\"id\\\":\\\"START\\\",\\\"type\\\":\\\"start\\\",\\\"outputs\\\":{\\\"next\\\":{\\\"elementId\\\":\\\"primary\\\"}}},{\\\"id\\\":\\\"primary\\\",\\\"type\\\":\\\"model\\\",\\\"properties\\\":{\\\"model\\\":\\\"cerebras/gpt-oss-120b\\\"},\\\"outputs\\\":{\\\"success\\\":{\\\"elementId\\\":\\\"END\\\"},\\\"fallback\\\":{\\\"elementId\\\":\\\"END\\\"}}},{\\\"id\\\":\\\"END\\\",\\\"type\\\":\\\"end\\\",\\\"outputs\\\":{}}]} Supported node types and properties: - start: the START node; outputs.next selects the first node. - end: the END node; outputs is {}. - model: properties.model is a catalog model ID. outputs.success targets END or an observe node; outputs.fallback targets another model, pool, or END. - pool: properties.models contains 2-10 {model,metrics} candidates; properties.expression is a numeric CEL expression such as model.cost, sorted ascending. Uses the same success/fallback outputs as model. - conditional: properties.cases contains {id,expression} entries; each expression is a CEL predicate over metadata, auth, and input. Connect an output for each case ID and a default output. The first true case wins. - percentage: properties.buckets contains at least two {id,weight} entries with positive integer weights totaling 100. Connect an output for each bucket ID. - classifier: properties.cases contains 2-10 {id,label,instructions} entries with unique labels, plus optional context and model properties. Connect an output per case ID; no default output. Classification failures fail the route. - observe: properties.criteria defines an asynchronous evaluation, with optional score_type (score or binary), model, threshold, and sample_rate (both greater than 0 and at most 1). Place after model/pool success or another observe node; outputs.next leads to another observe node or END. Graphs must be acyclic. Every node except END accepts at most one incoming edge; use separate model nodes on separate branches. Deployment requires each path from START to reach a model or pool before END. The route name is the model identifier on chat completions, responses, messages and native calls.\",\"dateModified\":\"2026-09-17T07:26:27.000Z\",\"isPartOf\":{\"@id\":\"https://docs.opper.ai#website\"},\"breadcrumb\":{\"@id\":\"https://docs.opper.ai/v3-api-reference/management/create-dynamic-route#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.opper.ai/v3-api-reference/management/create-dynamic-route#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Platform APIs\",\"item\":\"https://docs.opper.ai/v3-api-reference/generations/list-generations\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Management\",\"item\":\"https://docs.opper.ai/v3-api-reference/management/list-projects\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Create a dynamic route\",\"item\":\"https://docs.opper.ai/v3-api-reference/management/create-dynamic-route\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.opper.ai/v3-api-reference/management/create-dynamic-route#apireference\",\"headline\":\"Create a dynamic route\",\"name\":\"Create a dynamic route\",\"description\":\"Creates a route draft. Omit graph to seed a complete default graph, then use data.draft.graph as a starting point. Empty graphs are invalid. Omit deploy or set deploy=false to keep the route unpublished; deploy=true changes live routing immediately. Review data.draft.validation, save changes with update_dynamic_route_draft, then use simulate_dynamic_route without version_number to test the draft before deploy_dynamic_route. Optional display_name is a human label separate from the route identifier; it preserves case and spaces. Invoke a deployed route with model=dynamic/; invocation_model contains the exact string. Requires the dynamic_routes:write scope. Graph format: an object with an elements array. Each element has a unique id, a type, optional properties, and outputs, an object mapping output names to {\\\"elementId\\\":\\\"target-node-id\\\"}. Include id: START, type: start and id: END, type: end; input and output are not node types. A minimal deployable graph (replace the model with an available catalog ID permitted by your policy): json {\\\"elements\\\":[{\\\"id\\\":\\\"START\\\",\\\"type\\\":\\\"start\\\",\\\"outputs\\\":{\\\"next\\\":{\\\"elementId\\\":\\\"primary\\\"}}},{\\\"id\\\":\\\"primary\\\",\\\"type\\\":\\\"model\\\",\\\"properties\\\":{\\\"model\\\":\\\"cerebras/gpt-oss-120b\\\"},\\\"outputs\\\":{\\\"success\\\":{\\\"elementId\\\":\\\"END\\\"},\\\"fallback\\\":{\\\"elementId\\\":\\\"END\\\"}}},{\\\"id\\\":\\\"END\\\",\\\"type\\\":\\\"end\\\",\\\"outputs\\\":{}}]} Supported node types and properties: - start: the START node; outputs.next selects the first node. - end: the END node; outputs is {}. - model: properties.model is a catalog model ID. outputs.success targets END or an observe node; outputs.fallback targets another model, pool, or END. - pool: properties.models contains 2-10 {model,metrics} candidates; properties.expression is a numeric CEL expression such as model.cost, sorted ascending. Uses the same success/fallback outputs as model. - conditional: properties.cases contains {id,expression} entries; each expression is a CEL predicate over metadata, auth, and input. Connect an output for each case ID and a default output. The first true case wins. - percentage: properties.buckets contains at least two {id,weight} entries with positive integer weights totaling 100. Connect an output for each bucket ID. - classifier: properties.cases contains 2-10 {id,label,instructions} entries with unique labels, plus optional context and model properties. Connect an output per case ID; no default output. Classification failures fail the route. - observe: properties.criteria defines an asynchronous evaluation, with optional score_type (score or binary), model, threshold, and sample_rate (both greater than 0 and at most 1). Place after model/pool success or another observe node; outputs.next leads to another observe node or END. Graphs must be acyclic. Every node except END accepts at most one incoming edge; use separate model nodes on separate branches. Deployment requires each path from START to reach a model or pool before END. The route name is the model identifier on chat completions, responses, messages and native calls.\",\"url\":\"https://docs.opper.ai/v3-api-reference/management/create-dynamic-route\",\"mainEntityOfPage\":{\"@id\":\"https://docs.opper.ai/v3-api-reference/management/create-dynamic-route#webpage\"},\"dateModified\":\"2026-09-17T07:26:27.000Z\",\"publisher\":{\"@id\":\"https://docs.opper.ai/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.opper.ai#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Opper\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Opper","nav":{"global":null,"tabs":[{"tab":"Documentation","icon":"book-open","pages":[{"title":"Documentation","href":"/overview/about"}]},{"tab":"Cookbook","icon":"github","href":"https://github.com/opper-ai/opper-cookbook"},{"tab":"API Reference","icon":"square-terminal","groups":[{"group":"Compatibility","pages":[{"group":"OpenAI","expanded":true,"pages":[{"title":"Chat Completions","openapi":"post /v3/compat/chat/completions","href":"/v3-api-reference/compatibility/chat-completions"},{"title":"Responses","openapi":"post /v3/compat/responses","href":"/v3-api-reference/compatibility/create-response"},{"title":"Embeddings","openapi":"post /v3/compat/embeddings","href":"/v3-api-reference/compatibility/create-embeddings"},{"title":"Decisions","openapi":"post /v3/compat/decisions","href":"/v3-api-reference/compatibility/create-decision"},{"title":"List Models","openapi":"get /v3/compat/models","href":"/v3-api-reference/compatibility/list-models"}]},{"group":"Anthropic","expanded":true,"pages":[{"title":"Messages","openapi":"post /v3/compat/v1/messages","href":"/v3-api-reference/compatibility/create-message"},{"title":"Count Tokens","openapi":"post /v3/compat/v1/messages/count_tokens","href":"/v3-api-reference/compatibility/count-message-tokens"}]},{"group":"Google","expanded":true,"pages":[{"title":"Interactions","openapi":"post /v3/compat/v1beta/interactions","href":"/v3-api-reference/compatibility/create-interaction"},{"title":"Generate Content","openapi":"post /v3/compat/v1beta/models/{model}:generateContent","href":"/v3-api-reference/compatibility/generate-content"},{"title":"Stream Generate Content","openapi":"post /v3/compat/v1beta/models/{model}:streamGenerateContent","href":"/v3-api-reference/compatibility/stream-generate-content"},{"title":"Count Tokens","openapi":"post /v3/compat/v1beta/models/{model}:countTokens","href":"/v3-api-reference/compatibility/count-tokens"}]},{"group":"TypeSafe","expanded":true,"pages":[{"title":"System One evaluation","openapi":"post /v3/compat/v1/systemone","href":"/v3-api-reference/compatibility/systemone"}]},{"group":"Other","expanded":true,"pages":[{"title":"OpenResponses","openapi":"post /v3/compat/openresponses","href":"/v3-api-reference/compatibility/openresponses"}]}]},{"group":"Multimodality","pages":[{"group":"Images","pages":[{"title":"Generate an image","openapi":"post /v3/images","href":"/v3-api-reference/images/create-image"},{"title":"List image models","openapi":"get /v3/images/models","href":"/v3-api-reference/images/list-image-models"}]},{"group":"Audio","pages":[{"title":"Generate speech","openapi":"post /v3/audio/speech","href":"/v3-api-reference/audio/create-speech"},{"title":"Transcribe audio","openapi":"post /v3/audio/transcriptions","href":"/v3-api-reference/audio/create-transcription"},{"title":"Generate audio","openapi":"post /v3/audio/generations","href":"/v3-api-reference/audio/create-audio-generation"},{"title":"List audio models","openapi":"get /v3/audio/models","href":"/v3-api-reference/audio/list-audio-models"},{"title":"Create Voice","openapi":"post /v3/audio/voices","href":"/v3-api-reference/audio/create-voice"},{"title":"List Voices","openapi":"get /v3/audio/voices","href":"/v3-api-reference/audio/list-voices"},{"title":"Get Voice","openapi":"get /v3/audio/voices/{id}","href":"/v3-api-reference/audio/get-voice"},{"title":"Delete Voice","openapi":"delete /v3/audio/voices/{id}","href":"/v3-api-reference/audio/delete-voice"}]},{"group":"Video","pages":[{"title":"Generate a video","openapi":"post /v3/videos","href":"/v3-api-reference/video/create-video"},{"title":"List video models","openapi":"get /v3/videos/models","href":"/v3-api-reference/video/list-video-models"}]},{"group":"Rerank","pages":[{"title":"Rerank documents","openapi":"post /v3/rerank","href":"/v3-api-reference/rerank/rerank-documents"}]},{"group":"OCR","pages":[{"title":"Extract text (OCR)","openapi":"post /v3/ocr","href":"/v3-api-reference/ocr/extract-text"},{"title":"List OCR models","openapi":"get /v3/ocr/models","href":"/v3-api-reference/ocr/list-ocr-models"}]}]},{"group":"Files","pages":[{"title":"Upload a file","openapi":"post /v3/files","href":"/v3-api-reference/files/upload-file"},{"title":"List files","openapi":"get /v3/files","href":"/v3-api-reference/files/list-files"},{"title":"Get file metadata","openapi":"get /v3/files/{id}","href":"/v3-api-reference/files/get-file"},{"title":"Get a file download URL","openapi":"get /v3/files/{id}/content","href":"/v3-api-reference/files/get-file-content"},{"title":"Set or clear a file's expiry","openapi":"patch /v3/files/{id}","href":"/v3-api-reference/files/update-file"},{"title":"Delete a file","openapi":"delete /v3/files/{id}","href":"/v3-api-reference/files/delete-file"}]},{"group":"Realtime","pages":[{"title":"Realtime protocol","href":"/v3-api-reference/realtime/protocol"},{"title":"Mint realtime ticket","href":"/v3-api-reference/realtime/create-realtime-session"}]},{"group":"Roundtable","pages":[{"openapi":"post /v3/roundtable","title":"Roundtable","href":"/v3-api-reference/roundtable/create-roundtable"}]},{"group":"Platform APIs","pages":[{"group":"Generations","pages":[{"openapi":"get /v3/generations","title":"List generations","href":"/v3-api-reference/generations/list-generations"},{"openapi":"get /v3/generations/{id}","title":"Get generation","href":"/v3-api-reference/generations/get-generation"},{"openapi":"delete /v3/generations/{id}","title":"Delete generation","href":"/v3-api-reference/generations/delete-generation"}]},{"group":"Management","pages":[{"openapi":"get /management/v1/projects","title":"List projects","href":"/v3-api-reference/management/list-projects"},{"openapi":"post /management/v1/projects","title":"Create a project","href":"/v3-api-reference/management/create-project"},{"openapi":"get /management/v1/projects/{uuid}","title":"Get a project","href":"/v3-api-reference/management/get-project"},{"openapi":"patch /management/v1/projects/{uuid}","title":"Update a project","href":"/v3-api-reference/management/update-project"},{"openapi":"delete /management/v1/projects/{uuid}","title":"Delete a project","href":"/v3-api-reference/management/delete-project"},{"openapi":"get /management/v1/projects/{uuid}/api-keys","title":"List a project's API keys","href":"/v3-api-reference/management/list-api-keys"},{"openapi":"post /management/v1/projects/{uuid}/api-keys","title":"Mint an API key","href":"/v3-api-reference/management/create-api-key"},{"openapi":"delete /management/v1/projects/{uuid}/api-keys/{id}","title":"Delete an API key","href":"/v3-api-reference/management/delete-api-key"},{"openapi":"get /management/v1/members","title":"List members","href":"/v3-api-reference/management/list-members"},{"openapi":"delete /management/v1/members/{user_uuid}","title":"Remove a member","href":"/v3-api-reference/management/remove-member"},{"openapi":"get /management/v1/invites","title":"List invitations","href":"/v3-api-reference/management/list-invites"},{"openapi":"post /management/v1/invites","title":"Invite a member","href":"/v3-api-reference/management/create-invite"},{"openapi":"delete /management/v1/invites/{id}","title":"Revoke an invitation","href":"/v3-api-reference/management/revoke-invite"},{"openapi":"get /management/v1/dynamic-routes","title":"List dynamic routes","description":"Lists routes in the calling organization, including whether drafts differ from the deployed version. Requires the `dynamic_routes:read` scope. meta.default_classifier_chain is the model chain a classifier uses when it does not pin one. meta.default_first_token_timeout_ms is the first-token timeout a model or pool node runs on when its arguments state none.","href":"/v3-api-reference/management/list-dynamic-routes"},{"openapi":"post /management/v1/dynamic-routes","title":"Create a dynamic route","href":"/v3-api-reference/management/create-dynamic-route"},{"openapi":"get /management/v1/dynamic-routes/{name}","title":"Get a dynamic route","description":"Returns the route, draft graph, validation issues and active version. Requires the `dynamic_routes:read` scope.","href":"/v3-api-reference/management/get-dynamic-route"},{"openapi":"put /management/v1/dynamic-routes/{name}/draft","title":"Replace the draft","href":"/v3-api-reference/management/update-dynamic-route-draft"},{"openapi":"post /management/v1/dynamic-routes/{name}/deploy","title":"Deploy the draft","href":"/v3-api-reference/management/deploy-dynamic-route"},{"openapi":"post /management/v1/dynamic-routes/{name}/simulate","title":"Simulate a request through the route","href":"/v3-api-reference/management/simulate-dynamic-route"},{"openapi":"get /management/v1/dynamic-routes/{name}/versions","title":"List a route's versions","href":"/v3-api-reference/management/list-dynamic-route-versions"},{"openapi":"get /management/v1/dynamic-routes/{name}/versions/{version_number}","title":"Get a version","href":"/v3-api-reference/management/get-dynamic-route-version"},{"openapi":"post /management/v1/dynamic-routes/{name}/versions/{version_number}/rollback","title":"Roll back to a version","href":"/v3-api-reference/management/rollback-dynamic-route"},{"openapi":"post /management/v1/dynamic-routes/{name}/versions/{version_number}/restore-to-draft","title":"Copy a version into the draft","href":"/v3-api-reference/management/restore-dynamic-route-version-to-draft"},{"openapi":"delete /management/v1/dynamic-routes/{name}","title":"Delete a dynamic route","href":"/v3-api-reference/management/delete-dynamic-route"},{"openapi":"get /management/v1/controls/rules","title":"List control rules","href":"/v3-api-reference/management/list-control-rules"},{"openapi":"post /management/v1/controls/rules","title":"Create a control rule","href":"/v3-api-reference/management/create-control-rule"},{"openapi":"patch /management/v1/controls/rules/{uuid}","title":"Update a control rule","href":"/v3-api-reference/management/update-control-rule"},{"openapi":"delete /management/v1/controls/rules/{uuid}","title":"Delete a control rule","href":"/v3-api-reference/management/delete-control-rule"},{"openapi":"get /management/v1/usage","title":"Get usage and cost","href":"/v3-api-reference/management/get-usage"},{"openapi":"post /management/v1/management-keys/_self/disable","title":"Disable the calling management key","href":"/v3-api-reference/management/disable-management-key"}]},{"group":"Models","pages":[{"openapi":"get /v3/models","title":"List models","href":"/v3-api-reference/models/list-models"}]},{"group":"Spans","pages":[{"openapi":"post /v3/spans","title":"Create span","href":"/v3-api-reference/spans/create-span"},{"openapi":"patch /v3/spans/{id}","title":"Update span","href":"/v3-api-reference/spans/update-span"}]},{"group":"Tools","pages":[{"openapi":"post /v3/tools/web/fetch","title":"Web fetch","href":"/v3-api-reference/tools/web-fetch"},{"openapi":"post /v3/tools/web/search","title":"Web search","href":"/v3-api-reference/tools/web-search"}]},{"group":"System","pages":[{"openapi":"get /health","title":"Health check","href":"/v3-api-reference/system/health-check"},{"openapi":"get /v3/openapi.json","title":"OpenAPI spec (JSON)","href":"/v3-api-reference/system/openapi-spec-json"},{"openapi":"get /v3/openapi.yaml","title":"OpenAPI spec (YAML)","href":"/v3-api-reference/system/openapi-spec-yaml"}]}]}]}]},"title":"Create a dynamic route - Opper","buildId":"dpl_DFJrtvUi8HS5F9nkooKuDJsuD5BM","deploymentId":"dpl_DFJrtvUi8HS5F9nkooKuDJsuD5BM","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-rfhihCWU.js","utils-BmH1XFxk.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-BcNsxPKB.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-BAES3tkd.js","snippetPresets-DCMQBKLP.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","ApiExamples-D6l_bzE9.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-BOktbnNh.js","shallow-BCs8SgM7.js","getApiPlaygroundDisplay-DEmW5bJB.js","CodeSnippet-CpZOpB9C.js","CodeSnippets-BOBDqibl.js","Page-D5fEM6aW.js","getPastedJson-DH2JBvmr.js","icon-BBJH-kKh.js","MethodPill-D2Sd5NLC.js","DuplicateIcon-CGgfL2qN.js","createIcon-BKudBBzi.js","DynamicMarkdown-85clUA0i.js","SectionHeading-D0JiMgDx.js","axios-vUo_bRtp.js","Markdown-Cfiy0xZO.js","clsx-rL8ZCCw4.js","lib--scc4DXi.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-aeztFa9U.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-BywkCr5C.js"]}