ChatGPT, Codex e GLM em uma única API.
O Model.sale expõe uma base URL familiar, compatível com OpenAI, para GPT compatível com ChatGPT, clientes Codex e modelos GLM. Mantenha sua key no servidor, use um model ID ativo e confira o request ID e o usage retornado em cada chamada.
/v1/responses.Authorization: Bearer ms_live_…. As keys são exibidas uma única vez e podem ser revogadas no dashboard.GET /v1/models. Um request nunca é roteado silenciosamente para outro modelo.Endpoints
| Método | Caminho | Finalidade |
|---|---|---|
| GET | /v1/models | Catálogo ativo publicado |
| GET | /v1/models/{id} | Um modelo chamável (OpenAI models.retrieve) |
| GET | /v1/catalog | Registro completo com preços e status ativo/indisponível |
| POST | /v1/responses | Responses em JSON e SSE (GPT/Codex) |
| POST | /v1/chat/completions | Chat Completions em JSON e SSE (GPT/GLM) |
| POST | /v1/messages | Somente quando a validação do Anthropic Messages for publicada |
/v1/models contém intencionalmente apenas os modelos liberados para tráfego de clientes neste momento. O /v1/catalog mantém visível todo ID com preço, junto do resultado do probe e dos endpoints suportados, incluindo modelos que passaram na checagem em tempo real mas ainda aguardam a publicação auditada de preço/margem. Um modelo só é liberado após uma nova checagem de JSON/SSE, do usage final e da aprovação da publicação; ele nunca é substituído silenciosamente.Capacidades do protocolo
Use /v1/catalog para ver os supported_endpoints atuais de cada modelo. O Codex exige um modelo ativo com /v1/responses; o GLM atualmente usa /v1/chat/completions. Os IDs do Claude continuam visíveis quando precificados, mas o acesso a Messages só é habilitado depois que a validação dele passa.
Request mínimo de Responses
Exemplo atual de modelo Responses publicado: codex-auto-review. Confirme se ele ainda aparece em GET /v1/models.
curl https://api.model.sale/v1/responses \
-H "Authorization: Bearer $MODEL_SALE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"codex-auto-review","input":"Hello"}'Streaming
Defina stream: true. Streams de Responses terminam com um evento de resposta terminal; streams de Chat Completions terminam com [DONE]. O gateway adiciona x-model-sale-request-id a toda resposta. O usage é obrigatório para uma cobrança exata; usage incompleto é marcado para reconciliação.
Autenticação
Envie a key como Authorization: Bearer ms_live_… (SDKs da OpenAI, Codex) ou x-api-key: ms_live_… (SDKs da Anthropic). Apps de browser podem chamar a API diretamente: o CORS está habilitado para /v1/* sem cookies — só envie uma key para um browser que você controla.
Erros e limites
Os erros usam o formato da OpenAI {"error":{"message","type","param","code"}} (formato da Anthropic em /v1/messages). type é a categoria e code o motivo específico.
| Status | Tipo | Código típico | O que fazer |
|---|---|---|---|
| 400 | invalid_request_error | invalid_json, model_required | Corrija o corpo da requisição; a mensagem indica o problema. |
| 401 | authentication_error | invalid_api_key | Verifique a key ou crie uma nova no dashboard. |
| 402 | insufficient_quota | insufficient_balance | Faça uma recarga em Faturamento e tente novamente. |
| 403 | permission_error | model_not_allowed, ip_not_allowed | Ajuste as restrições de modelo ou de IP da key. |
| 404 | not_found_error | model_not_found | Use um ID de GET /v1/models. |
| 413 | invalid_request_error | request_too_large | Os corpos das requisições são limitados a 8 MB. |
| 429 | rate_limit_error | rate_limit_exceeded, spend_limit_exceeded | Aguarde Retry-After segundos ou aumente os limites da key. |
| 502/503 | server_error | upstream_error, model_unavailable | Tente novamente com backoff; requisições com falha não são cobradas. |