List the upstream operations callers may use, match AWS-style operations by header, and decide which calls are counted, streamed or refused.
A route is one upstream operation: a method, a path glob and optionally the request headers that must also match. The first route that fits a request decides whether the call is allowed, whether it is counted and charged, how it is priced and whether it streams.With no routes and Relay Any Path off, a relay refuses every call with 404. That is the safe default: list the operations you mean to expose.
Open Relays, select the relay and choose Add Route above the route table.
Pick the Method and enter the Path, for example /search.
Add Header Matchers if the upstream tells operations apart by header rather than path.
Choose Streaming (Auto, Always stream, Never stream) and whether the route is Billable.
Open Pricing Override to price this route differently from the relay, then select Add Route.
The route table shows each route’s method, path, header matchers, effective price (with an override badge when the route changes the relay pricing) and an Enabled switch. Routes are matched top to bottom.
Routes are part of the relay. Send the whole relay back with its routes array:
A path is matched segment by segment against the request path below /relay/{name}:
Pattern
Matches
Does not match
/search
/search
/search/, /v1/search
/crawl/*
/crawl/abc, /crawl/123
/crawl, /crawl/abc/status
/v1/*/predict
/v1/gemini/predict
/v1/a/b/predict
/v1/**
/v1, /v1/x, /v1/x/y/z
/v2/x
/
/ (AWS JSON APIs post every operation here)
anything else
* matches within one segment and ?, [...] work as in a shell. ** is allowed only as the last segment, where it matches the prefix and everything below it. The request path is matched decoded, so /files/a%2Fb is seen as /files/a/b.
Some APIs send every operation to the same path and name the operation in a header. AWS JSON APIs (Textract, Translate, Comprehend) POST / with X-Amz-Target: Textract.AnalyzeDocument. A route on method and path alone cannot tell those operations apart, so a route may also require headers:
Names match case-insensitively; values are globs matched case-sensitively, with / as an ordinary character (application/x-amz-json-1.1 is a valid literal).
Every listed header must be present and match. A route with no headers matches on method and path alone.
When the relay sets an extra header of the same name, the matcher sees the operator’s value, since that is what reaches the upstream.
A request that sends one header under two spellings (X-Amz-Target and x-amz-target) is refused with 400.
A matcher may not name a header callers never deliver to route matching: credentials (Authorization, x-api-key, the relay’s own auth.header_name), gateway headers (x-bf-*), hop-by-hop headers, Content-Length, and under aws_sigv4 any x-amz-* header other than X-Amz-Target. Such a route is refused at save time.
The first matching route wins, so a literal path must come before a glob that also covers it: GET /files/latest before GET /files/*. A disabled route still matches, which is how it refuses a request rather than letting it fall through to a broader route or to Relay Any Path.The OpenAPI import sorts routes so that more specific ones come first.
Unless a route says otherwise, only POST calls are counted. On most APIs GET and HEAD are polls and listings, PUT and PATCH update settings and DELETE cleans up; charging those would spend a caller’s allowance on nothing. A route never flips a method’s billing just by existing, which keeps imported route lists safe. Set billable: true where an API bills another method, and billable: false to relay a POST free of charge.A call is counted (priced and charged to budgets) only when it is billable and the upstream answers 2xx. A 4xx or 5xx reply is relayed and not charged, but like every forwarded reply it still counts one request against the caller’s request rate limits.
Relay Any Path (skip_route_check: true) relays requests that match no route instead of refusing them. Unrouted calls use the relay-level pricing and the method default for billing. Disabled routes still refuse their requests.
With Relay Any Path on, every path on the upstream is reachable with the relay’s credential. Prefer listing routes; use this switch for a trusted upstream or while discovering an API.
Import OpenAPI in the route table turns an OpenAPI 3 or Swagger 2 document (pasted, uploaded or fetched from a URL, JSON or YAML) into routes. A URL is fetched by Bifrost, not the browser, with the same size cap and private-network guard as the MCP OpenAPI servers; the document is read once and not stored. Every operation becomes a route; {param} segments become *; AWS-style /#X-Amz-Target=Service.Op keys become a route on the path with an X-Amz-Target matcher. The preview also suggests an auth type and base URL, read from the document’s security schemes and servers (a relative server resolves against the URL the document was fetched from). The import changes only the routes, so review those suggestions and set them on the relay yourself.The import is shown for review first: the dialog says how many routes will replace the current list and names any route with a pricing override or job that would be removed. Nothing changes until you choose Apply import. Routes the document still lists keep their settings; new ones carry no pricing override, so they use the relay pricing and the method default for billing.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/schema.json","name":"Bifrost","colors":{"primary":"#0C3B43","light":"#07C983"},"logo":{"light":"https://mintcdn.com/bifrost/qFMmk8bNSnvgFYDI/media/bifrost-logo.png?fit=max\u0026auto=format\u0026n=qFMmk8bNSnvgFYDI\u0026q=85\u0026s=6af701a560aee4103444fa017b226cf0","dark":"https://mintcdn.com/bifrost/qFMmk8bNSnvgFYDI/media/bifrost-logo-dark.png?fit=max\u0026auto=format\u0026n=qFMmk8bNSnvgFYDI\u0026q=85\u0026s=84d264aad5f421c526dd17893e7c5739"},"favicon":"https://mintcdn.com/bifrost/qFMmk8bNSnvgFYDI/favicon.ico?fit=max\u0026auto=format\u0026n=qFMmk8bNSnvgFYDI\u0026q=85\u0026s=a57bad8c37d798efcb53dca5d96d8b45","navbar":{"links":[{"href":"https://www.getmaxim.ai/enterprise?utm_source=bifrost_docs\u0026utm_medium=Bifrost_Navbar#free-license","label":"Request License"}],"primary":{"type":"button","label":"Book a Demo","href":"https://www.getmaxim.ai/book-a-demo?utm_source=bifrost_docs\u0026utm_medium=Bifrost_Navbar"}},"footer":{"socials":{"x":"https://x.com/getbifrost","linkedin":"https://linkedin.com/company/maxim-ai","github":"https://github.com/maximhq/bifrost"},"links":[{"header":"Company","items":[{"label":"Book a Demo","href":"https://www.getmaxim.ai/book-a-demo?utm_source=bifrost_docs\u0026utm_medium=Bifrost_Footer"},{"label":"Partner Program","href":"https://www.getmaxim.ai/partners-program?utm_source=bifrost_docs\u0026utm_medium=Bifrost_Footer"},{"label":"Careers","href":"https://www.getmaxim.ai/careers?utm_source=bifrost_docs\u0026utm_medium=Bifrost_Footer"},{"label":"Contact Us","href":"mailto:[email protected]"},{"label":"Security","href":"https://docs.getbifrost.ai/security"},{"label":"Trust Center","href":"https://trust.getmaxim.ai/"},{"label":"Terms of Service","href":"https://www.getmaxim.ai/terms-of-service?utm_source=bifrost_docs\u0026utm_medium=Bifrost_Footer"},{"label":"Privacy Policy","href":"https://www.getmaxim.ai/privacy-policy?utm_source=bifrost_docs\u0026utm_medium=Bifrost_Footer"}]},{"header":"Products","items":[{"label":"LLM Gateway","href":"https://www.getmaxim.ai/llm-gateway?utm_source=bifrost_docs\u0026utm_medium=Bifrost_Footer"},{"label":"MCP Gateway","href":"https://www.getmaxim.ai/mcp-gateway?utm_source=bifrost_docs\u0026utm_medium=Bifrost_Footer"},{"label":"Governance","href":"https://www.getmaxim.ai/ai-governance?utm_source=bifrost_docs\u0026utm_medium=Bifrost_Footer"},{"label":"Guardrails","href":"https://www.getmaxim.ai/ai-guardrails?utm_source=bifrost_docs\u0026utm_medium=Bifrost_Footer"},{"label":"Observability","href":"https://www.getmaxim.ai/ai-observability?utm_source=bifrost_docs\u0026utm_medium=Bifrost_Footer"},{"label":"Bifrost Edge","href":"https://www.getmaxim.ai/edge?utm_source=bifrost_docs\u0026utm_medium=Bifrost_Footer"}]},{"header":"Resources","items":[{"label":"Bifrost Enterprise","href":"https://www.getmaxim.ai/enterprise?utm_source=bifrost_docs\u0026utm_medium=Bifrost_Footer"},{"label":"Performance Benchmarks","href":"https://www.getmaxim.ai/bifrost/resources/benchmarks?utm_source=bifrost_docs\u0026utm_medium=Bifrost_Footer"},{"label":"LLM Gateway Buyer's Guide","href":"https://www.getmaxim.ai/bifrost/resources/buyers-guide?utm_source=bifrost_docs\u0026utm_medium=Bifrost_Footer"},{"label":"Claude Code Integration","href":"https://www.getmaxim.ai/bifrost/resources/claude-code?utm_source=bifrost_docs\u0026utm_medium=Bifrost_Footer"},{"label":"Migrating from LiteLLM","href":"https://www.getmaxim.ai/bifrost/resources/migrating-from-litellm?utm_source=bifrost_docs\u0026utm_medium=Bifrost_Footer"},{"label":"Blogs","href":"https://www.getmaxim.ai/bifrost/blog?utm_source=bifrost_docs\u0026utm_medium=Bifrost_Footer"}]},{"header":"For LLMs","items":[{"label":"llms-full.txt","href":"https://docs.getbifrost.ai/llms-full.txt"},{"label":"llms.txt","href":"https://docs.getbifrost.ai/llms.txt"},{"label":"llm-info","href":"https://www.getmaxim.ai/llm-info?utm_source=bifrost_docs\u0026utm_medium=Bifrost_Footer"}]}]},"styling":{"latex":true},"navigation":{"global":{"anchors":[{"anchor":"Discord","icon":"discord","href":"https://discord.gg/exN5KAydbU"},{"anchor":"GitHub","icon":"github","href":"https://github.com/maximhq/bifrost"},{"anchor":"Try Enterprise","icon":"building","href":"https://www.getmaxim.ai/bifrost/enterprise"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"bifrost","hasAudioNarration":false,"actualSubdomain":"bifrost","customDomains":["docs.getbifrost.ai"],"gitSource":{"type":"github","owner":"maximhq","repo":"bifrost","deployBranch":"main","contentDirectory":"docs","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ae34223c5540a38c0905011","collectionId":"0344de93-1cb8-4f37-816d-49cb8da030e3","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae34223c5540a38c0905011"},"feedback":{"thumbs":true},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6ae348a6217e82a3b924da4f","clientVersion":"0.0.4006","searchFilterCounts":[{"language":"default","tag":"API","count":690},{"language":"default","tag":"Changelogs","count":314},{"language":"default","tag":"Integrations","count":248},{"language":"default","tag":"Platform","count":237},{"language":"default","tag":"Open Source","count":163},{"language":"default","tag":"OSS","count":152},{"language":"default","tag":"Governance","count":132},{"language":"default","tag":"Enterprise","count":101},{"language":"default","tag":"Helm","count":75},{"language":"default","tag":"Inference","count":71}]},"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":"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":"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":"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}],"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":".nav-logo{height:1.5rem}div:has(>nav[aria-label=Main]){gap:1.5rem}nav[aria-label=Main]>ul{gap:1rem}nav[aria-label=Main] a[href*=book-a-demo]{padding:.4375rem .625rem}nav[aria-label=Main] a[href*=book-a-demo] svg{display:none}div:has(>nav[aria-label=Main])>*,nav[aria-label=Main]>ul>*{margin-inline:0}nav[aria-label=Main] .navbar-link a[href*=\"#free-license\"]{display:inline-flex;align-items:center;border:1px solid rgb(var(--primary-dark));border-radius:.75rem;box-sizing:border-box;padding:calc(.4375rem - 1px) .625rem;color:rgb(var(--primary-dark));background:0 0;font-size:.875rem;font-weight:500;line-height:1.25rem}nav[aria-label=Main] .navbar-link a[href*=\"#free-license\"]:hover{background-color:rgb(var(--primary-dark)/.1)}.dark nav[aria-label=Main] .navbar-link a[href*=\"#free-license\"]{border-color:rgb(var(--primary-light));color:rgb(var(--primary-light))}.dark nav[aria-label=Main] .navbar-link a[href*=\"#free-license\"]:hover{background-color:rgb(var(--primary-light)/.12)}#sidebar-group>li>button>div{line-height:normal}.footer-compliance{display:flex;align-items:center;flex-wrap:wrap;gap:.5rem;max-width:100%}.footer-compliance img{width:2.5rem;height:2.5rem;flex:none;object-fit:contain}@media (max-width:767px){footer.advanced-footer>div>div:first-child>div:first-child{flex-direction:column;align-items:flex-start;justify-content:flex-start;row-gap:1rem;width:100%;height:auto}footer.advanced-footer>div>div:first-child>div:first-child>div:last-child{justify-content:flex-start;min-width:0;max-width:100%}footer.advanced-footer a[class*=truncate],footer.advanced-footer>div>div:first-child>div:last-child,footer.advanced-footer>div>div:first-child>div:last-child>div{white-space:normal!important}}@media (min-width:768px){footer.advanced-footer>div>div:first-child{justify-content:flex-start;column-gap:3rem}footer.advanced-footer>div>div:first-child>div:first-child{min-width:0;justify-content:flex-start;align-items:flex-start;row-gap:1.25rem}footer.advanced-footer>div>div:first-child>div:first-child>div:last-child{margin-top:auto}footer.advanced-footer>div>div:first-child>div:last-child{flex:0 1 auto;justify-content:start;grid-template-columns:repeat(4,max-content)!important;column-gap:4rem!important}footer.advanced-footer>div>div:first-child>div:last-child>div{align-items:flex-start;width:auto;flex:none}footer.advanced-footer a[class*=truncate]{max-width:none!important;overflow:visible!important;text-overflow:unset!important;white-space:nowrap!important}}"}],"page":{"pagePath":"relays/routes","slug":"/relays/routes","pageMetadata":{"title":"Routes and header matchers","description":"List the upstream operations callers may use, match AWS-style operations by header, and decide which calls are counted, streamed or refused.","icon":"route","href":"/relays/routes"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"List the upstream operations callers may use, match AWS-style operations by header, and decide which calls are counted, streamed or refused.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Tab,Table,Tabs,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Tab)_missingMdxReference(`Tab`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Tabs)_missingMdxReference(`Tabs`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`A route is one upstream operation: a method, a path glob and optionally the request headers that must also match. The first route that fits a request decides whether the call is allowed, whether it is counted and charged, how it is priced and whether it streams.`}),`\n`,_jsxs(_components.p,{children:[`With no routes and `,_jsx(_components.strong,{children:`Relay Any Path`}),` off, a relay refuses every call with `,_jsx(_components.code,{children:`404`}),`. That is the safe default: list the operations you mean to expose.`]}),`\n`,_jsx(Heading,{level:`2`,id:`add-a-route`,children:`Add a route`}),`\n`,_jsxs(Tabs,{group:`config-method`,children:[_jsxs(Tab,{title:`Web UI`,id:`web-ui`,children:[_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`Open `,_jsx(_components.strong,{children:`Relays`}),`, select the relay and choose `,_jsx(_components.strong,{children:`Add Route`}),` above the route table.`]}),`\n`,_jsxs(_components.li,{children:[`Pick the `,_jsx(_components.strong,{children:`Method`}),` and enter the `,_jsx(_components.strong,{children:`Path`}),`, for example `,_jsx(_components.code,{children:`/search`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`Add `,_jsx(_components.strong,{children:`Header Matchers`}),` if the upstream tells operations apart by header rather than path.`]}),`\n`,_jsxs(_components.li,{children:[`Choose `,_jsx(_components.strong,{children:`Streaming`}),` (Auto, Always stream, Never stream) and whether the route is `,_jsx(_components.strong,{children:`Billable`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`Open `,_jsx(_components.strong,{children:`Pricing Override`}),` to price this route differently from the relay, then select `,_jsx(_components.strong,{children:`Add Route`}),`.`]}),`\n`]}),_jsxs(_components.p,{children:[`The route table shows each route’s method, path, header matchers, effective price (with an `,_jsx(_components.strong,{children:`override`}),` badge when the route changes the relay pricing) and an `,_jsx(_components.strong,{children:`Enabled`}),` switch. Routes are matched top to bottom.`]})]}),_jsxs(Tab,{title:`API`,id:`api`,children:[_jsxs(_components.p,{children:[`Routes are part of the relay. Send the whole relay back with its `,_jsx(_components.code,{children:`routes`}),` array:`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`13`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`13`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`curl`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -X`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` PUT`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` http://localhost:8080/api/relays/tavily`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Content-Type: application/json\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -d`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` '{`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"base_url\": \"https://api.tavily.com\",`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"auth\": { \"type\": \"bearer\" },`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"credential\": { \"value\": \"env.TAVILY_API_KEY\" },`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"routes\": [`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` { \"method\": \"POST\", \"path\": \"/search\" },`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` { \"method\": \"POST\", \"path\": \"/extract\" },`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` { \"method\": \"GET\", \"path\": \"/crawl/*\" },`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` { \"method\": \"DELETE\", \"path\": \"/crawl/*\", \"enabled\": false }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` ]`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` }'`})}),`\n`]})})})]}),_jsxs(Tab,{title:`config.json`,id:`config-json`,children:[_jsx(CodeBlock,{filename:``,numberOfLines:`16`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`16`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"relays\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: [`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"name\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"tavily\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"base_url\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"https://api.tavily.com\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"auth\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: { `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"type\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"bearer\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"credential\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: { `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"value\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"env.TAVILY_API_KEY\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"routes\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: [`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` { `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"method\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"POST\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"path\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"/search\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` { `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"method\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"POST\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"path\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"/extract\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` { `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"method\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"GET\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"path\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"/crawl/*\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` { `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"method\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"DELETE\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"path\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"/crawl/*\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"enabled\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`false`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` ]`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` ]`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Field`}),_jsx(_components.th,{children:`Type`}),_jsx(_components.th,{children:`Required`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`method`})}),_jsx(_components.td,{children:`string`}),_jsx(_components.td,{children:`Yes`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`GET`}),`, `,_jsx(_components.code,{children:`POST`}),`, `,_jsx(_components.code,{children:`PUT`}),`, `,_jsx(_components.code,{children:`PATCH`}),`, `,_jsx(_components.code,{children:`DELETE`}),` or `,_jsx(_components.code,{children:`HEAD`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`path`})}),_jsx(_components.td,{children:`string`}),_jsx(_components.td,{children:`Yes`}),_jsxs(_components.td,{children:[`Rooted segment glob; see `,_jsx(_components.a,{href:`#path-globs`,children:`Path globs`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`headers`})}),_jsx(_components.td,{children:`object`}),_jsx(_components.td,{children:`No`}),_jsxs(_components.td,{children:[`Header name to value glob; every one must match. See `,_jsx(_components.a,{href:`#header-matchers`,children:`Header matchers`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`enabled`})}),_jsx(_components.td,{children:`boolean`}),_jsx(_components.td,{children:`No`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`false`}),` refuses matching requests with `,_jsx(_components.code,{children:`404`}),`, even with `,_jsx(_components.code,{children:`skip_route_check`}),` on. Default `,_jsx(_components.code,{children:`true`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`billable`})}),_jsx(_components.td,{children:`boolean`}),_jsx(_components.td,{children:`No`}),_jsxs(_components.td,{children:[`Whether a `,_jsx(_components.code,{children:`2xx`}),` reply is counted and charged. Default: `,_jsx(_components.code,{children:`true`}),` for `,_jsx(_components.code,{children:`POST`}),`, `,_jsx(_components.code,{children:`false`}),` for every other method.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`stream`})}),_jsx(_components.td,{children:`boolean`}),_jsx(_components.td,{children:`No`}),_jsxs(_components.td,{children:[`Force the streaming (`,_jsx(_components.code,{children:`true`}),`) or buffered (`,_jsx(_components.code,{children:`false`}),`) relay. Unset follows the relay’s `,_jsx(_components.a,{href:`/relays/streaming`,children:`streaming settings`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`usage`})}),_jsx(_components.td,{children:`object`}),_jsx(_components.td,{children:`No`}),_jsxs(_components.td,{children:[`Field-by-field override of the relay’s `,_jsx(_components.a,{href:`/relays/pricing#route-overrides`,children:`usage mapping`}),`.`]})]})]})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`path-globs`,children:`Path globs`}),`\n`,_jsxs(_components.p,{children:[`A path is matched segment by segment against the request path below `,_jsx(_components.code,{children:`/relay/{name}`}),`:`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Pattern`}),_jsx(_components.th,{children:`Matches`}),_jsx(_components.th,{children:`Does not match`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`/search`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`/search`})}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`/search/`}),`, `,_jsx(_components.code,{children:`/v1/search`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`/crawl/*`})}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`/crawl/abc`}),`, `,_jsx(_components.code,{children:`/crawl/123`})]}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`/crawl`}),`, `,_jsx(_components.code,{children:`/crawl/abc/status`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`/v1/*/predict`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`/v1/gemini/predict`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`/v1/a/b/predict`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`/v1/**`})}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`/v1`}),`, `,_jsx(_components.code,{children:`/v1/x`}),`, `,_jsx(_components.code,{children:`/v1/x/y/z`})]}),_jsx(_components.td,{children:_jsx(_components.code,{children:`/v2/x`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`/`})}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`/`}),` (AWS JSON APIs post every operation here)`]}),_jsx(_components.td,{children:`anything else`})]})]})]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`*`}),` matches within one segment and `,_jsx(_components.code,{children:`?`}),`, `,_jsx(_components.code,{children:`[...]`}),` work as in a shell. `,_jsx(_components.code,{children:`**`}),` is allowed only as the last segment, where it matches the prefix and everything below it. The request path is matched decoded, so `,_jsx(_components.code,{children:`/files/a%2Fb`}),` is seen as `,_jsx(_components.code,{children:`/files/a/b`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`header-matchers`,children:`Header matchers`}),`\n`,_jsxs(_components.p,{children:[`Some APIs send every operation to the same path and name the operation in a header. AWS JSON APIs (Textract, Translate, Comprehend) `,_jsx(_components.code,{children:`POST /`}),` with `,_jsx(_components.code,{children:`X-Amz-Target: Textract.AnalyzeDocument`}),`. A route on method and path alone cannot tell those operations apart, so a route may also require headers:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`16`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`16`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"routes\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: [`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"method\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"POST\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"path\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"/\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"headers\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: { `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"X-Amz-Target\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Textract.AnalyzeDocument\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"usage\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: { `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"units_path\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"DocumentMetadata.Pages\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"cost_per_unit\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`0.065`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"method\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"POST\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"path\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"/\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"headers\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: { `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"X-Amz-Target\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Textract.Get*\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"billable\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`false`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` ]`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`Names match case-insensitively; values are globs matched case-sensitively, with `,_jsx(_components.code,{children:`/`}),` as an ordinary character (`,_jsx(_components.code,{children:`application/x-amz-json-1.1`}),` is a valid literal).`]}),`\n`,_jsxs(_components.li,{children:[`Every listed header must be present and match. A route with no `,_jsx(_components.code,{children:`headers`}),` matches on method and path alone.`]}),`\n`,_jsxs(_components.li,{children:[`When the relay sets an `,_jsx(_components.a,{href:`/relays/configuration#extra-headers`,children:`extra header`}),` of the same name, the matcher sees the operator’s value, since that is what reaches the upstream.`]}),`\n`,_jsxs(_components.li,{children:[`A request that sends one header under two spellings (`,_jsx(_components.code,{children:`X-Amz-Target`}),` and `,_jsx(_components.code,{children:`x-amz-target`}),`) is refused with `,_jsx(_components.code,{children:`400`}),`.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`A matcher may not name a header callers never deliver to route matching: credentials (`,_jsx(_components.code,{children:`Authorization`}),`, `,_jsx(_components.code,{children:`x-api-key`}),`, the relay’s own `,_jsx(_components.code,{children:`auth.header_name`}),`), gateway headers (`,_jsx(_components.code,{children:`x-bf-*`}),`), hop-by-hop headers, `,_jsx(_components.code,{children:`Content-Length`}),`, and under `,_jsx(_components.code,{children:`aws_sigv4`}),` any `,_jsx(_components.code,{children:`x-amz-*`}),` header other than `,_jsx(_components.code,{children:`X-Amz-Target`}),`. Such a route is refused at save time.`]}),`\n`,_jsx(Heading,{level:`2`,id:`route-order`,children:`Route order`}),`\n`,_jsxs(_components.p,{children:[`The first matching route wins, so a literal path must come before a glob that also covers it: `,_jsx(_components.code,{children:`GET /files/latest`}),` before `,_jsx(_components.code,{children:`GET /files/*`}),`. A disabled route still matches, which is how it refuses a request rather than letting it fall through to a broader route or to `,_jsx(_components.strong,{children:`Relay Any Path`}),`.`]}),`\n`,_jsxs(_components.p,{children:[`The `,_jsx(_components.a,{href:`#import-routes-from-openapi`,children:`OpenAPI import`}),` sorts routes so that more specific ones come first.`]}),`\n`,_jsx(Heading,{level:`2`,id:`billable-by-default-post-only`,children:`Billable by default: POST only`}),`\n`,_jsxs(_components.p,{children:[`Unless a route says otherwise, only `,_jsx(_components.code,{children:`POST`}),` calls are counted. On most APIs `,_jsx(_components.code,{children:`GET`}),` and `,_jsx(_components.code,{children:`HEAD`}),` are polls and listings, `,_jsx(_components.code,{children:`PUT`}),` and `,_jsx(_components.code,{children:`PATCH`}),` update settings and `,_jsx(_components.code,{children:`DELETE`}),` cleans up; charging those would spend a caller’s allowance on nothing. A route never flips a method’s billing just by existing, which keeps imported route lists safe. Set `,_jsx(_components.code,{children:`billable: true`}),` where an API bills another method, and `,_jsx(_components.code,{children:`billable: false`}),` to relay a `,_jsx(_components.code,{children:`POST`}),` free of charge.`]}),`\n`,_jsxs(_components.p,{children:[`A call is counted (priced and charged to budgets) only when it is billable `,_jsx(_components.strong,{children:`and`}),` the upstream answers `,_jsx(_components.code,{children:`2xx`}),`. A `,_jsx(_components.code,{children:`4xx`}),` or `,_jsx(_components.code,{children:`5xx`}),` reply is relayed and not charged, but like every forwarded reply it still counts one request against the caller’s request rate limits.`]}),`\n`,_jsx(Heading,{level:`2`,id:`relay-any-path`,children:`Relay any path`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Relay Any Path`}),` (`,_jsx(_components.code,{children:`skip_route_check: true`}),`) relays requests that match no route instead of refusing them. Unrouted calls use the relay-level pricing and the method default for billing. Disabled routes still refuse their requests.`]}),`\n`,_jsx(Warning,{children:_jsx(_components.p,{children:`With Relay Any Path on, every path on the upstream is reachable with the relay’s credential. Prefer listing routes; use this switch for a trusted upstream or while discovering an API.`})}),`\n`,_jsx(Heading,{level:`2`,id:`import-routes-from-openapi`,children:`Import routes from OpenAPI`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Import OpenAPI`}),` in the route table turns an OpenAPI 3 or Swagger 2 document (pasted, uploaded or fetched from a URL, JSON or YAML) into routes. A URL is fetched by Bifrost, not the browser, with the same size cap and private-network guard as the `,_jsx(_components.a,{href:`/mcp/openapi-servers`,children:`MCP OpenAPI servers`}),`; the document is read once and not stored. Every operation becomes a route; `,_jsx(_components.code,{children:`{param}`}),` segments become `,_jsx(_components.code,{children:`*`}),`; AWS-style `,_jsx(_components.code,{children:`/#X-Amz-Target=Service.Op`}),` keys become a route on the path with an `,_jsx(_components.code,{children:`X-Amz-Target`}),` matcher. The preview also suggests an auth type and base URL, read from the document’s security schemes and servers (a relative server resolves against the URL the document was fetched from). The import changes only the routes, so review those suggestions and set them on the relay yourself.`]}),`\n`,_jsxs(_components.p,{children:[`The import is shown for review first: the dialog says how many routes will replace the current list and names any route with a pricing override or job that would be removed. Nothing changes until you choose `,_jsx(_components.strong,{children:`Apply import`}),`. Routes the document still lists keep their settings; new ones carry no pricing override, so they use the relay pricing and the method default for billing.`]}),`\n`,_jsx(Heading,{level:`2`,id:`next-steps`,children:`Next steps`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:_jsx(_components.a,{href:`/relays/pricing`,children:`Usage mapping and pricing`})}),` — Price the routes you listed.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:_jsx(_components.a,{href:`/relays/streaming`,children:`Streaming`})}),` — What the route’s stream flag changes.`]}),`\n`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Routes and header matchers","description":"List the upstream operations callers may use, match AWS-style operations by header, and decide which calls are counted, streamed or refused.","icon":"route","href":"/relays/routes"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Add a route","slug":"add-a-route","depth":2,"children":[]},{"title":"Path globs","slug":"path-globs","depth":2,"children":[]},{"title":"Header matchers","slug":"header-matchers","depth":2,"children":[]},{"title":"Route order","slug":"route-order","depth":2,"children":[]},{"title":"Billable by default: POST only","slug":"billable-by-default-post-only","depth":2,"children":[]},{"title":"Relay any path","slug":"relay-any-path","depth":2,"children":[]},{"title":"Import routes from OpenAPI","slug":"import-routes-from-openapi","depth":2,"children":[]},{"title":"Next steps","slug":"next-steps","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/bifrost/62ad9b1aea461302/googleTag.js","/_mintlify/custom/bifrost/c4c9272fd1c525e5/jsonLd.js","/_mintlify/custom/bifrost/5a8b9314a2dac891/supportWidget.js","/_mintlify/custom/bifrost/088e287583b748b0/baseUrlSwitcher.js","/_mintlify/custom/bifrost/aa532cead633d329/tally-embed.js","/_mintlify/custom/bifrost/fe58824b4f1a0ad5/footerCompliance.js"],"subdomain":"bifrost","siteName":"Bifrost","title":"Routes and header matchers - Bifrost","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-29T12:57:40.375Z","originalFileLocation":"relays/routes.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=\"List the upstream operations callers may use, match AWS-style operations by header, and decide which calls are counted, streamed or refused.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Bifrost\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/bifrost/kXIL-Qs6IzN4ZLK4/_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/bifrost/kXIL-Qs6IzN4ZLK4/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/bifrost/kXIL-Qs6IzN4ZLK4/_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/bifrost/kXIL-Qs6IzN4ZLK4/_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/bifrost/kXIL-Qs6IzN4ZLK4/_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/bifrost/kXIL-Qs6IzN4ZLK4/_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/bifrost/kXIL-Qs6IzN4ZLK4/_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/bifrost/kXIL-Qs6IzN4ZLK4/_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/bifrost/kXIL-Qs6IzN4ZLK4/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Routes and header matchers - Bifrost\">\u003cmeta data-mint-head property=\"og:description\" content=\"List the upstream operations callers may use, match AWS-style operations by header, and decide which calls are counted, streamed or refused.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Bifrost\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.getbifrost.ai/relays/routes\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://bifrost.mintlify.app/_mintlify/api/og/v2?division=Relays\u0026amp;title=Routes+and+header+matchers\u0026amp;description=List+the+upstream+operations+callers+may+use%2C+match+AWS-style+operations+by+header%2C+and+decide+which+calls+are+counted%2C+streamed+or+refused.\u0026amp;theme=4d1d84bec9a8c3ee0c7cd8ee\u0026amp;signature=f5ba57f2e3f6cf515c134d74a94fb88ba3377fdd0e5077d3258627d7cce39001\">\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=\"Routes and header matchers - Bifrost\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"List the upstream operations callers may use, match AWS-style operations by header, and decide which calls are counted, streamed or refused.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://bifrost.mintlify.app/_mintlify/api/og/v2?division=Relays\u0026amp;title=Routes+and+header+matchers\u0026amp;description=List+the+upstream+operations+callers+may+use%2C+match+AWS-style+operations+by+header%2C+and+decide+which+calls+are+counted%2C+streamed+or+refused.\u0026amp;theme=4d1d84bec9a8c3ee0c7cd8ee\u0026amp;signature=f5ba57f2e3f6cf515c134d74a94fb88ba3377fdd0e5077d3258627d7cce39001\">\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/bifrost/kXIL-Qs6IzN4ZLK4/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Bifrost\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#0C3B43\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.getbifrost.ai/relays/routes\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/relays/routes.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.getbifrost.ai/#organization\",\"name\":\"Bifrost\",\"url\":\"https://docs.getbifrost.ai\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/bifrost/qFMmk8bNSnvgFYDI/media/bifrost-logo.png?fit=max\u0026auto=format\u0026n=qFMmk8bNSnvgFYDI\u0026q=85\u0026s=6af701a560aee4103444fa017b226cf0\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.getbifrost.ai#website\",\"name\":\"Bifrost\",\"url\":\"https://docs.getbifrost.ai\",\"publisher\":{\"@id\":\"https://docs.getbifrost.ai/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.getbifrost.ai/relays/routes#webpage\",\"url\":\"https://docs.getbifrost.ai/relays/routes\",\"name\":\"Routes and header matchers\",\"description\":\"List the upstream operations callers may use, match AWS-style operations by header, and decide which calls are counted, streamed or refused.\",\"dateModified\":\"2026-10-29T12:57:40.375Z\",\"isPartOf\":{\"@id\":\"https://docs.getbifrost.ai#website\"},\"breadcrumb\":{\"@id\":\"https://docs.getbifrost.ai/relays/routes#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.getbifrost.ai/relays/routes#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Relays\",\"item\":\"https://docs.getbifrost.ai/relays/overview\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Routes and header matchers\",\"item\":\"https://docs.getbifrost.ai/relays/routes\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.getbifrost.ai/relays/routes#article\",\"headline\":\"Routes and header matchers\",\"name\":\"Routes and header matchers\",\"description\":\"List the upstream operations callers may use, match AWS-style operations by header, and decide which calls are counted, streamed or refused.\",\"url\":\"https://docs.getbifrost.ai/relays/routes\",\"mainEntityOfPage\":{\"@id\":\"https://docs.getbifrost.ai/relays/routes#webpage\"},\"dateModified\":\"2026-10-29T12:57:40.375Z\",\"publisher\":{\"@id\":\"https://docs.getbifrost.ai/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.getbifrost.ai#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Bifrost\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Bifrost","nav":{"global":{"anchors":[{"anchor":"Discord","icon":"discord","href":"https://discord.gg/exN5KAydbU"},{"anchor":"GitHub","icon":"github","href":"https://github.com/maximhq/bifrost"},{"anchor":"Try Enterprise","icon":"building","href":"https://www.getmaxim.ai/bifrost/enterprise"}]},"tabs":[{"tab":"OSS","icon":"book-open-cover","groups":[{"group":"Overview","icon":"book-open-cover","pages":[{"title":"Bifrost AI Gateway","icon":"bridge","href":"/overview"}]},{"group":"Quick Start","icon":"rocket","pages":[{"group":"Gateway","icon":"server","pages":[{"title":"Setting Up","icon":"play","href":"/quickstart/gateway/setting-up"},{"title":"Setting up auth","icon":"lock","href":"/quickstart/gateway/setting-up-auth"},{"title":"Provider Configuration","icon":"sliders","href":"/quickstart/gateway/provider-configuration"},{"title":"Streaming Responses","icon":"water","href":"/quickstart/gateway/streaming"},{"title":"Tool Calling","icon":"wrench","href":"/quickstart/gateway/tool-calling"},{"title":"Multimodal Support","icon":"images","href":"/quickstart/gateway/multimodal"},{"title":"Reranking","icon":"book-open-cover","href":"/quickstart/gateway/reranking"},{"title":"Decisions","icon":"scale-balanced","href":"/quickstart/gateway/decisions"},{"title":"Integrations","icon":"plug","href":"/quickstart/gateway/integrations"}]},{"group":"Bifrost CLI","icon":"laptop-code","pages":[{"title":"Bifrost CLI","sidebarTitle":"Overview","icon":"laptop-code","href":"/quickstart/cli/getting-started"},{"title":"OSS setup","icon":"server","href":"/quickstart/cli/oss-setup"},{"title":"Enterprise setup","icon":"building","href":"/quickstart/cli/enterprise-setup"},{"title":"Contexts and credentials","icon":"layer-group","href":"/quickstart/cli/contexts"},{"title":"Coding agents","icon":"terminal","href":"/quickstart/cli/coding-agents"},{"title":"Commands","icon":"list","href":"/quickstart/cli/commands"},{"title":"Troubleshooting","icon":"screwdriver-wrench","href":"/quickstart/cli/troubleshooting"}]},{"group":"Use as Go SDK","icon":"code","pages":[{"title":"Setting Up","icon":"play","href":"/quickstart/go-sdk/setting-up"},{"title":"Provider Configuration","icon":"sliders","href":"/quickstart/go-sdk/provider-configuration"},{"title":"Context Keys","icon":"key","href":"/quickstart/go-sdk/context-keys"},{"title":"Streaming Responses","icon":"water","href":"/quickstart/go-sdk/streaming"},{"title":"Tool Calling","icon":"wrench","href":"/quickstart/go-sdk/tool-calling"},{"title":"Multimodal Support","icon":"images","href":"/quickstart/go-sdk/multimodal"},{"title":"Reranking","icon":"book-open-cover","href":"/quickstart/go-sdk/reranking"},{"title":"Decisions","icon":"scale-balanced","href":"/quickstart/go-sdk/decisions"},{"title":"Logging","icon":"file-lines","href":"/quickstart/go-sdk/logger"}]}]},{"group":"Release Cadence","icon":"calendar","pages":[{"title":"Release Cadence","icon":"box-open","href":"/release-cadence"}]},{"group":"Migration Guides","icon":"arrow-up-right-dots","pages":[{"title":"Migrating to v2.0.0","href":"/migration-guides/v2.0.0"},{"title":"Migrating to v1.5.0","href":"/migration-guides/v1.5.0"}]},{"group":"Migrate from other Gateway","icon":"arrow-up","pages":[{"title":"Migrating from LiteLLM","icon":"train","href":"/migration-guides/litellm"}]},{"group":"SDK Integrations","icon":"plug","pages":[{"title":"What is an integration?","icon":"box","href":"/integrations/what-is-an-integration"}]},{"group":"Providers \u0026 Guides","icon":"solar-system","pages":[{"group":"Supported Providers","icon":"bars-progress","pages":[{"title":"Overview","icon":"circle-info","href":"/providers/supported-providers/overview"},{"title":"Anthropic","icon":"asterisk","href":"/providers/supported-providers/anthropic"},{"title":"Azure","icon":"microsoft","href":"/providers/supported-providers/azure"},{"title":"Azure Model Router","icon":"microsoft","href":"/providers/supported-providers/azure-model-router"},{"title":"AWS Bedrock","icon":"aws","href":"/providers/supported-providers/bedrock"},{"title":"AWS Bedrock Mantle","icon":"aws","href":"/providers/supported-providers/bedrock-mantle"},{"title":"BytePlus","icon":"b","href":"/providers/supported-providers/byteplus"},{"title":"Cerebras","icon":"c","href":"/providers/supported-providers/cerebras"},{"title":"Cloudflare","icon":"cloud","href":"/providers/supported-providers/cloudflare"},{"title":"Cohere","icon":"c","href":"/providers/supported-providers/cohere"},{"title":"Databricks","icon":"database","href":"/providers/supported-providers/databricks"},{"title":"DeepSeek","icon":"d","href":"/providers/supported-providers/deepseek"},{"title":"ElevenLabs","icon":"pause","href":"/providers/supported-providers/elevenlabs"},{"title":"Fireworks","icon":"sparkles","href":"/providers/supported-providers/fireworks"},{"title":"Google Gemini","icon":"diamond","href":"/providers/supported-providers/gemini"},{"title":"GitHub Copilot","icon":"github","href":"/providers/supported-providers/github-copilot"},{"title":"Groq","icon":"bolt","href":"/providers/supported-providers/groq"},{"title":"Hugging Face","icon":"face-smiling-hands","href":"/providers/supported-providers/huggingface"},{"title":"MiniMax","icon":"m","href":"/providers/supported-providers/minimax"},{"title":"Mistral","icon":"m","href":"/providers/supported-providers/mistral"},{"title":"Nebius","icon":"n","href":"/providers/supported-providers/nebius"},{"title":"Ollama","icon":"o","href":"/providers/supported-providers/ollama"},{"title":"OpenCode","icon":"code","href":"/providers/supported-providers/opencode"},{"title":"OpenAI","icon":"openai","href":"/providers/supported-providers/openai"},{"title":"OpenRouter","icon":"split","href":"/providers/supported-providers/openrouter"},{"title":"Parasail","icon":"p","href":"/providers/supported-providers/parasail"},{"title":"Perplexity","icon":"hexagon-nodes","href":"/providers/supported-providers/perplexity"},{"title":"Replicate","icon":"R","href":"/providers/supported-providers/replicate"},{"title":"Runware","icon":"https://mintlify.s3.us-west-1.amazonaws.com/bifrost/media/runware-nav.svg","href":"/providers/supported-providers/runware"},{"title":"Runway ML","icon":"film","href":"/providers/supported-providers/runway"},{"title":"Sarvam AI","icon":"s","href":"/providers/supported-providers/sarvam"},{"title":"SGLang","icon":"s","href":"/providers/supported-providers/sgl"},{"title":"TypeSafe","icon":"scale-balanced","href":"/providers/supported-providers/typesafe"},{"title":"Vertex AI","icon":"v","href":"/providers/supported-providers/vertex"},{"title":"vLLM","icon":"v","href":"/providers/supported-providers/vllm"},{"title":"Wafer","icon":"w","href":"/providers/supported-providers/wafer"},{"title":"xAI","icon":"x","href":"/providers/supported-providers/xai"}]},{"title":"Routing Rules","icon":"chart-diagram","href":"/providers/routing-rules"},{"title":"Provider Routing","icon":"route","href":"/providers/provider-routing"},{"title":"Session Affinity","icon":"link","href":"/providers/session-affinity"},{"title":"Aliasing Models","icon":"tag","href":"/providers/aliasing-models"},{"title":"Reasoning","icon":"brain","href":"/providers/reasoning"},{"title":"Performance Tuning","icon":"gauge-high","href":"/providers/performance"},{"title":"Custom Providers","icon":"gear","href":"/providers/custom-providers"},{"title":"Self-Hosted Decision Models","icon":"server","href":"/providers/self-hosted-decision-models"},{"title":"Custom Pricing","icon":"circle-dollar-to-slot","href":"/providers/custom-pricing"},{"title":"Request Options","icon":"list","href":"/providers/request-options"},{"title":"Response Headers","icon":"arrow-left-to-line","href":"/providers/response-headers"},{"title":"Test Harness Coverage","icon":"list-check","href":"/providers/test-harness-coverage"}]},{"group":"MCP Gateway","icon":"toolbox","pages":[{"title":"Overview","sidebarTitle":"Overview","icon":"circle-info","href":"/mcp/overview"},{"title":"Connecting to MCP Servers","sidebarTitle":"Connecting to Servers","icon":"plug","href":"/mcp/connecting-to-servers"},{"title":"OpenAPI Servers","sidebarTitle":"OpenAPI Specs","icon":"file-code","href":"/mcp/openapi-servers"},{"title":"Connections, States \u0026 Lifecycles","sidebarTitle":"Connections \u0026 States","icon":"diagram-project","href":"/mcp/connections"},{"title":"Virtual MCPs","icon":"layer-group","href":"/mcp/virtual-mcps"},{"group":"Authentication","icon":"shield-check","pages":[{"title":"MCP Authentication","sidebarTitle":"Overview","icon":"shield-check","href":"/mcp/auth/overview"},{"title":"No Authentication","sidebarTitle":"None","icon":"globe","href":"/mcp/auth/none"},{"title":"Header-Based Authentication","sidebarTitle":"Headers","icon":"key","href":"/mcp/auth/headers"},{"title":"Per-User Headers","sidebarTitle":"Per-User Headers","icon":"user-pen","href":"/mcp/auth/per-user-headers"},{"title":"OAuth 2.0 Authentication","sidebarTitle":"OAuth 2.0","icon":"lock","href":"/mcp/auth/oauth"},{"title":"Per-User OAuth","sidebarTitle":"Per-User OAuth","icon":"user-shield","href":"/mcp/auth/per-user-oauth"},{"title":"Token Exchange (On-Behalf-Of)","sidebarTitle":"Token Exchange","icon":"right-left","href":"/mcp/auth/token-exchange"},{"title":"Cross App Access (ID-JAG)","sidebarTitle":"Cross App Access","icon":"building-lock","href":"/mcp/auth/cross-app-access"}]},{"title":"MCP Sessions","sidebarTitle":"Sessions","icon":"table","href":"/mcp/sessions"},{"title":"Tool Execution","sidebarTitle":"Tool Execution","icon":"play","href":"/mcp/tool-execution"},{"title":"Agent Mode (Auto-Execution)","sidebarTitle":"Agent Mode","icon":"robot","href":"/mcp/agent-mode"},{"title":"Code Mode","sidebarTitle":"Code Mode","icon":"code","href":"/mcp/code-mode"},{"title":"Gateway Authentication","icon":"key","href":"/mcp/gateway-auth"},{"title":"Tool Hosting","sidebarTitle":"Tool Hosting","icon":"toolbox","href":"/mcp/tool-hosting"},{"title":"Tool Filtering","sidebarTitle":"Filtering","icon":"filter","href":"/mcp/filtering"}]},{"group":"Agent Gateway","icon":"robot","pages":[{"title":"Agent Gateway","sidebarTitle":"Overview","icon":"robot","href":"/features/agent-gateway/overview"},{"title":"Register your first agent","icon":"plus","href":"/features/agent-gateway/registration"},{"title":"Authentication","icon":"key","href":"/features/agent-gateway/authentication"},{"title":"Agent access","icon":"shield-check","href":"/features/agent-gateway/access-control"},{"title":"Messages, tasks, and events","icon":"comments","href":"/features/agent-gateway/messages-and-tasks"},{"title":"Connect model and tool calls","icon":"link","href":"/features/agent-gateway/integrating-your-agent"},{"title":"Read Agent Logs","icon":"magnifying-glass","href":"/features/agent-gateway/observability"},{"title":"Gateway settings and transports","icon":"gear","href":"/features/agent-gateway/configuration"},{"title":"Transport selection and recovery","icon":"arrows-rotate","href":"/features/agent-gateway/transports-and-recovery"},{"title":"Push notifications","icon":"bell","href":"/features/agent-gateway/push-notifications"},{"title":"Export agent telemetry","icon":"chart-line","href":"/features/agent-gateway/connectors"},{"title":"Troubleshooting","icon":"wrench","href":"/features/agent-gateway/troubleshooting"}]},{"group":"Relays","icon":"waypoints","pages":[{"title":"Relays","sidebarTitle":"Overview","icon":"circle-info","href":"/relays/overview"},{"title":"Create a relay","description":"Register an upstream API with its base URL and credential, then tune extra headers, timeouts, TLS and proxying.","icon":"plus","href":"/relays/configuration"},{"title":"Routes and header matchers","icon":"route","href":"/relays/routes"},{"title":"Usage mapping and pricing","description":"Price every counted relay call with a flat fee, a per-unit rate read from the request or response, and the cost the upstream reports; test the mapping before you save.","icon":"calculator","href":"/relays/pricing"},{"title":"Virtual key access","icon":"key","href":"/relays/access"},{"title":"Streaming","icon":"wave-square","href":"/relays/streaming"},{"title":"Relay Logs","icon":"magnifying-glass","href":"/relays/logs"},{"title":"Troubleshooting","icon":"wrench","href":"/relays/troubleshooting"}]},{"group":"Custom plugins","icon":"puzzle-piece","pages":[{"title":"Getting Started","icon":"book","href":"/plugins/getting-started"},{"title":"Building Dynamically Linked Bifrost Binary","icon":"hammer","href":"/plugins/building-dynamic-binary"},{"title":"Plugin Sequencing","icon":"arrow-down-1-9","href":"/plugins/sequencing"},{"group":"Writing Plugins","icon":"code","pages":[{"title":"Writing Go Plugins","icon":"golang","href":"/plugins/writing-go-plugin"},{"title":"Writing WASM Plugins (Deprecated)","icon":"puzzle-piece","href":"/plugins/writing-wasm-plugin"}]},{"title":"Plugin Migration Guide","icon":"arrow-up-right-dots","href":"/plugins/migration-guide"}]},{"group":"Open Source Features","icon":"bolt","pages":[{"title":"Drop-in Replacement","icon":"shuffle","href":"/features/drop-in-replacement"},{"title":"Retries \u0026 Fallbacks","icon":"list-check","href":"/features/retries-and-fallbacks"},{"title":"Complexity Router","tag":"Beta","icon":"sliders","href":"/features/complexity-router"},{"title":"Warp","tag":"Alpha","icon":"sparkles","href":"/features/warp"},{"title":"Compatibility Plugin","icon":"train","href":"/features/compat-plugin"},{"title":"Load Balance","icon":"scale-balanced","href":"/features/keys-management"},{"title":"Async Inference","icon":"clock","href":"/features/async-inference"},{"title":"Webhooks","icon":"webhook","href":"/features/webhooks"},{"title":"News Feeds","icon":"newspaper","href":"/features/news-feeds"},{"group":"Governance","icon":"user-lock","pages":[{"title":"Virtual Keys","icon":"key","href":"/features/governance/virtual-keys"},{"title":"Routing","icon":"arrow-progress","href":"/features/governance/routing"},{"title":"Budget and Limits","icon":"money-bills","href":"/features/governance/budget-and-limits"},{"title":"Model Limits","icon":"sliders","href":"/features/governance/model-limits"},{"title":"MCP Tool Filtering","icon":"grid-2","href":"/features/governance/mcp-tools"},{"title":"Required Headers","icon":"shield-check","href":"/features/governance/required-headers"}]},{"title":"Telemetry","icon":"gauge","href":"/features/telemetry"},{"title":"OpenTelemetry","icon":"telescope","href":"/features/otel"},{"title":"Content Logging","icon":"eye-slash","href":"/features/observability/content-logging"},{"title":"Latency \u0026 Overhead Breakdown","icon":"gauge","href":"/features/observability/latency-breakdown"},{"title":"Semantic Caching","icon":"database","href":"/features/semantic-caching"},{"title":"Auto Prompt Caching","icon":"zap","href":"/features/prompt-caching"},{"title":"Skills Repository","icon":"book","href":"/features/skills-repository"},{"group":"Prompt Repository","icon":"folder","pages":[{"title":"Playground","icon":"square-terminal","href":"/features/prompt-repository/playground"},{"title":"Prompts plugin","icon":"puzzle-piece","href":"/features/prompt-repository/prompts-plugin"}]},{"group":"Plugins","icon":"puzzle-piece","pages":[{"title":"Mocker","icon":"mask","href":"/features/plugins/mocker"},{"title":"JSON Parser","icon":"code-branch","href":"/features/plugins/jsonparser"}]}]}]},{"tab":"Enterprise","icon":"building","pages":[{"title":"Enterprise","href":"/enterprise/overview"}]},{"tab":"Edge","icon":"globe","pages":[{"title":"Edge","href":"/edge/overview"}]},{"tab":"Integrations","icon":"plug","pages":[{"title":"Integrations","href":"/runbooks/claude-code-bedrock"}]},{"tab":"Deployment Guides","icon":"server","pages":[{"title":"Deployment Guides","href":"/deployment-guides/overview"}]},{"tab":"API","icon":"code","pages":[{"title":"API","href":"/api/procuring-api-keys"}]},{"tab":"Contributing","icon":"code-pull-request","pages":[{"title":"Contributing","href":"/contributing/setting-up-repo"}]},{"tab":"Benchmarks","icon":"chart-line","pages":[{"title":"Benchmarks","href":"/benchmarking/getting-started"}]},{"tab":"Changelogs","icon":"bolt","menu":[{"item":"Open Source","icon":"rocket","pages":[{"title":"Open Source","href":"/changelogs/v2.3.2"}]},{"item":"Enterprise","icon":"building","pages":[{"title":"Enterprise","href":"/changelogs/ent-v2.3.2"}]},{"item":"Edge","icon":"grip","pages":[{"title":"Edge","href":"/changelogs/edge-v0.9.4"}]},{"item":"Bifrost CLI","icon":"laptop-code","pages":[{"title":"Bifrost CLI","href":"/changelogs/cli-v1.0.0"}]},{"item":"Helm","icon":"box","pages":[{"title":"Helm","href":"/changelogs/helm-v2.1.46"}]}],"pages":[{"title":"Changelogs","href":"/changelogs/v2.3.2"}]}]},"title":"Routes and header matchers - Bifrost","buildId":"dpl_2xiSHD9XEvLsPGPcfoMtkLTB3dy9","deploymentId":"dpl_2xiSHD9XEvLsPGPcfoMtkLTB3dy9","dynamics":[],"chunks":[]}