Foreline/Тарифы Документация/Референс API
API · v1 · референсЭндпоинты, параметры, поля
Базовый URL https://api.foreline.io. В каждом запросе —
X-Foreline-Key. Впервые здесь? Начните с
обзора и быстрого старта.
Что верно для любого вызова
- Базовый URL:
https://api.foreline.io, только HTTPS, версия в пути (/v1/…). - Аутентификация:
X-Foreline-Key: <ключ>в каждом запросе, включая SSE-стрим. Ключей в query-строке нет. - Метки времени — ISO-8601 в UTC с суффиксом
Z(2026-07-24T18:41:07Z), и в параметрах, и в ответах. - Идентификаторы:
event_id— идентификатор Foreline, стабильный на всю жизнь события. Сопоставление с вашими ID событий даётся при подключении. - Цены — вероятности в
[0, 1]; ширина полос — в процентных пунктах (пп). Десятичные коэффициенты не возвращаются: маржу вы ставите свою. - Совместимость: внутри
v1изменения только аддитивные. Могут появляться новые поля; существующие сохраняют смысл. Незнакомые поля игнорируйте. - Ответы —
application/json, UTF-8, кроме/v1/stream, гдеtext/event-stream.
Health
Подтверждает, что ключ действителен, сервис поднят, а ваши часы сходятся с нашими. Параметров нет. Используйте как смоук-тест интеграции и как liveness-проверку.
{ "status": "ok", "server_ts": "2026-07-24T18:41:07Z", "version": "v1" }
Surface
Один эндпоинт с четырьмя режимами. Режим выбирается тем, какой параметр вы
передали; параметры взаимоисключающие, кроме asof, который уточняет
event_id.
Без параметров — сводка того, что живо прямо сейчас: покрытые события, их главные линии и свежесть. Для обнаружения покрытия, а не для чтения лестниц.
Параметры
| Параметр | Тип | Режим | Описание |
|---|---|---|---|
event_id | строка | point · 60/мин | Полная лестница одного события: main_line, fair_market,
vig / vig_tier и каждая ступень со своей полосой. |
asof | метка времени | point · 60/мин | Поверхность такой, какой она была в этот момент, а не какой её потом пересчитали.
Комбинируется с event_id. Этот вызов — для бэктестов и для разбора спора
о том, что и когда было опубликовано. |
since | метка времени | bulk · 4/мин | Bulk-дельта: каждая поверхность, изменившаяся с этого курсора, целиком. В ответе
приходит next_since — передайте его в следующий вызов. |
Ответ — объект поверхности
| Поле | Тип | Описание |
|---|---|---|
event_id | строка | Идентификатор события Foreline. |
sport | строка | football (новые виды спорта появятся здесь по мере запуска). |
market | строка | handicap, total или 1x2. |
main_line | число | Линия, которую референсный рынок сейчас считает главной. |
fair_market | число | Девигнутая честная вероятность на главной линии. |
vig_tier | Точная снятая маржа плюс полоса vig_tier (low/mid/high) и лимит max_win с limit_tier. Редистрибуция сырых котировок запрещена на всех тарифах. | Маржа, измеренная на котировке референса до снятия, — то, что мы убрали. |
rungs | массив | Лестница. См. ниже. |
data_cadence_s | целое | Интервал обновления, действующий для этого объекта сейчас: 60, 300 или 900. |
updated_ts | метка времени | Когда поверхность была пересчитана в последний раз. |
next_since | метка времени | Только в bulk-режиме. Курсор для следующего вызова ?since=. |
Ответ — rungs[]
| Поле | Тип | Описание |
|---|---|---|
line | число | Фора или тотал, который прайсит эта ступень. |
p_home | число | Рынки фор: честная вероятность того, что дом проходит эту линию. |
p_over | число | Рынки тоталов: честная вероятность овера на этой линии. |
band_pp | число | Ширина 80%-полосы неопределённости, в процентных пунктах. |
src | строка | quote — выведено из цены, которую референсный рынок реально котировал. table — достроено по табличным лестницам, потому что этой ступени референс не котирует. |
curl -s "https://api.foreline.io/v1/surface?event_id=EVT_8F3A21" \
-H "X-Foreline-Key: $FORELINE_KEY"
{
"event_id": "EVT_8F3A21",
"sport": "football",
"market": "handicap",
"main_line": -0.5,
"fair_market": 0.5312,
"vig": 0.0214,
"data_cadence_s": 60,
"updated_ts": "2026-07-24T18:41:07Z",
"rungs": [
{ "line": -1.0, "p_home": 0.3874, "band_pp": 1.6, "src": "quote" },
{ "line": -0.75, "p_home": 0.4593, "band_pp": 1.9, "src": "table" },
{ "line": -0.5, "p_home": 0.5312, "band_pp": 1.4, "src": "quote" }
]
}
Значения иллюстративные. Глубина истории, доступная через
?asof=, следует вашему контракту; архив уходит к 2022 году по футболу.
Line events
Смены главных линий типизированными фактами, в порядке обнаружения. Это догоняющий канал: после перезапуска доберите с последнего курсора — и ничего не потеряете. Для живой доставки берите стрим или вебхук.
| Поле | Тип | Описание |
|---|---|---|
since | метка времени | Параметр. Вернуть события, обнаруженные после этого момента. |
event_id | строка | Событие, у которого сдвинулась линия. |
market | строка | Рынок, где произошло движение. |
from / to | число | Прежняя и новая главная линия. |
detected_ts | метка времени | Когда мы увидели смену. Латентность обнаружения: p50 1 мин, p95 2 мин. |
next_since | метка времени | Курсор для следующего вызова. |
Stream
Удерживаемое HTTP-соединение, отдающее text/event-stream.
Сейчас один тип события — line_change, с тем же пейлоадом, что и у
/v1/line-events. При переподключении доберите разрыв через
/v1/line-events?since=, передав последний обработанный
detected_ts.
curl -N "https://api.foreline.io/v1/stream" \
-H "X-Foreline-Key: $FORELINE_KEY"
event: line_change
data: {"event_id":"EVT_8F3A21","market":"handicap","from":-0.5,"to":-0.75,
"detected_ts":"2026-07-24T18:41:07Z","data_cadence_s":60}
Вебхуки
Push-доставка событий линий и алертов на ваш эндпоинт — подписанная, чтобы вы могли доказать происхождение пейлоада до того, как на него отреагировать.
- Подпись:
X-Foreline-Signature: sha256=<hex>— HMAC-SHA256 по точному сырому телу запроса с общим секретом, выданным вместе с ключом. Считайте по полученным байтам, а не по пересобранному JSON, и сравнивайте за константное время. - Защита от повторов:
X-Foreline-Timestampнесёт время отправки; отклоняйте доставки, чья метка выходит за ваше окно допуска. - Идемпотентность:
X-Foreline-Deliveryуникален для доставки. Повторы переиспользуют его — дедуплицируйте по нему. - Ретраи: ответы не из 2xx повторяются с бэкоффом. Возвращайте 2xx, как только сохранили пейлоад; обрабатывайте после.
Score
Скорит счёт по CLV против нашего честного клоза — по тем самым линиям, которые он брал, включая линии, которых референсный рынок не котировал (они репрайсятся по табличным лестницам). На вход идут обезличенный идентификатор счёта и параметры ставок; персональные данные не принимаются и не нужны.
Тело запроса
| Поле | Тип | Описание |
|---|---|---|
account_id | строка | Ваш обезличенный идентификатор счёта. Для нас непрозрачен, используется только для группировки ставок. |
bets[] | массив | Ставки для скоринга. |
bets[].event_id | строка | Идентификатор события Foreline. |
bets[].market | строка | handicap, total или 1x2. |
bets[].line | число | Взятая линия — любая ступень, не только главная. |
bets[].side | строка | Сторона ставки: home, away, over, under и т. д. |
bets[].price | число | Десятичный коэффициент, который получил клиент. |
bets[].stake | число | Сумма ставки в вашей учётной валюте. |
bets[].placed_ts | метка времени | Когда ставка была принята. |
Ответ
| Поле | Тип | Описание |
|---|---|---|
account_id | строка | Возвращается как есть. |
n_bets | целое | Сколько ставок удалось репрайсить. Первый осмысленный вывод — обычно с 10–20 ставок. |
score | число | Совокупный скор счёта. |
components.clv | число | Насколько счёт обыгрывает наш честный клоз — компонент величины. |
components.signed | число | Насколько устойчиво счёт оказывается на правильной стороне — знаковый компонент, устойчивый к нескольким крупным выбросам. |
flag | строка | Поднимается, только когда сошлись оба компонента. Доля ложных срабатываний по семье измерена в 1,32% при бюджете 2%. |
band_pp | число | Неопределённость, перенесённая из репрайса линий, которые брал этот счёт. |
scored_ts | метка времени | Когда скор был посчитан. |
Пороги флага и его словарь настраиваются по контракту при подключении — скор можно подстроить под вашу риск-политику, не меняя интеграцию. Ставки на события вне вашей области отчитываются как нескоренные, а не отбрасываются молча.
Alerts
Предупреждения о разрыве — где ваша выставленная цена ушла от честной —
вместе с состоянием жизненного цикла. Фильтруйте по state или листайте переходы
через since.
| Поле | Тип | Описание |
|---|---|---|
state | строка | active — открытое предупреждение. confirmed — рынок
впоследствии двинулся так, как подразумевал разрыв. withdrawn — разрыв
закрылся без движения. Отозванные алерты остаются в записи. |
since | метка времени | Параметр. Вернуть алерты, у которых состояние менялось после этого момента. |
alert_id | строка | Стабилен на весь жизненный цикл алерта. |
event_id, market, line | — | О чём предупреждение. |
gap_pp | число | Расстояние между вашей ценой и честной, в процентных пунктах. |
band_pp | число | Полоса вокруг честной цены на этой ступени — разрыв читается относительно неё. |
opened_ts / resolved_ts | метка времени | Метки жизненного цикла; пара даёт лид, посчитанный из записи. |
Чтобы сравнивать вашу цену с честной, нужны ваши цены. Они приходят по интеграции, согласованной при подключении; ничего о вашей книге не додумывается из сторонних источников.
Usage
Ваш расход против квот на ключе: запросы за текущую минуту и сутки, потолки
rpm и rpd, а также счётчики по классам bulk, point и events. Опрашивайте по расписанию и
алертите на собственный запас, а не узнавайте о нём из 429.
Получение ключа (self-serve тарифы): после оплаты в Stripe вас переадресует на одноразовую страницу — сырой ключ показывается ровно один раз, у нас остаётся только его sha256. Потерянный ключ перевыпускает поддержка. Мини-кабинет (ключ → тариф, лимиты, живой расход) — /v1/portal.
Коды статусов
| Статус | Значение | Ретраить? |
|---|---|---|
401 | Заголовок X-Foreline-Key отсутствует, повреждён или отозван. |
Нет — чинить заголовок. |
403 | Аутентификация прошла, но вызов вне области контракта: вид спорта, продукт или глубина истории, которых у вас нет. Возвращается вместо пустого результата, чтобы «не разрешено» никогда не выглядело как «здесь ничего нет». | Нет — напишите нам, если область не та. |
429 | Превышен классовый лимит или квота аккаунта. В ответе —
Retry-After в секундах. |
Да — после Retry-After. |
В теле ошибки есть машиночитаемый код error и человекочитаемое
message. Ветвитесь по статусу и коду, никогда — по тексту сообщения.
Три класса вызовов, заданные каденсом данных
Данные меняются в лучшем случае раз в минуту, поэтому более частый опрос
вернёт те же байты с тем же updated_ts. Лимиты ниже выстроены вокруг этого, а не
вокруг упаковки тарифов.
| Класс | Лимит | Эндпоинты |
|---|---|---|
| bulk | 4 / мин | GET /v1/surface?since= |
| point | 60 / мин | GET /v1/surface (сводка, ?event_id=, ?asof=),
POST /v1/score, GET /v1/usage |
| events | 12 / мин | GET /v1/line-events, GET /v1/alerts |
- Клиентские квоты идут поверх классовых лимитов: потолок rpm (запросов в минуту) и
rpd (запросов в сутки) на ключе, оба читаются из
GET /v1/usage. - Планируйте по
data_cadence_s. Поле возвращается в каждом объекте и говорит, когда вообще может появиться новое значение. Поллер, построенный на нём, остаётся корректным по мере приближения матчей, когда каденс сжимается с 15 мин до 5 мин и до 60 с. - Стрим не лимитируется по сообщениям — это постоянное соединение. Если нужно всё и сразу по мере появления, держите стрим, а не повышайте частоту опроса.
Поля, которые стоит понять до того, как на них строить
| Термин | Значение |
|---|---|
fair_market | Девигнутая вероятность на главной линии — цена референсного рынка со снятой документированной методологией маржой. |
vig_tier | Точная снятая маржа плюс полоса vig_tier (low/mid/high) и лимит max_win с limit_tier. Редистрибуция сырых котировок запрещена на всех тарифах. |
band_pp | Ширина 80%-полосы неопределённости на ступени, в процентных пунктах. Проверенное покрытие — 78–80% при номинале 80%. |
src | quote: ступень выведена из цены, которую
референс реально котировал. table: ступень достроена по табличным
лестницам. На ступенях table полосы обычно шире — как и должно быть. |
data_cadence_s | Как часто этот объект может меняться сейчас: 60 с внутри суток до матча, 300 с на 24–96 ч, 900 с дальше. |
next_since | Курсор, возвращаемый дельта-вызовами. Передавайте обратно как есть; не конструируйте его из часов на своей стороне. |
| пп | Процентные пункты — абсолютная разница между двумя вероятностями, никогда не относительный процент. |
Запросить тестовый ключ
Ключи выдаются по контракту. Напишите, какие продукты, виды спорта и глубина истории вам нужны.
Обычно отвечаем в течение одного рабочего дня. Цены считаем под объём — напишите, и пришлём условия.
Foreline