Dokumentacja ArbiScan API
v1 · base URL https://api.arbiscan.pl · wszystkie odpowiedzi w formacie application/json; charset=utf-8
Jak zacząć
- Złóż wniosek o dostęp — podaj e-mail, hasło i opis planowanego użycia.
- Poczekaj na zatwierdzenie konta przez administratora (otrzymasz wiadomość e-mail).
- Zaloguj się do panelu klienta i wygeneruj klucz API.
- Dodaj nagłówek
X-API-Keydo zapytań HTTPS.
Uwierzytelnianie
Wszystkie endpointy danych wymagają klucza API w nagłówku X-API-Key (poza /v1/health):
curl -H "X-API-Key: ods_xxxxxxxxxxxx" \ "https://api.arbiscan.pl/v1/odds?league=Premier%20League"
Klucze API są niezależne od kont na arbiscan.pl. Pojedyncze konto może mieć do 5 kluczy (np. produkcja / test / staging).
Limity i kwoty
Domyślne limity klucza:
- 60 zapytań / minutę — przekroczenie zwraca
429 Too Many Requests. - 10 000 zapytań / dzień (UTC) — kwota resetuje się o
00:00 UTC.
Limity per-klucz konfigurujesz w panelu przy tworzeniu lub edycji klucza. Aktualne zużycie raportują endpointy /v1/usage oraz pole quota w odpowiedzi /v1/odds.
Dostępność danych
last_update przestaje wzrastać. Zawsze sprawdzaj last_update zanim zaufasz kursowi.
Wspierane bukmacherzy: większość legalnych polskich bukmacherów (STS, Fortuna, Superbet, Betclic, LvBet, Betfan, Etoto, Iforbet, Fuksiarz i inne) oraz kasyna krypto (Polymarket, 500.casino, Gamdom). Możliwa integracja niestandardowych źródeł kursowych na zamówienie — napisz na kontakt@arbiscan.pl.
Typowe opóźnienia w pełnym cyklu skanowania to ~60 s; pojedyncze zapytania per-event idą praktycznie natychmiast. Dokładne czasy zależą od bukmachera (informacje SLA na życzenie).
Endpointy publiczne
GET/v1/health — bez uwierzytelniania.
{ "ok": true, "events_known": 312, "last_ingest": "2026-05-04T11:48:00Z" }
GET/v1/sports — lista dostępnych dyscyplin.
{ "sports": ["Football"] }
GET/v1/leagues — lista dostępnych rozgrywek.
Parametr opcjonalny: sport (filtr po dyscyplinie).
{ "leagues": ["Premier League", "La Liga", "Serie A", "Bundesliga", "MLS", ...] }
GET/v1/bookmakers — lista bukmacherów aktywnych w danych.
{ "bookmakers": ["Betclic", "Betfan", "Etoto", "Fortuna", "Fuksiarz", "Iforbet", "LvBet", "Polymarket", "Sts", "Superbet", ...] }
Domyślnie aktywne są wszystkie zintegrowane źródła. Niestandardowe bukmacherzy / kasyna krypto dodajemy na zamówienie — kontakt@arbiscan.pl.
GET/v1/odds — lista wydarzeń z aktualnymi kursami.
| Parametr | Typ | Opis |
|---|---|---|
league | string | Kanoniczna nazwa ligi (case-insensitive). Np. Premier League. |
sport | string | Np. Football. |
bookmakers | csv | Filtr per-bukmacher, np. STS,Fortuna,Superbet. |
commence_from | ISO 8601 | Dolna granica commence_time. |
commence_to | ISO 8601 | Górna granica commence_time. |
limit | int | Max liczba wydarzeń (domyślnie 200, max 500). |
Przykład:
curl -H "X-API-Key: $KEY" \ "https://api.arbiscan.pl/v1/odds?league=Premier%20League&bookmakers=STS,Fortuna,Superbet,Betclic,LvBet"
Odpowiedź (skrócona):
{
"count": 8,
"events": [
{
"id": "a1b2c3d4e5f60718",
"sport": "Football",
"league": "Premier League",
"home_team": "Manchester City",
"away_team": "Arsenal",
"commence_time": "2026-05-10T21:00:00+00:00",
"bookmakers": [
{
"key": "Sts",
"last_update": "2026-05-04T11:48:00+00:00",
"markets": [
{ "key": "h2h", "outcomes": [
{ "name": "Manchester City", "price": 1.85 },
{ "name": "Draw", "price": 3.75 },
{ "name": "Arsenal", "price": 4.10 }
] }
]
}
]
}
],
"quota": { "used": 12, "limit": 10000 }
}
GET/v1/events/{event_id} — pojedyncze wydarzenie ze wszystkimi kursami.
Zwraca tę samą strukturę co jeden element events[] z /v1/odds.
GET/v1/events/{event_id}/history — oś czasu zmian kursu.
| Parametr | Typ | Opis |
|---|---|---|
market | string | Klucz rynku (domyślnie h2h). |
bookmaker | string | Filtr po bukmacherze. |
since / until | ISO 8601 | Zakres czasowy. |
limit | int | Domyślnie 1 000, max 5 000. |
Kurs zamknięcia (closing odds) = ostatni wpis history dla danego bukmachera/wyniku przed commence_time.
{
"event_id": "a1b2c3d4e5f60718",
"market": "h2h",
"history": [
{ "bookmaker": "Sts", "outcome": "Manchester City", "price": 1.90, "timestamp": "2026-05-04T08:12:45+00:00" },
{ "bookmaker": "Sts", "outcome": "Manchester City", "price": 1.88, "timestamp": "2026-05-04T09:20:11+00:00" },
{ "bookmaker": "Sts", "outcome": "Manchester City", "price": 1.85, "timestamp": "2026-05-04T11:48:00+00:00" }
]
}
GET/v1/usage — Twoje zużycie dzienne + 30-dniowa historia.
{
"owner": "twoja-nazwa",
"today": { "used": 124, "limit": 10000 },
"history": [
{ "date": "2026-05-04", "requests": 124 },
{ "date": "2026-05-03", "requests": 8431 }
]
}
Rejestracja i logowanie
POST/v1/auth/register — utwórz wniosek o konto (status pending).
{
"email": "ty@firma.pl",
"password": "min. 8 znaków",
"application": "własny model predykcyjny",
"planned_use": "Codzienne pobieranie kursów PL/LL/SerieA, ~5000 zapytań/dzień, brak redystrybucji.",
"requested_daily_limit": 5000
}
Wymaga zatwierdzenia przez administratora. Otrzymasz wiadomość e-mail z decyzją.
POST/v1/auth/login — zaloguj się.
{ "email": "ty@firma.pl", "password": "..." }
→
{ "token": "eyJhbGc...", "user": { "id": 12, "email": "ty@firma.pl", "is_admin": false }, "expires_in": 604800 }
Zarządzanie kluczami
Wszystkie endpointy /v1/me/* wymagają nagłówka Authorization: Bearer <token> z logowania.
GET/v1/me/keys — lista Twoich kluczy.
POST/v1/me/keys — utwórz nowy klucz. Body: {label, daily_limit, per_minute_limit}.
PATCH/v1/me/keys/{key} — zmień etykietę / aktywność / limity.
DELETE/v1/me/keys/{key} — usuń klucz.
Kody błędów
| Status | Body | Przyczyna |
|---|---|---|
| 400 | {"error":"Nieprawidłowy adres e-mail"} | Brakujące lub nieprawidłowe dane wejściowe. |
| 401 | {"error":"Wymagane logowanie"} | Brak/nieprawidłowy token JWT lub klucz API. |
| 403 | {"error":"Konto czeka na zatwierdzenie..."} | Konto pending lub rejected. |
| 404 | {"error":"Event not found"} | Nieznany event_id. |
| 409 | {"error":"Konto z tym e-mailem już istnieje"} | E-mail w użyciu. |
| 429 | — | Limit minutowy lub dzienna kwota przekroczone. |
| 5xx | — | Tymczasowy problem infrastruktury. Ponów z exponential backoff. |
Schemat odpowiedzi
- event_id = stabilny hash z
(liga, posortowana_para_drużyn, data_kickoffu). Ten sam mecz u STS i Fortuny daje ten samevent_id, jeśli normalizacja nazw drużyn się zgadza. - Nazwy wyników w 1X2 są normalizowane do pełnej nazwy drużyny dla "1" / "2" oraz dosłownego
Drawdla "X". - Klucz rynku dla 1X2 to
h2h(head-to-head, zgodny z konwencją The-Odds-API). - Znaczniki czasu w formacie ISO 8601 z jawnym offsetem UTC.
Wspierany zakres i rozszerzalność
API jest zaprojektowane pod elastyczne dostosowanie do potrzeb klienta:
- Bukmacherzy — większość legalnych polskich bukmacherów (STS, Fortuna, Superbet, Betclic, LvBet, Betfan, Etoto, Iforbet, Fuksiarz i inne) oraz kasyna krypto (Polymarket, 500.casino, Gamdom). Niestandardowe źródła kursowe integrowane są na zamówienie.
- Rynki — wspierane są wszystkie popularne typy zakładów: 1X2 (Match Winner), Double Chance, Both Teams To Score, Over/Under (totals), Asian Handicap, Correct Score, Half-Time/Full-Time, Player Props, Cards/Corners totals, Multi Goals i inne. Zwracana struktura
markets[]jest neutralna względem typu rynku — możemy emitować dowolny. - Dyscypliny — piłka nożna, koszykówka, tenis, hokej, MMA/Boks, e-sport, futsal, krykiet, polityka (Polymarket) i inne. Wszystko, co skanują nasze backendy.
- Live i prematch — domyślnie prematch; live (z aktualizacją w trakcie meczu) na zamówienie.
- Niestandardowe limity — limity dzienne i per-minutę ustawiane indywidualnie per-konto / per-klucz.
- Custom shape — możemy dostosować strukturę odpowiedzi pod konkretne potrzeby (CSV, custom JSON, webhook push, WebSocket streaming).
Indywidualne wyceny i integracje: kontakt@arbiscan.pl.