Skip to main content
Manifest exposes both OpenAI and Anthropic-format endpoints on one proxy. Point your client at the Manifest URL, send auto as the model, and routing picks the real model behind the scenes.

Base URL

Authentication

Every request requires a Manifest harness key:
Generate a key from the dashboard’s Harnesses page. Keys always start with mnfst_.

Endpoints

The proxy translates between formats internally, so you can send an OpenAI-shaped request and Manifest will reshape it before forwarding to an Anthropic-only model. The reverse works too. Translation carries what the request itself contains: messages, tools, and tool results. Manifest does not resolve previous_response_id, so send the full conversation in input on every /v1/responses request.

Chat completions

Manifest adapts the body to the provider it picked. It replaces model with the real model ID. It converts the body to the format that provider expects. It renames parameters the provider spells differently, like max_tokens and max_completion_tokens. And it merges the model parameters saved on your harness into every attempt. Some fields only exist at OpenAI: stream_options, reasoning_effort, modalities, audio, and prediction. Those reach OpenAI and OpenRouter. Every other provider gets the request without them, and nothing warns you.

Anthropic messages

Listing models

GET /v1/models returns the models your harness can reach, in OpenAI format. The first entry is always auto (routing); the rest are the real model IDs from your connected providers.
Send auto to let Manifest route, or send any listed model ID to skip routing and go straight to that provider. If you send a model ID that no connected provider can serve, Manifest returns M302: Model not available. See Routing → Route a specific model.

Inspect model capabilities

Add ?capabilities=true to include known capability metadata for each concrete model. Without this query parameter, the response keeps the standard OpenAI model-list shape.
Capability fields are optional. A missing field means that support is unknown, not that the model does not support it. Manifest omits the entire capabilities object when it has no known metadata for a model. The synthetic auto model never includes capabilities because it can resolve to a different model for each request. Concrete model IDs remain directly routable exactly as listed, including IDs with the -subscription suffix.

Inspect model costs

Add ?cost=true to include known token prices for each concrete model. Prices are in USD per million tokens. Without this query parameter, the response keeps the standard OpenAI model-list shape.
A zero value means the model has no per-token charge, as with some free or subscription-backed routes. If one price is unknown, Manifest omits only that field. If both prices are unknown, Manifest omits the entire cost object. The synthetic auto model never includes cost because its concrete model is selected for each request. To inspect both metadata types in one response, combine the query parameters: ?capabilities=true&cost=true.

Streaming

Set "stream": true to get an SSE stream back. The stream format matches the upstream protocol: OpenAI-style data: {...} chunks for /v1/chat/completions, Anthropic event blocks for /v1/messages. Routing and fallback both work with streams. If the primary model fails before the first chunk, the request restarts on the fallback. If it fails mid-stream, the connection closes. There’s no silent mid-stream retry.

Errors

Errors come in two shapes, depending on the caller. A tool or SDK call gets a real HTTP status and the JSON envelope below. A chat or streaming client gets an HTTP 200 that looks like a normal completion, and the error text sits inside the assistant message.
error.code is a string identifier, never the numeric HTTP status. A hard limit block (M200) is not in this table: it comes back as an HTTP 200 chat completion whose assistant message carries the block text. When the fallback chain is exhausted, the response keeps the primary model’s real error status and carries X-Manifest-Fallback-Exhausted: true; the body keeps the provider’s own error code, or fallback_exhausted when there is none.

Rate limits

The gateway enforces three caps. A workspace can send 200 requests per minute (M201). An IP can send 500 requests per minute (M202). A workspace can have 10 requests in flight at once (M203). The caps are the same on Cloud and self-hosted. No setting changes them. Your Cloud plan sets your monthly request quota (M204). The per-minute caps stay the same on every plan.

Response headers

Routed responses carry routing headers. They tell your client which model and tier handled the request, with no need to parse the response body. A request rejected before routing (bad key, quota, rate limit) carries none.