1. Activate access and create a key
Choose an API plan. After payment confirmation, open “API i klucze” in your account, create a named key and save its secret when it is shown. Account and checkout screens currently use Polish.
Open the API panel (Polish)2. Send a request from your server
Set ARBISCAN_API_KEY in the server environment. The base URL is https://api.arbiscan.pl/v1. Pass the key in the X-API-Key header. Actual API calls consume your plan’s request allowance.
/v1/oddscurl --fail-with-body 'https://api.arbiscan.pl/v1/odds?bookmakers=betclic&limit=1' \
--header "X-API-Key: $ARBISCAN_API_KEY"Keep your key on your server. This example does not send a request to the API.
- events[]
- Events
- bookmakers[]
- Bookmaker sources
- markets[]
- Markets and outcomes
- last_update
- Observation time
Run the example to view the JSON.
3. Select sources and check coverage
Use bookmakers=betclic or bookmakers=superbet on GET /odds for Polish sources. These filters do not cover the brands’ other national websites. The sts identifier means the Polish bookmaker; this service is unrelated to cloud Security Token Service APIs.
Read /bookmakers, /sports, /leagues and /markets to discover available coverage. Do not assume that every source supplies every market. The scope is prematch, not live in-play. WebSocket or webhook delivery does not change that scope.
Odds history and the price stream are currently unavailable. Use your ArbiScan account. You can buy an API plan and manage your keys yourself.
4. Read the response
events[].id- Event identifier, used with /events/{event_id}.
bookmakers[].key- Source identifier, such as betclic or superbet.
markets[].key- Market identifier. Read /markets for the available set.
outcomes[].name / price- Outcome label and decimal odds.
last_update / last_seen- Time the quote or event was observed, not the response time.
count / has_more / next_cursor- Events on this page and the cursor for the next page.
An empty events array is a valid response when nothing matches. Do not replace missing odds with zero. Handle missing data, stale observations and unavailable sources as different states.
Pagination and freshness
GET /odds accepts limit from 1 to 500, with a default of 200. Keep the same filters and pass next_cursor as cursor. On HTTP 409 with snapshot_changed or cursor_version_expired, restart from the first page rather than merging incompatible snapshots.
max_age_seconds ranges from 60 to 900. include_stale is not supported. GET /health distinguishes service availability from data freshness; /usage reports your request usage. Preserve the original observation time when caching a response.
Errors and limits
401 · Invalid key
Check the server-side secret. Do not repeatedly send the same unauthorized request.
403 · Missing access
Check plan status and endpoint permissions. A payment awaiting confirmation does not grant access.
429 · Rate limit
Respect Retry-After and the request budget. Queue requests and use backoff with jitter.
503 · Unavailable source
Preserve the last observation time, label cached data as stale and retry after a delay.
Plan your request budget
Daily quotas reset at 00:00 UTC. All managed keys on one account share the daily and per-minute allowance. More keys do not multiply that allowance. Read Retry-After on a 429 response before retrying.
One request per minute throughout the day needs 1,440 requests. A three-page result needs 4,320 requests at that interval. One single-page request every 10 seconds needs 8,640 per day, before retries and other endpoints. A 1,000-per-day plan suits smaller integrations and periodic reports, not continuous minute-by-minute polling.
Count paginated reads and retries separately. An authenticated GET /odds request consumes quota before parameter validation, so do not assume that a 400 response or an empty result is free. Centralize polling on your server and share cached responses with your own application views, preserving observation timestamps.
Keep keys on your server
Never put a key in frontend code, source control, logs or analytics. If a secret is exposed, replace it, switch your application to the new key and revoke the old one. A plan with one active key needs a controlled rotation process to avoid an accidental outage.
Compare API access plans →