API сравнения цен
API сравнения цен
POST /v1/price-comparisons сравнивает цену BeatAPI для одной опубликованной тарифной спецификации с публичными ценами, которые другие платформы указывают для той же спецификации. API-ключ не нужен, вызов не тарифицируется.
Сравнение нейтральное. BeatAPI ранжируется по тем же правилам, что и любая другая платформа, и если другая платформа дешевле, ответ прямо это показывает: beatapi_position равно not_lowest.
Быстрый старт
Если передать только model, обычная конфигурация модели сравнивается со всеми платформами, для которых сохранена цена этой спецификации. Добавьте spec, чтобы выбрать другую конфигурацию, и providers, чтобы выбрать платформы.
Запрос
model и spec — не длиннее 200 символов каждое. Если model пусто, модель ищется по spec.
Обычная конфигурация
Без spec одна конфигурация выбирается по её форме и никогда — по тому, какая платформа выигрывает:
- Текстовые модели — входные токены.
- Видеомодели — первая спецификация 720p без референсного видео и без режима «видео в видео».
- Модели изображений — первая обычная спецификация изображения, например
nano-banana-pro-1k.
Если model сам является ID спецификации, сравнивается эта спецификация.
ID спецификаций
ID спецификаций берутся из анонимного прайс-листа: у каждой записи data.groups[].specs[] в GET https://api.beatapi.io/v1/pricing есть id. Каждый ответ сравнения также возвращает available_specs модели.
ID платформ
ID платформ пишутся строчными буквами, как в quotes[].provider; beatapi — это BeatAPI. Если передан providers, сравниваются только перечисленные платформы, поэтому включите beatapi, чтобы BeatAPI участвовал в ранжировании. Перечисленная платформа без цены для этой спецификации возвращается как pending_verification. ID, которого нет в таблице сравнения, отклоняется с 400.
Ответ
Успешный вызов возвращает 200 с результатом в data — та же оболочка, что у GET /v1/pricing. Ответ не кешируется (Cache-Control: no-store).
В примере ниже использованы цены, проверенные 2026-11-11. Цены, даты и значение data_version со временем меняются; актуальные цифры получайте вызовом эндпоинта.
Как цифры этого примера получаются из цен:
- Ранжируются четыре цены — 0.05, 0.126, 0.1344 и 0.15. Оценка от
atlascloudи неподдерживаемая конфигурация уhiggsfieldперечислены, но не ранжируются. - Минимальная цена — 0.05 (
beatapi). Второе место — 0.126 (wavespeed). (0.126 − 0.05) ÷ 0.126 = 60.32%. - Среднее — (0.05 + 0.126 + 0.1344 + 0.15) ÷ 4 = 0.1151. (0.1151 − 0.05) ÷ 0.1151 = 56.56%.
Поля верхнего уровня
Единицы
Все суммы указаны в USD и передаются десятичными строками, поэтому малая цена никогда не округляется до нуля. null означает, что надёжной цены нет; "0" означало бы бесплатно.
Цены
Цена ранжируется, только если у неё есть сумма, она проверена за последние 30 дней, точно соответствует спецификации и не является оценкой. Все остальные цены остаются в quotes со своим exclusion_reason, так что видно, кто исключён и почему.
Цена BeatAPI — это текущая розничная цена из GET /v1/pricing, поэтому изменение цены BeatAPI отражается в следующем сравнении. Цены других платформ проверяются вручную по их публичным страницам.
Сводка и четыре метрики
Проценты — строки с двумя знаками после запятой, рассчитанные по неокруглённым суммам с округлением половины вверх в конце. Метрика равна null, если ранжировано меньше двух платформ или её знаменатель равен нулю; NaN не бывает. mean_amount округляется до 8 знаков после запятой.
Если модель неоднозначна
Имя, которому соответствует несколько моделей, возвращает 200 с needs_clarification:
Отправьте одного кандидата без изменений в model. Точное имя, slug или ID спецификации всегда важнее частичного совпадения, поэтому Nano Banana Pro соответствует одной модели. Имя, которому не соответствует ни одна модель, тоже возвращает needs_clarification, но без model_candidates.
Ошибки
Ошибки возвращаются в стандартном объекте ошибки. Запрос, который нужно исправить, возвращает 400 bad_request с сообщением о проблеме:
Не отправляйте 400 повторно без изменений. 500 internal_error означает, что сравнение не удалось рассчитать; повторите один раз, затем обратитесь в поддержку с request_id.

