UFC Live API
Real-time fight-night clocks, live bout state, and push transport for scoreboards, bots, and betting tools.
https://api.citoapi.com/api/v1Live REST is ready — poll ~1–2s during fight night
Use GET /api/v1/ufc/live for the active card, thenGET /api/v1/ufc/live/{boutId} for the current bout (clock, fighters, stats when present). Honor recommendedPollSeconds and lagSeconds in the response.
GET /api/v1/ufc/liveGet an API keyWebSockets — upgraded paid plan
Coming soonwss://api.citoapi.com/api/v1/ufc/live/ws is rolling out as a paid-plan upgrade for teams that want push instead of polling. Room subscribe for bout:{id} and event:{slug}. Final fight-week validation is scheduled before full production rollout.
- • Auth: same
x-api-key/ Bearer as REST (header preferred; query allowed for browsers) - • Events:
ready,subscribed,ufc.live.update,ping - • SSE is available today at
GET /api/v1/ufc/live/streamfor push-style clients
What live payloads include
Fight-night clocks
Round number and remaining time when FightMetric / card sources publish a live clock. Empty sources stay honest (no invented clocks).
Push transport
SSE stream is live today. WebSocket rooms (bout + event) ship soon on the upgraded paid plan.
Lag metadata
Every live response includes lagSeconds and recommendedPollSeconds so clients can tune refresh without over-polling.
Quickstart — live overview
curl "https://api.citoapi.com/api/v1/ufc/live" \
-H "x-api-key: YOUR_API_KEY"{
"success": true,
"data": {
"liveBouts": [
{
"boutId": "ufc-12938",
"fightMetricId": "12938",
"status": "live",
"currentRound": 3,
"currentTime": "2:27",
"red": { "fighterName": "Fighter A" },
"blue": { "fighterName": "Fighter B" },
"lagSeconds": 2,
"recommendedPollSeconds": 2,
"source": "ufc_fightmetric_cdn"
}
],
"events": [
{
"eventSlug": "ufc-fight-night-example",
"status": "live",
"currentLiveFmid": "12938",
"recommendedPollSeconds": 2
}
]
},
"meta": {
"stream": "/api/v1/ufc/live/stream",
"websocket": "/api/v1/ufc/live/ws"
}
}One bout detail
curl "https://api.citoapi.com/api/v1/ufc/live/ufc-12938" \
-H "x-api-key: YOUR_API_KEY"Accepts ufc-{fightMetricId} or bare {fightMetricId}. Response may include liveStats (sig strikes, takedowns, control) and recentActions when the feed has them.
SSE stream (available now)
Prefer SSE when you want push without waiting on WebSocket plan rollout. Filter with boutId and/or eventSlug. Events: ready, ufc.live.update, ufc.live.snapshot, ping (every ~15s).
curl -N "https://api.citoapi.com/api/v1/ufc/live/stream?eventSlug=ufc-fight-night-example" \
-H "x-api-key: YOUR_API_KEY" \
-H "Accept: text/event-stream"WebSocket contract (paid · soon)
Endpoint: wss://api.citoapi.com/api/v1/ufc/live/ws
- Client:
{ "action": "subscribe", "rooms": ["bout:ufc-12938"] } - Client:
{ "action": "ping" } - Server:
ufc.live.updateenvelopes with the same core fields as REST - Rooms:
bout:{boutId},event:{eventSlug}
Full contract is also exposed at GET /api/v1/ufc/live/{boutId}/socket.
Plan note
WebSocket access is part of the upcoming upgraded paid plan. REST + SSE remain the supported production path while WS finishes fight-week soak testing.
Open billing plansLive endpoints
Read-only live paths. The API host fans out from Redis; scrape workers run separately.
GET/api/v1/ufc/liveLive OverviewLive card overview: currently live/watching bouts, event supervisor rows, lagSeconds, recommendedPollSeconds.
/api/v1/ufc/livecurl "https://api.citoapi.com/api/v1/ufc/live" \
-H "x-api-key: YOUR_API_KEY"GET/api/v1/ufc/live/eventsLive EventsSupervisor state for fight-night events tracked by the live worker.
/api/v1/ufc/live/eventscurl "https://api.citoapi.com/api/v1/ufc/live/events" \
-H "x-api-key: YOUR_API_KEY"GET/api/v1/ufc/live/events/{slug}Live Event DetailLive event row + bout tracking for one event slug.
/api/v1/ufc/live/events/{slug}curl "https://api.citoapi.com/api/v1/ufc/live/events/{slug}" \
-H "x-api-key: YOUR_API_KEY"GET/api/v1/ufc/events/{slug}/liveLive MatchesAlias of /ufc/live/events/{slug}.
/api/v1/ufc/events/{slug}/livecurl "https://api.citoapi.com/api/v1/ufc/events/{slug}/live" \
-H "x-api-key: YOUR_API_KEY"GET/api/v1/ufc/live/{boutId}Live BoutLive bout payload (ufc-{fightMetricId} or bare fmid) with clock, fighters, lag metadata.
/api/v1/ufc/live/{boutId}curl "https://api.citoapi.com/api/v1/ufc/live/{boutId}" \
-H "x-api-key: YOUR_API_KEY"GET/api/v1/ufc/live/{boutId}/stateLive Bout StateCompact live state (Redis preferred) for polling clients.
/api/v1/ufc/live/{boutId}/statecurl "https://api.citoapi.com/api/v1/ufc/live/{boutId}/state" \
-H "x-api-key: YOUR_API_KEY"GET/api/v1/ufc/live/{boutId}/snapshotsLive SnapshotsHash-diffed live snapshots for one bout.
/api/v1/ufc/live/{boutId}/snapshotscurl "https://api.citoapi.com/api/v1/ufc/live/{boutId}/snapshots" \
-H "x-api-key: YOUR_API_KEY"GET/api/v1/ufc/live/healthLive HealthLive worker health and heartbeat lag.
/api/v1/ufc/live/healthcurl "https://api.citoapi.com/api/v1/ufc/live/health" \
-H "x-api-key: YOUR_API_KEY"GET/api/v1/ufc/live/streamLive SSE StreamSSE push feed from Redis ufc:live:updates. Filter with boutId and/or eventSlug.
/api/v1/ufc/live/streamcurl "https://api.citoapi.com/api/v1/ufc/live/stream" \
-H "x-api-key: YOUR_API_KEY"GET/api/v1/ufc/live/{boutId}/socketLive Transport ContractTransport contract docs for SSE + WebSocket auth, rooms, and envelope shape.
/api/v1/ufc/live/{boutId}/socketcurl "https://api.citoapi.com/api/v1/ufc/live/{boutId}/socket" \
-H "x-api-key: YOUR_API_KEY"Build on UFC Live
Start with free REST polling, wire SSE for push, and upgrade when WebSockets open on the paid plan.