ChatGPT, Codex и GLM через один API.
Model.sale предоставляет привычный OpenAI-совместимый base URL для ChatGPT-совместимых моделей GPT, клиентов Codex, GLM и DeepSeek. Храните ключ на сервере, используйте ID live-модели и смотрите ID запроса и usage в каждом ответе.
/v1/responses.Authorization: Bearer ms_live_…. Ключи показываются один раз и отзываются в кабинете.GET /v1/models. Запрос никогда не перенаправляется молча на другую модель.Endpoints
| Метод | Путь | Назначение |
|---|---|---|
| GET | /v1/models | Опубликованный live-каталог |
| GET | /v1/models/{id} | Одна доступная модель (OpenAI models.retrieve) |
| GET | /v1/catalog | Полный реестр с ценами и статусом live/недоступна |
| POST | /v1/responses | Responses, JSON и SSE (GPT/Codex) |
| POST | /v1/chat/completions | Chat Completions, JSON и SSE (GPT/GLM/DeepSeek) |
| POST | /v1/messages | Только когда опубликована проверка Anthropic Messages |
/v1/models намеренно содержит только модели, допущенные к клиентскому трафику прямо сейчас. /v1/catalog оставляет видимыми все ID с ценой вместе с результатом проверки и поддерживаемыми endpoints, включая модели, которые прошли live-проверку, но ещё ждут аудированной публикации цены и маржи. Модель допускается только после свежей JSON/SSE-проверки, итогового usage и одобрения публикации; её никогда не подменяют молча.Возможности протоколов
Смотрите актуальные supported_endpoints каждой модели в /v1/catalog. Для Codex нужна live-модель с /v1/responses; GLM и DeepSeek сейчас используют /v1/chat/completions. ID Claude остаются видимыми, когда у них есть цена, но доступ по Messages включается только после прохождения проверки.
Минимальный запрос Responses
Актуальный опубликованный пример для Responses: gpt-5.5. Убедитесь, что он всё ещё есть в GET /v1/models.
curl https://api.model.sale/v1/responses \
-H "Authorization: Bearer $MODEL_SALE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"gpt-5.5","input":"Reply exactly OK"}'Стриминг
Установите stream: true. Потоки Responses завершаются терминальным событием response, потоки Chat Completions — [DONE]. Шлюз добавляет x-model-sale-request-id в каждый ответ. Usage нужен для точного списания; неполный usage помечается для сверки.
Аутентификация
Передавайте ключ как Authorization: Bearer ms_live_… (SDK OpenAI, Codex) или x-api-key: ms_live_… (SDK Anthropic). Браузерные приложения могут обращаться к API напрямую: CORS включён для /v1/* без cookies. Передавайте ключ только в тот браузер, который вы контролируете.
Ошибки и лимиты
Ошибки имеют формат OpenAI {"error":{"message","type","param","code"}} (формат Anthropic на /v1/messages). type — категория, code — конкретная причина.
| Статус | type | Типичный code | Что делать |
|---|---|---|---|
| 400 | invalid_request_error | invalid_json, model_required | Исправьте тело запроса; сообщение указывает на проблему. |
| 401 | authentication_error | invalid_api_key | Проверьте ключ или создайте новый в кабинете. |
| 402 | insufficient_quota | insufficient_balance | Пополните баланс в разделе Billing и повторите. |
| 403 | permission_error | model_not_allowed, ip_not_allowed | Измените ограничения ключа по моделям или IP. |
| 404 | not_found_error | model_not_found | Используйте ID из GET /v1/models. |
| 413 | invalid_request_error | request_too_large | Тела запросов ограничены 8 МБ. |
| 429 | rate_limit_error | rate_limit_exceeded, spend_limit_exceeded | Подождите Retry-After секунд или увеличьте лимиты ключа. |
| 502/503 | server_error | upstream_error, model_unavailable | Повторите с задержкой; неудачные запросы не списываются. |