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

GET/v1/health без класса лимита · область не требуется

Подтверждает, что ключ действителен, сервис поднят, а ваши часы сходятся с нашими. Параметров нет. Используйте как смоук-тест интеграции и как liveness-проверку.

{ "status": "ok", "server_ts": "2026-07-24T18:41:07Z", "version": "v1" }
Поверхность цен

Surface

Один эндпоинт с четырьмя режимами. Режим выбирается тем, какой параметр вы передали; параметры взаимоисключающие, кроме asof, который уточняет event_id.

GET/v1/surface point · 60/мин

Без параметров — сводка того, что живо прямо сейчас: покрытые события, их главные линии и свежесть. Для обнаружения покрытия, а не для чтения лестниц.

Параметры

ПараметрТипРежимОписание
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

GET/v1/line-events?since= events · 12/мин

Смены главных линий типизированными фактами, в порядке обнаружения. Это догоняющий канал: после перезапуска доберите с последнего курсора — и ничего не потеряете. Для живой доставки берите стрим или вебхук.

ПолеТипОписание
sinceметка времениПараметр. Вернуть события, обнаруженные после этого момента.
event_idстрокаСобытие, у которого сдвинулась линия.
marketстрокаРынок, где произошло движение.
from / toчислоПрежняя и новая главная линия.
detected_tsметка времениКогда мы увидели смену. Латентность обнаружения: p50 1 мин, p95 2 мин.
next_sinceметка времениКурсор для следующего вызова.
Радар линий

Stream

GET/v1/stream server-sent events · постоянное соединение

Удерживаемое 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

POST/v1/score point · 60/мин

Скорит счёт по 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

GET/v1/alerts events · 12/мин

Предупреждения о разрыве — где ваша выставленная цена ушла от честной — вместе с состоянием жизненного цикла. Фильтруйте по state или листайте переходы через since.

ПолеТипОписание
stateстрока active — открытое предупреждение. confirmed — рынок впоследствии двинулся так, как подразумевал разрыв. withdrawn — разрыв закрылся без движения. Отозванные алерты остаются в записи.
sinceметка времениПараметр. Вернуть алерты, у которых состояние менялось после этого момента.
alert_idстрокаСтабилен на весь жизненный цикл алерта.
event_id, market, lineО чём предупреждение.
gap_ppчислоРасстояние между вашей ценой и честной, в процентных пунктах.
band_ppчислоПолоса вокруг честной цены на этой ступени — разрыв читается относительно неё.
opened_ts / resolved_tsметка времениМетки жизненного цикла; пара даёт лид, посчитанный из записи.

Чтобы сравнивать вашу цену с честной, нужны ваши цены. Они приходят по интеграции, согласованной при подключении; ничего о вашей книге не додумывается из сторонних источников.

Сервис

Usage

GET/v1/usage point · 60/мин

Ваш расход против квот на ключе: запросы за текущую минуту и сутки, потолки 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. Лимиты ниже выстроены вокруг этого, а не вокруг упаковки тарифов.

КлассЛимитЭндпоинты
bulk4 / минGET /v1/surface?since=
point60 / мин GET /v1/surface (сводка, ?event_id=, ?asof=), POST /v1/score, GET /v1/usage
events12 / мин 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%.
srcquote: ступень выведена из цены, которую референс реально котировал. table: ступень достроена по табличным лестницам. На ступенях table полосы обычно шире — как и должно быть.
data_cadence_sКак часто этот объект может меняться сейчас: 60 с внутри суток до матча, 300 с на 24–96 ч, 900 с дальше.
next_sinceКурсор, возвращаемый дельта-вызовами. Передавайте обратно как есть; не конструируйте его из часов на своей стороне.
ппПроцентные пункты — абсолютная разница между двумя вероятностями, никогда не относительный процент.

← Назад к обзору

Доступ

Запросить тестовый ключ

Ключи выдаются по контракту. Напишите, какие продукты, виды спорта и глубина истории вам нужны.

Напишите нам

Обычно отвечаем в течение одного рабочего дня. Цены считаем под объём — напишите, и пришлём условия.

Запросить доступ