Стандарт для продавцов
Здесь всё, что биржа ждёт от вашего API. Правила одни для всех продавцов: никто не получает отдельной ветки в коде, отличия описываются настройками. Если API уже говорит на языке OpenAI или Anthropic, большая часть страницы про вас и так верна. Остаётся проверить ошибки, ручку здоровья и цены.
Коротко:
- успех — 2xx и
usageв ответе, иначе нечем посчитать вызов; - ошибка — честный HTTP-статус, не 200 с кодом в теле;
- 401 и 403 — только когда сломан ваш ключ, а не запрос покупателя;
- бесплатная ручка здоровья:
GET, который ничего не стоит; - своей себестоимости в ответе не показывайте: мы её всё равно вырежем.
Прежде чем подключаться
Стандарт — техническая часть. Отношения с площадкой определяют условия для продавцов (агентский договор): площадка продаёт ваши вызовы как агент, от своего имени и за ваш счёт.
- Продавцом может быть российская компания, индивидуальный предприниматель или самозанятый. Самозанятый продаёт только собственный API, а не перепродаёт чужой сервис. Иностранные лица и нерезиденты подключаются только по отдельному соглашению.
- В карточке Предложения покупателям показываются ваше наименование или фамилия, имя, отчество, ИНН, ОГРН или ОГРНИП, а у компаний и предпринимателей и адрес — этого требует закон о защите прав потребителей. Заполните их в реквизитах кабинета.
- Вы подтверждаете, что вправе продавать доступ к API. Если он построен на чужом сервисе, будьте готовы показать основание.
- Страна обработки и страна маршрута в Предложении должны быть настоящими: по ним покупатель решает, можно ли отправлять вам данные.
- Раз в месяц вы получаете отчёт агента: оборот, вознаграждение площадки, возвраты, начислено, выплачено и остаток. Самозанятый формирует чек до 9-го числа следующего месяца и передаёт его площадке; следующая выплата — после чека.
- Выплата — по заявке из кабинета, в течение 10 рабочих дней после проверки. Выручка за вызовы, которые ещё проверяются, до конца проверки не выводится.
- Если в запросах встречаются персональные данные, вы обрабатываете их только для ответа на вызов и не используете для обучения моделей.
1. Как биржа зовёт ваш API
Покупатель шлёт запрос на биржу своим ключом ApiHub. Шлюз проверяет ключ, лимит и остаток и передаёт запрос вам: тот же метод, путь, строку запроса и тело, что прислал покупатель, на ваш базовый адрес.
Покупатель: POST https://hub.gnzs.pro/g/v1/{ваш-api}/v1/chat/completions
Вам: POST {ваш базовый адрес}/v1/chat/completions
- Ключ. Ключ покупателя к вам не уходит. Шлюз подставляет ваш — тем способом, что выбран в кабинете:
Authorization: Bearer, свой заголовок, параметр строки запроса, Basic или OAuth2 client credentials. - Модель. Имя модели в теле не подменяется: покупатель пишет ровно то, что понимаете вы, например
openai/gpt-oss-20b. - Агрегатор. Запрос без продавца в пути (
/g/v1/chat/completions) биржа отдаёт одному из продавцов модели — по цене, скорости и аптайму. На 5xx, 429 и обрыве связи она уходит к следующему. Поэтому от честного кода ошибки зависит, получит ли покупатель ответ. - Поток. SSE проксируется как есть. Пока от вас не пришло содержимое, ошибка в потоке ещё позволяет уйти к другому продавцу, после — уже нет.
- Срок. У каждого эндпойнта свой срок ответа, он задаётся в кабинете. Не пришли заголовки за этот срок — вызов считается вашим таймаутом.
- Размер. Запрос больше 32 МБ биржа отклонит сама, до вас он не дойдёт. Большой ответ отдаётся потоком.
- Покупатель ушёл. Если он закрыл соединение до вашего ответа, мы отменяем запрос к вам, и денег никто не платит. Если после — дочитываем ваш ответ до
usage, и вызов оплачивается. - Адрес. Базовый адрес должен быть публичным. Во внутренние сети шлюз не ходит.
- Колбэки продавца покупателю не передаются — результат отдаёт биржа. Поле колбэка в запросе (
callBackUrl,webhook_urlи похожие) до вас не дойдёт: шлюз его вырезает. Результат покупатель получает от биржи: опросом задания по id или вебхуком биржи о готовности (task.completed,task.failed, подписан HMAC) — адрес он задаёт в кабинете, «Настройки» → «Вебхук». Файлы результата к этому моменту уже скопированы в хранилище биржи. Если без колбэка ваш API задание не принимает, скажите нам: поле будет отклоняться сразу, с понятной покупателю ошибкойunsupported_field.
2. Ответ и usage
Деньги берутся только за ответ 2xx, и только по тому, что вы сами в нём написали. Для моделей это токены в usage. Какую форму вы отдаёте, указывается в предложении (диалект usage), а не угадывается по ответу: разница между диалектами в том, считается ли кэш внутри входа, и ошибка здесь — это деньги.
openai — Chat Completions
Кэш внутри prompt_tokens: вход по полной цене — это prompt_tokens − cached_tokens.
{
"usage": {
"prompt_tokens": 1200,
"completion_tokens": 350,
"prompt_tokens_details": { "cached_tokens": 1000 }
}
}
В потоке usage приходит последним кадром перед [DONE].
responses — OpenAI Responses
Тоже кэш внутри входа. В потоке usage лежит в событии response.completed, внутри response.
{
"usage": {
"input_tokens": 1200,
"output_tokens": 350,
"input_tokens_details": { "cached_tokens": 1000 }
}
}
anthropic — Messages
Кэш не входит в input_tokens. Чтение кэша — cache_read_input_tokens, запись — cache_creation_input_tokens, у записи своя цена. В потоке вход приходит в message_start, выход — в message_delta.
{
"usage": {
"input_tokens": 200,
"cache_read_input_tokens": 1000,
"cache_creation_input_tokens": 0,
"output_tokens": 350
}
}
cohere — rerank и embed
Счёт в meta.billed_units. У rerank единица — поиск.
{
"meta": {
"billed_units": { "input_tokens": 1800, "search_units": 1 }
}
}
Форму Gemini (usageMetadata) биржа тоже понимает.
Когда токенов нет
У речи, картинок и видео биржа считает единицы по методу эндпойнта:
| Метод | Единица | Откуда |
|---|---|---|
| Синтез речи | символ | input запроса |
| Расшифровка, перевод | секунда | usage.seconds или duration ответа |
| Картинки | картинка | длина массива data ответа |
| Видео | секунда | seconds ответа |
Асинхронное задание оплачивается при создании. Опрос статуса бесплатен, а если по вашей ручке статуса видно, что задание упало, деньги за него вернутся покупателю сами.
3. Ошибки
Каждый неудачный ответ биржа относит к одному классу. От класса зависит, уйдёт ли вызов к другому продавцу, что увидит покупатель и не выключим ли мы ваше предложение. За ошибку покупатель не платит никогда.
| Что случилось | Что слать | Класс | Что дальше |
|---|---|---|---|
| Кривой запрос, нет такой модели, слишком большое тело | 400, 404, 409, 413, 415, 422 | buyer_fault | Отдаём покупателю ваш статус и текст. Здоровье не портит |
| Упёрлись в лимит | 429 и Retry-After | rate_limited | Идём к следующему продавцу, иначе покупателю 429 с вашим Retry-After. Здоровье не портит |
| Кончились деньги или квота у вас | 402, или insufficient_quota, billing_error в error.code / error.type | seller_out_of_funds | Следующий продавец, покупателю 503. Предложение сразу снимается с продажи |
| Не принят ваш ключ | 401, 403 | seller_auth | Следующий продавец, покупателю 502. Для нас это авария |
| Не успели | 408, 504, 524 | seller_timeout | Следующий продавец, покупателю 504 |
| Упали, перегружены | 500, 502, 503, 529 | seller_unavailable | Следующий продавец, покупателю 502 |
Код, которого нет в таблице, читается так: любой другой 4xx — ошибка покупателя, 5xx — ваша. Обрыв соединения и ошибка в потоке до содержимого — тоже ваша.
Не отвечайте 200 на ошибку. Если по-другому ваш API не умеет, скажите нам, в каком поле лежит код и какие значения значат успех: мы опишем это в настройках вашего API, и такой ответ перестанет быть оплаченным успехом. Но честный статус надёжнее.
401 и 403 — только про ваш ключ. Если так вы отвечаете на нехватку прав у конечного пользователя, биржа решит, что сломан ключ продавца, и будет перебирать других продавцов.
Что увидит покупатель
Ошибку отдаём всегда в одной форме, в стиле OpenAI — её понимают готовые SDK:
{
"error": {
"type": "buyer_fault",
"code": "model_not_found",
"message": "The model 'gpt-9' does not exist",
"param": "model",
"request_id": "req_…"
}
}
type— класс из таблицы,code— стабильный код биржи.- От вас переносим только
error.messageиerror.param, не длиннее 500 символов, и только для ошибок покупателя. Ваш request id, стек, адреса и имена хостов наружу не уходят. Поэтому пишите вerror.messageто, что поможет покупателю исправить запрос. - Заголовок
X-Request-Idприходит всегда. - Если в потоке содержимое уже ушло, статус не меняется, а последним кадром идёт
event: errorс тем же{"error": …}.
4. Здоровье и health_path
Биржа следит за каждым предложением и держит его в одном из состояний: up, degraded или down.
- Считаются попытки за последние 5 минут. Если их не меньше пяти и половина —
seller_unavailable,seller_timeoutилиseller_auth, предложение становится degraded, а если так продолжается ещё 5 минут — down. seller_out_of_fundsотправляет предложение в down сразу.- Ошибки покупателя и 429 здоровье не портят.
- В down предложение снимается с продажи, на витрине оно помечено «недоступно». Эту отметку ставит автомат, и снять её в кабинете нельзя: она сойдёт сама, когда вы оживёте. Причину, которую вы поставили сами, автомат не трогает.
Пока предложение в down, трафика у него нет, и проверять его нечем. Для этого нужна health_path — путь, по которому биржа раз в минуту делает GET на ваш базовый адрес вашим ключом:
- подойдёт список моделей (
/v1/models) или остаток на счёте; - ручка должна быть бесплатной: путь платного эндпойнта кабинет не примет, а проба проводок не пишет;
- ответ 2xx — проба удалась; после 10 минут удачных проб предложение возвращается в up;
- без
health_pathпроб нет, и предложение вернётся только через 30 минут — пробой живым трафиком.
Низкий остаток. Если ваш остаток можно спросить ручкой, скажите нам — лучше, если это и есть health_path: тогда опрос один. Когда денег остаётся меньше, чем уходит за сутки, придёт письмо, не чаще раза в 12 часов. Если остатка не хватает даже на один вызов предложения, оно уходит в down до пополнения, а более дешёвые предложения того же API продолжают работать.
5. Цены и варианты
Цену ставите вы, в рублях, до восьми знаков после запятой: цена токена бывает и 0,00003242 ₽. У одного предложения корзины складываются:
| Корзина | За что |
|---|---|
| Вход | токены входа без кэша |
| Выход | токены ответа |
| Кэш | токены, прочитанные из кэша. Обычно в разы дешевле входа; не задана — по цене входа |
| Запись в кэш | у диалекта anthropic; не задана — по цене входа |
| Вызов | фиксированная плата за каждый удачный вызов |
| Объём | единицы: символы, секунды, картинки — за указанное их количество |
Пример: вход 60 ₽ за миллион, кэш 6 ₽ за миллион. Миллион токенов, из которых 900 тысяч пришли из кэша, стоит 11,40 ₽, а не 60 ₽.
Цена на момент вызова. Каждая правка цены — новая версия с датой начала, старые не переписываются. Вызов считается по той версии, что действовала в момент вызова, даже если мы проводим его позже.
Варианты по параметрам. Если цена зависит от поля запроса — разрешения, качества, длительности, — у версии цены бывают варианты с условием, например {"resolution": "1080p"}. Правила такие:
- совпало условие — берётся этот вариант;
- поля в запросе нет — вариант, помеченный как ваш «по умолчанию»: ровно то, что сделает ваш API без этого поля;
- иначе — запасная цена без условий. Она обязательна и должна быть самой дорогой, чтобы непредусмотренный запрос не ушёл в убыток.
Комиссия. Наценка биржи — в базисных пунктах, 100 б. п. = 1 %, и начисляется поверх вашей цены. Вы получаете свою цену целиком:
цена покупателя = ваша цена × (10 000 + б. п.) / 10 000
При 500 б. п. вызов за 1,00 ₽ покупатель оплатит по 1,05 ₽: 1,00 ₽ ваши, 0,05 ₽ — биржи. Ставку видно в кабинете.
6. Себестоимость в ответе
Некоторые API кладут в ответ свою закупочную цену: estimated_cost, cost_in_usd_ticks, credits_consumed и похожие поля. Покупателю их видеть незачем: его цена — та, что на бирже, а ваша закупка — ваша коммерческая тайна.
- Такие поля шлюз вырезает из ответа до того, как отдать его покупателю.
- Поля вырезаются и внутри JSON, лежащего строкой (например
resultJson), если назвать нам путь к такой строке. - Лучше не присылать их вовсе. Если без них никак, назовите нам поле, и мы добавим его в список вырезаемых для вашего API.
- Цену вызова биржа по этим полям не считает — только по
usageи единицам.
7. Проверка готовности
Прежде чем открывать продажи, нажмите «Проверить готовность» в кабинете продавца. Проверка пройдёт по вашему API и покажет, что не так, раздел за разделом этой страницы: отвечает ли health_path и бесплатен ли он, в той ли форме приходит usage, какими статусами вы отвечаете на ошибки, есть ли у вариантов запасная цена и не просачивается ли себестоимость. Всё зелёное — можно продавать.
Что-то не сходится со стандартом или ваш API устроен иначе — напишите на sale@eq.team: обычно это правка настроек вашего API, а не кода.