The /v1/responses route: what it is and which ids use it

Six of the eight OpenAI ids here answer on POST /v1/responses with a Bearer token. Two do not. Here is how the route is decided, and what it means for switching models.

Route is a property of the model, not the provider

Each model in the catalog records its own apiRoute, and the gateway exposes three request shapes for text: /v1/responses, /v1/messages and /v1/chat/completions. Which one a model answers on is a field on that model, so "it is an OpenAI model" is not enough to tell you the endpoint.

For the OpenAI family the split is six to two. gpt-5.6-sol, gpt-5.6-terra, gpt-5.6-luna, gpt-5.5, gpt-5.4 and gpt-5.4-mini all answer on /v1/responses. stable-gpt-6-astra answers on /v1/messages, and gpt-image-2 answers on /v1/images/generations.

The auth header follows the shape rather than the vendor: responses-shaped and chat-completions-shaped requests use Authorization: Bearer $TOKEN_SHARE_KEY, and /v1/messages uses x-api-key plus an anthropic-version header. That is why stable-gpt-6-astra takes different headers from its own siblings.

The minimum responses-shaped request: model plus input, with a Bearer token.
export TOKEN_SHARE_KEY="<your-pool-api-key>"

curl -sS https://token-share.app/v1/responses \
  -H "Authorization: Bearer $TOKEN_SHARE_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-5.6-terra",
    "input": "Hello"
  }'

What the request looks like

A responses-shaped call is a POST to https://token-share.app/v1/responses carrying a JSON body with a model field and an input field, under an Authorization: Bearer header and Content-Type: application/json. That is the whole minimum.

Compare it with the other two shapes to see where the differences bite. An Anthropic-shaped call to /v1/messages takes a messages array instead of input, requires max_tokens, and swaps the Bearer header for x-api-key plus anthropic-version. A chat-completions call takes a messages array under a Bearer header and does not require max_tokens.

So moving between /v1/responses ids is a change to one field, while moving between route shapes means editing the endpoint, the auth header and the body together. Worth knowing before you write an abstraction that assumes one shape covers a provider.

Practical consequences when picking an id

A client library or CLI configured for the responses wire format reaches six of the eight OpenAI ids and stops at the other two. Codex CLI is the common case: set wire_api to "responses" and any of those six is a --model flag away, while stable-gpt-6-astra needs a client that speaks the Anthropic message format instead.

The six on /v1/responses are not interchangeable in every respect, though the request is. Context is 372,000 tokens on the three GPT 5.6 ids and 272,000 on gpt-5.5, gpt-5.4 and gpt-5.4-mini; output ceilings are 128,000 and 64,000 respectively. Those limits, not the route, are what usually decides whether a substitution actually works.

Effective per-token rates across the six span from $0.06 / $0.36 per million on gpt-5.6-luna to $0.50 / $3.00 on gpt-5.6-sol and gpt-5.5. Because the request shape is identical, you can route a slice of live traffic to a second id and compare cost and output on real requests rather than deciding from the table.

Common questions

Which auth header does /v1/responses want?
Authorization: Bearer $TOKEN_SHARE_KEY. The x-api-key header belongs to the Anthropic-shaped /v1/messages route, which also wants an anthropic-version header — worth remembering if you are switching a client between the two shapes.
Do all OpenAI models here use /v1/responses?
Six of the eight do: gpt-5.6-sol, gpt-5.6-terra, gpt-5.6-luna, gpt-5.5, gpt-5.4 and gpt-5.4-mini. stable-gpt-6-astra records /v1/messages and gpt-image-2 records /v1/images/generations. Check the route field on the model page rather than inferring it from the provider.
Can I send a chat-completions body to /v1/responses?
They are different request shapes. A responses call carries model and input; a chat-completions call carries model and a messages array and is the route Grok and Gemini ids answer on. Match the body to the route recorded for the model you are calling.