Most teams reach GPT Image 2.5 through something in between rather than OpenAI’s own endpoint, and that something gets one label: third-party access.

The label hides three arrangements that behave nothing alike, and they decide who checks your credentials, whose quota you spend, who invoices you and where prompts land. The GPT Image 2.5 overview covers the model.

The three kinds of third party

Azure OpenAI is another first-party host of the same model. OpenRouter is a multi-model aggregator: one account, many providers behind it. A self-hosted proxy like LiteLLM or Cloudflare AI Gateway is yours to run. The schematic shows it: a small block on the left, a connector to a larger block in the middle, three destinations on the right.

Flat schematic: one small block on the left, a connector to a larger block in the middle, and three destination blocks fanned out on the right
Another hostAggregatorSelf-hosted proxy
What you addressA deploymentOne endpointYour proxy URL
Upstream contractThe hostThe aggregatorYou
What you operateDeployment configRoutingThe proxy and its logs

No per-image price for GPT Image 2.5 is published on any of their pages.

Why the split matters

Four responsibilities move with the hop.

  • Credential custody
  • Quota ownership
  • The invoice layer
  • Data retention

Where authentication actually happens

The Azure image endpoint takes one required api-key header, or an Entra ID token. OpenRouter takes Authorization: Bearer with an OpenRouter key; it holds the provider keys.

Checked byKey lives
Azure OpenAIMicrosoftYour Azure subscription
OpenRouterOpenRouterWith OpenRouter
A self-hosted proxyYour proxyWith you, or with the gateway

Cloudflare AI Gateway documents three placements: unified billing, a stored key inserted at runtime, or the pass-through header. Direct-API shapes are in the API overview.

Who owns the quota and the bill

Each arrangement bills a different party at a different layer; only one publishes numbers.

OpenRouter’s FAQ states a 5.5% fee with a $0.80 minimum on credit purchases, and no markup on inference pricing. Free-model limits are 50 requests per day, 1,000 at 10 purchased credits.

Azure bills as its own service against its own price list, with no per-image rate on the reachable page.

A self-hosted proxy bills at whichever upstream you route to; the free access limits cover the first-party side.

Response bodies and model ids

OpenRouter’s model list contains openai/gpt-image-2.5-sunburst and openai/gpt-image-2.5-flare. Its endpoint returns base64 bytes in data[].b64_json, plus media_type and a usage object carrying the cost. There is no url field.

Identifier you sendWhat comes back
OpenRouteropenai/gpt-image-2.5-sunburst or -flareBase64 in data[].b64_json
Azure OpenAIDeployment GPT-Image-2.5-Sunburst or -FlareImage output, format undocumented
A self-hosted proxyWhatever the upstream expectsWhatever the upstream returns

A widely copied snippet reads response.data[0].url and sends openai/gpt-image-2.5 with no suffix. Both are wrong.

Azure inverts the naming: you call a deployment you named yourself, and both variants are generally available. Its api-version on the reachable page belongs to the earlier DALL·E generation, so the value for GPT Image 2.5, response_format, quality and style are unverified here.

Failure, retry and billing

OpenRouter describes image generation billing as all-or-nothing: if generation fails or is cancelled, the endpoint returns 502 Bad Gateway and nothing is charged.

  • A failed attempt is not billed
  • No idempotency key is documented
  • Switching provider changes what you debug

The provider.allow_fallbacks field sets that: false stops after the primary provider. Portkey estimates its own gateway adds 20-40ms against direct calls.

Retrying without double billing

A retry costs nothing beyond time, but another provider may serve it. Pin provider.order and turn fallbacks off where a provider matters. To fix one region instead of rerolling, use comment editing.

Where your data lands

The request must be legible somewhere in the middle; that is what procurement asks.

OpenRouter describes itself as a proxy: it logs basic request metadata, prompts and completions are not logged by default, and providers that log or won’t confirm their policy are not routed to.

Cloudflare AI Gateway lists analytics, logging and caching among its features, so switching them on decides whether prompts and images are stored.

Portkey describes itself as ISO 27001 and SOC 2 certified and GDPR and HIPAA compliant, with an option to store no bodies: claims to verify.

Two runnable examples

Example one: the aggregator

This call sends the suffixed model id and decodes the base64 field; there is no URL to read.

# OpenRouter: generate one image, then decode data[0].b64_json (there is no .url field)
curl -s https://openrouter.ai/api/v1/images \
  -H "Authorization: Bearer $OPENROUTER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"openai/gpt-image-2.5-sunburst","prompt":"A wide shot of a family looking up at a vast cylindrical habitat, retro-futurist illustration, teal and cream palette.","n":1}' \
  -o out.json

python3 -c "import base64,json,pathlib; d=json.load(open('out.json')); print('cost', d['usage']['cost']); pathlib.Path('out.png').write_bytes(base64.b64decode(d['data'][0]['b64_json']))"

Example two: the managed endpoint

This call addresses a deployment by name and authenticates with the api-key header. The api-version stays a placeholder: the reachable page documents an earlier one.

# Azure OpenAI: call a deployment by name; the api-version for GPT Image 2.5 is not published
curl -s "https://${AZURE_OPENAI_ENDPOINT}/openai/deployments/GPT-Image-2.5-Sunburst/images/generations?api-version=${AZURE_OPENAI_API_VERSION}" \
  -H "api-key: ${AZURE_OPENAI_KEY}" \
  -H "Content-Type: application/json" \
  -d '{"prompt":"A wide shot of a family looking up at a vast cylindrical habitat, retro-futurist illustration, teal and cream palette.","n":1,"size":"1024x1024"}' \
  -o out.json

Azure documents both variants as generally available and a custom WIDTHxHEIGHT size: 16px multiples, aspect 1:3 to 3:1, side up to 3840px, total 655,360 to 8,294,400 pixels, above 2560x1440 experimental. Feeding a reference image is the workflow in combining images.

Frequently asked questions

  • Is one of these cheaper? No per-image price is published, so compare structure: the aggregator fee sits on credits, the managed host bills as a service, a proxy adds an upstream meter.
  • Can the same code move between them? Not unchanged: the identifier, header name and response field differ.
  • Does one key cover everything? No. The credential belongs to the gateway; the upstream key is a separate object.
  • Which should I pick? That depends on which responsibility you want in house.