Перейти к содержимому

Стандарт для продавцов

Редакция от 6 октября 2026 года

Здесь всё, что биржа ждёт от вашего 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, 422buyer_faultОтдаём покупателю ваш статус и текст. Здоровье не портит
Упёрлись в лимит429 и Retry-Afterrate_limitedИдём к следующему продавцу, иначе покупателю 429 с вашим Retry-After. Здоровье не портит
Кончились деньги или квота у вас402, или insufficient_quota, billing_error в error.code / error.typeseller_out_of_fundsСледующий продавец, покупателю 503. Предложение сразу снимается с продажи
Не принят ваш ключ401, 403seller_authСледующий продавец, покупателю 502. Для нас это авария
Не успели408, 504, 524seller_timeoutСледующий продавец, покупателю 504
Упали, перегружены500, 502, 503, 529seller_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, а не кода.