OKTAGON MMA API
OKTAGON MMA as clean JSON: every Oktagon card since Oktagon 1 (2016), the upcoming schedule, live fight status during a card, results, and round-by-round strikes landed by target, takedowns and submission attempts. Fighters with a UFC record keep their UFC slug. Bellator, PFL, PRIDE and the other promotions, and /mma across all of them, are in the MMA archive docs.
https://api.citoapi.com/api/v1Round stats count what landed
Oktagon's strike log records every strike that landed, with its round, target and whether it was significant, plus completed takedowns and submission attempts. Misses are not logged, so Oktagon stats come as plain landed counts in landed (significantStrikes, totalStrikes, head, body, leg, takedowns) with attemptsRecorded: false. The UFC-style "13 of 18" fields, accuracy, knockdowns, control time and position (distance, clinch, ground) are null: we never fill attempts with the landed number. Each bout's statsCoverage lists which fields exist and, when a bout has no stats, why.
Live fight status during a card
While an Oktagon card runs, /oktagon/live returns it with its bouts. The bout in the cage has status: "live" and its current round; finished bouts carry winner, method, round and time, and their round-by-round stats are written as soon as the bout is over. Between cards it returns an empty list with a note pointing to /oktagon/events/upcoming.
- Check
/oktagon/events/upcomingfor the card's date and start time. - From the start time, poll
/oktagon/liveevery 30 to 60 seconds. Faster polling does not get results sooner, it only spends requests. - When a bout finishes, read its rounds from
/oktagon/bouts/{boutId}/rounds.
curl "https://api.citoapi.com/api/v1/oktagon/live" \
-H "x-api-key: YOUR_API_KEY"
{
"success": true,
"data": [],
"meta": {
"total": 0,
"note": "No Oktagon card is live right now. Next cards: /oktagon/events/upcoming."
}
}What Oktagon data is available?
Round-level models
Landed strikes by target, takedowns and submission attempts per round for fight models and props.
Live fight trackers
Show which bout is in the cage and the round, then the result and its round stats as each fight ends.
Striking profiles
Head, body and leg shares per fighter across every Oktagon bout with stats.
Fight cards
Upcoming and past cards in running order, main event first, with weight class and scheduled rounds.
Matchup research
Head-to-head records between any two fighters on file, with every meeting.
One fighter, many promotions
Follow ufcFighterSlug to /ufc, or /mma/fighters/{slug} for the record in every promotion at once.
From the schedule to round stats
6 calls, real idsGET /oktagon/events/upcomingGET /oktagon/liveGET /oktagon/events/oktagon-95GET /oktagon/bouts/oktagon-1491/roundsGET /oktagon/fighters?ufc=trueGET /ufc/fighters/amiran-gogoladzePromotion & search
GET/api/v1/oktagonOktagonOverview: coverage window, counts (events, bouts, bouts with stats, fighters, fighters with a UFC record) and the endpoint list.
/api/v1/oktagoncurl "https://api.citoapi.com/api/v1/oktagon" \
-H "x-api-key: YOUR_API_KEY"GET/api/v1/oktagon/search?q=narkunSearchSearch fighters and events by name or nickname. Fighters carry ufcFighterSlug when they also have a UFC record.
/api/v1/oktagon/search?q=narkuncurl "https://api.citoapi.com/api/v1/oktagon/search?q=narkun" \
-H "x-api-key: YOUR_API_KEY"Live & upcoming
GET/api/v1/oktagon/liveLive MatchesCards running right now with their bouts. A bout in progress has status "live" and its round; finished bouts carry their result, and their round stats once the bout is over. Empty with a note in meta between cards.
/api/v1/oktagon/livecurl "https://api.citoapi.com/api/v1/oktagon/live" \
-H "x-api-key: YOUR_API_KEY"GET/api/v1/oktagon/events/upcomingUpcoming ScheduleScheduled Oktagon cards, soonest first, with venue, city and bout count.
/api/v1/oktagon/events/upcomingcurl "https://api.citoapi.com/api/v1/oktagon/events/upcoming" \
-H "x-api-key: YOUR_API_KEY"Events & fight cards
GET/api/v1/oktagon/eventsList EventsEvery Oktagon card on file, newest first, scheduled cards included. Filter by from, to or q.
/api/v1/oktagon/eventscurl "https://api.citoapi.com/api/v1/oktagon/events" \
-H "x-api-key: YOUR_API_KEY"GET/api/v1/oktagon/events/{slug}SlugOne event and its full card, main event first (slug e.g. oktagon-95), each bout with its whole-fight totals.
/api/v1/oktagon/events/{slug}curl "https://api.citoapi.com/api/v1/oktagon/events/{slug}" \
-H "x-api-key: YOUR_API_KEY"GET/api/v1/oktagon/events/{slug}/statsSlug StatsEvery bout on the card with whole-fight and round-by-round stat rows in one call.
/api/v1/oktagon/events/{slug}/statscurl "https://api.citoapi.com/api/v1/oktagon/events/{slug}/stats" \
-H "x-api-key: YOUR_API_KEY"Bouts & round stats
GET/api/v1/oktagon/bouts?fighter=tomasz-narkunEvent BoutsQuery bouts by fighter, opponent, event, weight class, method, title fight or date.
/api/v1/oktagon/bouts?fighter=tomasz-narkuncurl "https://api.citoapi.com/api/v1/oktagon/bouts?fighter=tomasz-narkun" \
-H "x-api-key: YOUR_API_KEY"GET/api/v1/oktagon/bouts/{boutId}BoutIdOne bout: status, result, method, round and time, weight class, referee, statsCoverage and both corners (boutId e.g. oktagon-1491).
/api/v1/oktagon/bouts/{boutId}curl "https://api.citoapi.com/api/v1/oktagon/bouts/{boutId}" \
-H "x-api-key: YOUR_API_KEY"GET/api/v1/oktagon/bouts/{boutId}/roundsBout RoundsRound-by-round rows per corner: landed significant and total strikes, head/body/leg, takedowns and submission attempts.
/api/v1/oktagon/bouts/{boutId}/roundscurl "https://api.citoapi.com/api/v1/oktagon/bouts/{boutId}/rounds" \
-H "x-api-key: YOUR_API_KEY"GET/api/v1/oktagon/bouts/{boutId}/statsBoutId StatsWhole-fight totals (round 0) plus the round rows.
/api/v1/oktagon/bouts/{boutId}/statscurl "https://api.citoapi.com/api/v1/oktagon/bouts/{boutId}/stats" \
-H "x-api-key: YOUR_API_KEY"Fighters & head-to-head
GET/api/v1/oktagon/fighters?ufc=trueList FightersEveryone who fought on an Oktagon card on file. ufc=true keeps only fighters who also have a UFC record.
/api/v1/oktagon/fighters?ufc=truecurl "https://api.citoapi.com/api/v1/oktagon/fighters?ufc=true" \
-H "x-api-key: YOUR_API_KEY"GET/api/v1/oktagon/fighters/{slug}SlugBio (date of birth, height, reach, stance), Oktagon record, the UFC pointer, other promotions and recent fights.
/api/v1/oktagon/fighters/{slug}curl "https://api.citoapi.com/api/v1/oktagon/fighters/{slug}" \
-H "x-api-key: YOUR_API_KEY"GET/api/v1/oktagon/fighters/{slug}/fightsFightsEvery Oktagon bout from the fighter's side, newest first, with opponent and outcome.
/api/v1/oktagon/fighters/{slug}/fightscurl "https://api.citoapi.com/api/v1/oktagon/fighters/{slug}/fights" \
-H "x-api-key: YOUR_API_KEY"GET/api/v1/oktagon/fighters/{slug}/statsSlug StatsCareer landed totals across the fighter's Oktagon bouts with stats. Attempts and accuracy stay null (not logged).
/api/v1/oktagon/fighters/{slug}/statscurl "https://api.citoapi.com/api/v1/oktagon/fighters/{slug}/stats" \
-H "x-api-key: YOUR_API_KEY"GET/api/v1/oktagon/h2h?fighter1=daniel-skvor&fighter2=tomasz-narkunH2hHead-to-head record and every meeting between two fighters (slugs or names).
/api/v1/oktagon/h2h?fighter1=daniel-skvor&fighter2=tomasz-narkuncurl "https://api.citoapi.com/api/v1/oktagon/h2h?fighter1=daniel-skvor&fighter2=tomasz-narkun" \
-H "x-api-key: YOUR_API_KEY"Round stats example
Oktagon 95 main event (October 17, 2026): Tomasz Narkun submitted Daniel Škvor at 2:29 of round 1. One row per corner per round; round 0 on /stats is the whole fight.
curl "https://api.citoapi.com/api/v1/oktagon/bouts/oktagon-1491/rounds" \
-H "x-api-key: YOUR_API_KEY"
{
"success": true,
"data": [
{
"boutId": "oktagon-1491",
"corner": "red",
"fighterSlug": "daniel-skvor",
"fighterName": "Daniel Škvor",
"round": 1,
"landed": { "significantStrikes": 4, "totalStrikes": 8, "head": 2, "body": 2, "leg": 0, "takedowns": 0 },
"submissionAttempts": 0,
"attemptsRecorded": false,
"significantStrikes": null, "totalStrikes": null, "takedowns": null,
"knockdowns": null, "controlTime": null, "distance": null, "clinch": null, "ground": null
},
{
"boutId": "oktagon-1491",
"corner": "blue",
"fighterSlug": "tomasz-narkun",
"fighterName": "Tomasz Narkun",
"round": 1,
"landed": { "significantStrikes": 6, "totalStrikes": 11, "head": 3, "body": 3, "leg": 0, "takedowns": 1 },
"submissionAttempts": 1,
"attemptsRecorded": false,
"significantStrikes": null, "totalStrikes": null, "takedowns": null,
"knockdowns": null, "controlTime": null, "distance": null, "clinch": null, "ground": null
}
],
"meta": { "boutId": "oktagon-1491", "count": 2, "round": null, "officialStats": true }
}Every bout on a card carries statsCoverage, so you know before reading the rows which fields are landed-only, which are counted, and which are not logged:
"statsCoverage": {
"available": true,
"landedOnly": ["significantStrikes", "totalStrikes", "head", "body", "leg", "takedowns"],
"counted": ["submissionAttempts"],
"notLogged": ["strikeAttempts", "takedownAttempts", "knockdowns", "reversals", "controlTime", "distance", "clinch", "ground"],
"defendedStrikesLogged": false
}Same fighter ID as UFC
An Oktagon fighter who also has a UFC record keeps the same slug on both APIs, so joining the two never needs a name match. We only link two records when the name and the date of birth both agree.
curl "https://api.citoapi.com/api/v1/oktagon/fighters?ufc=true&limit=2" \
-H "x-api-key: YOUR_API_KEY"
{
"success": true,
"data": [
{ "slug": "alan-omer", "name": "Alan Omer", "nickname": "MR. ERBIL",
"dateOfBirth": "1988-09-14", "stance": "Orthodox", "ufcFighterSlug": "alan-omer" },
{ "slug": "amiran-gogoladze", "name": "Amiran Gogoladze", "nickname": "THE SNIPER",
"dateOfBirth": "1997-12-09", "stance": null, "ufcFighterSlug": "amiran-gogoladze" }
],
"meta": { "page": 1, "limit": 2, "hasNextPage": true }
}For a fighter's record in every non-UFC promotion at once (Oktagon, PFL, Bellator and the rest), use /mma/fighters/{slug}, and /mma/bouts?promotion=oktagon queries Oktagon bouts through /mma.
Good to know
- Most bouts since Oktagon 1 have round stats. The 2020 Underground shows and a few early bouts have results only, and logs that fail our checks (incomplete rounds, strikes after the finish, mis-keyed corners) are left out rather than shown wrong;
statsCoverage.reasonsays which. - Card order is
boutOrder: 1 is the main event.resultRound/resultTimesay when the fight ended. - A fighter's record on /oktagon counts the Oktagon fights on file only, not their full career.
- Like /ufc, in-depth data follows your plan's history window, with the reason in
meta.historyWindowwhen a record is outside it. - Aliases are accepted:
/oktagon/athletesmaps to fighters,/oktagon/fight-cardsto events and/oktagon/head-to-headto h2h. OpenAPI spec: api.citoapi.com/api/v1/openapi.json
Included with the MMA plan
Oktagon comes with UFC and every other fight promotion we carry, no extra game to add.