API quickstart

Build with bookmaker odds in minutes

Start with entitled bookmaker coverage, normalized events, markets, and decimal odds. The REST API is scoped during beta so launch teams can validate source quality before scaling traffic.

Step 1

Request beta access and confirm bookmaker, sport, market, and region scope.

Step 2

Create an API key in the dashboard after access is enabled.

Step 3

Send REST requests with an Authorization: Bearer token.

Step 4

Use rate-limit headers and source coverage status to size rollout traffic.

Endpoints

REST surface for launch integrations

GET/api/v1/bookmakers

List entitled bookmaker sources with verified REST/live capability metadata.

sport=football&transport=rest

GET/api/v1/events

List events with current odds from entitled sources.

sport=football&dateFrom=2026-05-04T00:00:00.000Z&dateTo=2026-05-11T00:00:00.000Z

GET/api/v1/events/{eventId}/odds

Read grouped odds for one event across markets and bookmakers.

Use the numeric event id returned by /api/v1/events.

GET/api/v1/spec

Download the OpenAPI contract used by the web app.

Public endpoint, no API key required.

Filters and limits

Keep rollout traffic scoped

Responses include X-RateLimit-Limit and X-RateLimit-Remaining. Treat those headers as part of your launch control loop rather than retrying blindly.

sport

Sport code, defaults to football.

bookmaker

Comma-separated source slugs such as tipico,bet-at-home.

limit

Pagination size from 1 to 500.

dateFrom / dateTo

ISO-8601 kickoff range filters for event lists.

league

Optional league key for event list narrowing.

Response shape

Normalized odds data

Odds are returned as decimal odds. Bookmaker-specific upstream payloads are normalized into events, markets, outcomes, quote status, and observation timestamps. The flat OpenAPI quote schema uses oddsDecimal; grouped event odds use odds inside each outcome.

{
  "data": {
    "event": {
      "id": "12345",
      "sport": "football",
      "leagueName": "Bundesliga",
      "homeTeam": "Borussia Dortmund",
      "awayTeam": "Bayern Munich",
      "kickoffAt": "2026-05-09T16:30:00.000Z"
    },
    "markets": [
      {
        "type": "match_result_1x2",
        "line": null,
        "bookmakers": [
          {
            "slug": "tipico",
            "displayName": "Tipico",
            "outcomes": [
              {
                "outcome": "home",
                "odds": 2.42,
                "status": "open",
                "lastUpdatedAt": "2026-05-04T12:10:14.000Z"
              }
            ]
          }
        ]
      }
    ]
  }
}

Source capabilities

Entitlement is separate from verified coverage

/api/v1/bookmakers returns entitlement-scoped sources plus product coverage status. Broad odds requests omit unverified sources by default; explicit unverified source requests return 409 source_unavailable.

{
  "data": [
    {
      "slug": "tipico",
      "displayName": "Tipico",
      "region": "Germany / DACH",
      "countries": ["DE"],
      "restAvailable": true,
      "liveAvailable": true,
      "coverageStatus": "verified_rest_live",
      "sourceMode": "direct",
      "latestNetcupEvidenceDate": "2026-05-12",
      "customerNote": "Verified REST and STOMP live output."
    },
    {
      "slug": "skybet",
      "displayName": "Sky Bet",
      "region": "United Kingdom",
      "countries": ["GB"],
      "restAvailable": true,
      "liveAvailable": false,
      "coverageStatus": "source_limited",
      "sourceMode": "worker_proxy",
      "latestNetcupEvidenceDate": "2026-05-15",
      "customerNote": "REST path has evidence; live output is not verified for product use."
    }
  ],
  "meta": {
    "entitlement": { "scope": "organization", "sport": "football", "transport": "rest" },
    "verifiedCoverage": { "source": "productCoverage", "internalBlockersIncluded": false },
    "runtimeFreshness": { "included": false }
  }
}