Skip to main content
Manifest reads a few request headers, and returns a set of X-Manifest-* response headers so clients can see what happened without parsing the response body.

Request headers

HeaderValueEffect
AuthorizationBearer mnfst_<key>Required. Authenticates the agent.
Content-Typeapplication/jsonRequired.
anthropic-version2023-06-01Required for /v1/messages. Forwarded to the upstream.
Your custom tier headeryour valueRoutes the request to a custom tier. You set the key and value when you create the tier, so the exact header name is up to you.
x-session-keyany stringGroups requests into a session. Manifest keeps a session on the same upstream where the provider supports it, for sticky routing and prompt caching.
The custom tier header is the only one that changes routing: send the header you configured on a tier and the request goes to that tier’s model. See Routing → Custom.

Response headers (every request)

HeaderDescriptionExample
X-Manifest-TierThe tier that handled the request: default, a custom tier’s name, or directdefault
X-Manifest-ModelModel that actually served the responseclaude-sonnet-4-6
X-Manifest-ProviderUpstream provideranthropic
X-Manifest-ReasonWhy that route was picked: default, header-match, or directheader-match
X-Manifest-Output-ModalityOutput modality of the responsetext
X-Manifest-Response-ModeWhether the response was streamed or bufferedbuffered

Response headers (fallback only)

When the primary model fails and Manifest succeeds on a fallback, two extra headers are added:
HeaderDescriptionExample
X-Manifest-Fallback-FromThe primary model that was attempted firstgpt-5
X-Manifest-Fallback-IndexPosition in the fallback chain (0 = first fallback)0
When every model in the chain fails:
HeaderDescription
X-Manifest-Fallback-ExhaustedSet to true. Response status is 424.

Reading headers in code

const response = await fetch("http://localhost:2099/v1/chat/completions", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.MANIFEST_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    model: "auto",
    messages: [{ role: "user", content: "Hello" }],
  }),
});

console.log(response.headers.get("x-manifest-tier")); // → "default"
console.log(response.headers.get("x-manifest-model")); // → "gpt-5-mini"
console.log(response.headers.get("x-manifest-provider")); // → "openai"
Header names are case-insensitive in HTTP, but most browser fetch implementations lowercase them when reading. The proxy emits them as X-Manifest-*.