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.
- Deliveries are signed with HMAC-SHA256 in the X-Webhook-Signature header.
- A webhook is deactivated after 5 consecutive failed deliveries; re-enable it once the endpoint is fixed.
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
| Field | Type | Notes |
|---|---|---|
| id | string | |
| url | string | |
| events | WebhookEventType[] | |
| leagues | string[] | League slugs to filter on; null = all leagues. |
| frequency | WebhookFrequency | |
| active | boolean | |
| consecutiveFailures | integer | |
| deactivatedReason | string | |
| deactivatedAt | string | |
| createdAt | string | |
| updatedAt | string |
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.
| Plan | Price | Calls | Rate | WebSocket | Webhooks |
|---|---|---|---|---|---|
| Free | $0 | 125/mo (1,000 first 30 days) | 1/s | 500 msgs/mo | No |
| Starter | $29/mo ($290/yr) | 10,000/mo | 5/s | Shares monthly pool | Shares monthly pool |
| Growth | $49/mo ($490/yr) | 25,000/mo | 10/s | Shares monthly pool | Shares monthly pool |
| Pro | $99/mo ($990/yr) | 50,000/mo | 20/s | 100,000 msgs/mo | 25,000/mo |
| Scale | $299/mo ($2,990/yr) | 500,000/mo | 100/s | 500,000 msgs/mo | 100,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.