Sports webhooks API

Register an HTTPS URL and we POST to it when a game goes live, the score changes, the status changes, a play happens or the game ends, optionally filtered by league. Data is aggregated from public sources and is typically 20-30 seconds behind live play (about 1 second after our source). There is no SLA.

Paths and parameters

GET/api/v1/webhooks

List your webhooks. Requires a paid plan.

GET/api/v1/webhooks/{webhookId}

Get a webhook

  • webhookId (path, required): Webhook id, as returned by GET /webhooks.

POST/api/v1/webhooks/{webhookId}/test

Send a test delivery. Sends a signed sample payload (header `X-Webhook-Test: true`), or replays a recorded failed delivery when `deliveryId` is given.

  • webhookId (path, required): Webhook id, as returned by GET /webhooks.

Create a webhook and handle deliveries

Create (curl)

curl -X POST "https://www.realtimesportsapi.com/api/v1/webhooks" \
  -H "Authorization: Bearer $RSA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://example.com/hooks/sports","events":["event.score_change","event.final"],"leagues":["nfl","eng.1"]}'

Delivery

// Headers
X-Webhook-Signature: 3f9a1c...   // lowercase hex HMAC-SHA256 of the raw body
X-Webhook-Event: event.score_change
Content-Type: application/json

// Body
{
  "event": "event.score_change",
  "timestamp": "2026-10-04T20:30:00.000Z",
  "data": {
    "eventId": "401772982",
    "sport": "football",
    "league": "nfl",
    "homeTeam": { "id": "2", "name": "Home Team", "score": 24 },
    "awayTeam": { "id": "3", "name": "Away Team", "score": 17 },
    "status": { "type": { "state": "in", "completed": false }, "period": 3 }
  }
}

Verify the signature (Node.js)

import crypto from "node:crypto";

function verify(rawBody, signature, secret) {
  const expected = crypto.createHmac("sha256", secret).update(rawBody).digest("hex");
  return crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(signature));
}

Event types: event.live, event.score_change, event.status_change, event.play, event.final. Frequency can be set from asap to 30m. Manage webhooks in the dashboard or with the /webhooks endpoints above.

Fields

FieldTypeNotes
idstring
urlstring
eventsWebhookEventType[]
leaguesstring[]League slugs to filter on; null = all leagues.
frequencyWebhookFrequency
activeboolean
consecutiveFailuresinteger
deactivatedReasonstring
deactivatedAtstring
createdAtstring
updatedAtstring

League support

All 29 monitored leagues: NFL, College Football, NBA, Men's College Basketball, MLB, NHL, MLS, U.S. Open Cup, Premier League, Champions League, Europa League, FA Cup, LaLiga, Serie A, Liga MX, FIFA World Cup, Women's Super League, Women's Champions League, Conference League, English League Cup, Bundesliga, Ligue 1, NWSL, EFL Championship, World Cup Qualifying (UEFA), World Cup Qualifying (CONMEBOL), World Cup Qualifying (AFC), World Cup Qualifying (CAF), World Cup Qualifying (CONCACAF). 29 leagues monitored live: NFL, college football, NBA, men's college basketball, MLB, NHL and 23 soccer competitions.

Rate limits and pricing

Webhooks are included on every paid plan (Starter, Growth, Pro, Scale). WebSocket is included on paid plans, and the Free plan gets a 500-message monthly preview.

PlanPriceCallsRateWebSocketWebhooks
Free$0125/mo (1,000 first 30 days)1/s500 msgs/moNo
Starter$29/mo ($290/yr)10,000/mo5/sShares monthly poolShares monthly pool
Growth$49/mo ($490/yr)25,000/mo10/sShares monthly poolShares monthly pool
Pro$99/mo ($990/yr)50,000/mo20/s100,000 msgs/mo25,000/mo
Scale$299/mo ($2,990/yr)500,000/mo100/s500,000 msgs/mo100,000/mo

Every successful REST call counts as one call. Over the limit you get HTTP 429 with a Retry-After header. No SLA. Full pricing.

FAQ

What does the webhooks endpoint return?
Register an HTTPS URL and we POST to it when a game goes live, the score changes, the status changes, a play happens or the game ends, optionally filtered by league.
Which plans include webhooks?
Webhooks are included on every paid plan (Starter, Growth, Pro, Scale). WebSocket is included on paid plans, and the Free plan gets a 500-message monthly preview.
Which events can trigger a webhook?
event.live, event.score_change, event.status_change, event.play and event.final, optionally filtered by league. Coverage: 29 leagues monitored live: NFL, college football, NBA, men's college basketball, MLB, NHL and 23 soccer competitions.
How do I verify a delivery?
Compute the lowercase hex HMAC-SHA256 of the raw request body with your webhook signing secret and compare it with the X-Webhook-Signature header. There is no sha256= prefix.
Do webhook deliveries count toward my quota?
Yes. On plans with a unified monthly pool, webhook deliveries count toward the same pool as REST calls.