API

DailyAmbush Public API — Soccer Odds

Read-only, API-key-authenticated. Two endpoints: a quick per-match summary and a granular multi-book, multi-market feed. This page is public and safe to share with an AI tool — it contains no credentials.

Need a key? Log in and visit My Account → API Access to generate one.

Quick start

Send your key as a Bearer token on every request:

curl -H "Authorization: Bearer da_live_your_key_here" \
  "https://dailyambush.com/api/public/v1/soccer/odds?date=2026-08-16&days=3"

Endpoint 1 — /soccer/odds (per-match summary)

One row per match: moneyline, spread, total, and BTTS, whichever are available.

MethodGET
URLhttps://dailyambush.com/api/public/v1/soccer/odds
AuthAuthorization: Bearer <api_key> header
Rate limit60 requests / minute (some accounts are unlimited by arrangement)

Query parameters

ParamDefaultNotes
datetodayYYYY-MM-DD, start of the date range
days3Range length from date, max 30
league_idFilter to one league
page1Pagination
per_page100Max 200

Example response

{
  "data": [
    {
      "match_id": 123456,
      "match_date": "2026-08-16",
      "match_time": "20:00:00",
      "status": "scheduled",
      "league_id": 47,
      "league_name": "Premier League",
      "league_country": "England",
      "home_team": "Arsenal",
      "away_team": "Chelsea",
      "home_score": null,
      "away_score": null,
      "ml_h": -120, "ml_d": 260, "ml_a": 340,
      "spread_h": -0.25, "spread_h_odds": -120, "spread_a_odds": 100,
      "total_over": 2.5, "total_over_odds": 115, "total_under_odds": -160,
      "btts_yes": -115, "btts_no": -110,
      "last_odds_update": "2026-08-16 11:26:04"
    }
  ],
  "meta": {
    "date_from": "2026-08-16", "date_to": "2026-08-19",
    "league_id": null, "page": 1, "per_page": 100, "total": 42
  },
  "error": null
}
Coverage (as of 2026-08-16): ml_h / ml_d / ml_a (moneyline) and spread_* / total_* are populated on most upcoming matches. btts_* is populated on a minority of matches so far — treat it as sparse, not guaranteed. Coverage is actively expanding on the ingestion side; always check for null rather than assuming a field is present, and use last_odds_update to judge freshness.

Field notes

  • Odds are American format (e.g. -120, 340).
  • ml_h / ml_d / ml_a — moneyline home / draw / away.
  • spread_h is the home spread line; spread_h_odds / spread_a_odds are the juice on each side.
  • total_over is the total line; total_over_odds / total_under_odds are the juice on each side.
  • btts_yes / btts_no — both-teams-to-score market. Populated on a minority of matches so far.
  • Null odds fields mean that market wasn't available as of last_odds_update — not an error.
  • match_time is Eastern time.
  • A small number of fixtures may show an unexpected league_name (e.g. mislabeled under a catch-all competition) while the upstream matching corrects itself over time — not an API bug, the fixture data itself is still accurate.

Endpoint 2 — /soccer/markets (granular, multi-book)

One row per (match, market, bookmaker, outcome) — correct score, alternate spreads/totals, halftime/fulltime, corners, double chance, and more. Much denser than /soccer/odds: roughly 90 rows per match, so scope requests with match_id and/or market rather than pulling everything at once.

MethodGET
URLhttps://dailyambush.com/api/public/v1/soccer/markets
AuthAuthorization: Bearer <api_key> header
Rate limit60 requests / minute (some accounts are unlimited by arrangement)

Query parameters

ParamDefaultNotes
datetodayYYYY-MM-DD, start of the date range
days3Range length from date, max 30
league_idFilter to one league
match_idFilter to one match (get this from /soccer/odds first)
marketFilter to one market key — see the list below
page1Pagination
per_page200Max 200

Market keys (GET /soccer/markets/types returns this list live)

KeyWhat it is
correct_scoreExact final score
alternate_spreadsSpread at lines other than the primary one
alternate_totalsTotal goals at lines other than the primary one
alternate_totals_cornersTotal corners, alternate lines
corners_1x23-way corner count (most/fewest/tie)
halftime_fulltimeCombined HT/FT result
h2h_h1Moneyline, first half only
spreads_h1Spread, first half only
totals_h1Total, first half only
bttsBoth teams to score
btts_h1Both teams to score, first half only
double_chanceTwo-outcome combined bet (e.g. home-or-draw)
draw_no_betMoneyline with the draw refunded
team_totalsIndividual team's goal total

Example response

{
  "data": [
    {
      "match_id": 718,
      "match_date": "2026-08-21",
      "match_time": "15:00:00",
      "league_id": 4,
      "league_name": "English Premier League",
      "home_team": "Arsenal",
      "away_team": "Coventry City",
      "market": "alternate_spreads",
      "bookmaker": "DraftKings",
      "outcome": "Arsenal",
      "description": null,
      "line": -1.75,
      "price": -155,
      "scraped_at": "2026-08-16 11:25:27"
    }
  ],
  "meta": {
    "date_from": "2026-08-16", "date_to": "2026-08-19",
    "league_id": null, "match_id": null, "market": null,
    "page": 1, "per_page": 200, "total": 1287
  },
  "error": null
}

Field notes

  • outcome is the selection this row prices — a team name, "Over"/"Under", "Yes"/"No", etc., depending on market. For correct_score specifically, it's a compound string like "Espanyol:2|Levante:0" (home:score|away:score) rather than a plain label — parse on : and |.
  • line is the number attached to the bet (spread, total, corner count); null for markets with no line (e.g. btts).
  • price is the American odds for that outcome.
  • Coverage window is rolling — only fixtures inside the current scrape horizon (roughly the next 48h, wider on weekends) have rows here at all. Older/farther-out matches will simply return zero rows until they enter that window.
  • Row volume per match varies enormously by market — correct_score alone can be ~47 rows, btts as few as 2.

Errors

StatusMeaning
400Unrecognized market value (markets endpoint only)
401Missing, malformed, or invalid/revoked API key
429Rate limit exceeded

This is a stable, versioned contract (/v1/) — breaking changes will ship as /v2/, not silently.