Docs/API Reference/OKTAGON MMA API

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.

BASEhttps://api.citoapi.com/api/v1
OKTAGON MMA API RootAppend any endpoint path below.

Round 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/upcoming for the card's date and start time.
  • From the start time, poll /oktagon/live every 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?

Every Oktagon card since Oktagon 1 (December 2016), newest first, plus the upcoming schedule
Card order of every bout (boutOrder 1 = main event), weight class, scheduled rounds and title fight flag
Results: winner, method, round, time and referee
Round-by-round significant and total strikes landed, per corner, on most bouts
Significant strikes landed by target: head, body and leg
Takedowns landed and submission attempts per round
Live fight status during a card, with round stats written as each bout ends
Fighters who also have a UFC record on the same slug as /ufc/fighters/{slug}

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

1See what is scheduled
GET /oktagon/events/upcoming
2Watch a card while it runs
GET /oktagon/live
3Open a card
GET /oktagon/events/oktagon-95
4Read a fight round by round
GET /oktagon/bouts/oktagon-1491/rounds
5Find fighters with a UFC record
GET /oktagon/fighters?ufc=true
6Open the same fighter on UFC
GET /ufc/fighters/amiran-gogoladze

Promotion & search

GET/api/v1/oktagon
OktagonOverview: coverage window, counts (events, bouts, bouts with stats, fighters, fighters with a UFC record) and the endpoint list.

Summary

Overview: coverage window, counts (events, bouts, bouts with stats, fighters, fighters with a UFC record) and the endpoint list.

REST
Bash
curl "https://api.citoapi.com/api/v1/oktagon" \
  -H "x-api-key: YOUR_API_KEY"
GET/api/v1/oktagon/search?q=narkun
SearchSearch fighters and events by name or nickname. Fighters carry ufcFighterSlug when they also have a UFC record.

Summary

Search fighters and events by name or nickname. Fighters carry ufcFighterSlug when they also have a UFC record.

REST
Bash
curl "https://api.citoapi.com/api/v1/oktagon/search?q=narkun" \
  -H "x-api-key: YOUR_API_KEY"

Live & upcoming

GET/api/v1/oktagon/live
Live 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.

Summary

Cards 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.

REST
Bash
curl "https://api.citoapi.com/api/v1/oktagon/live" \
  -H "x-api-key: YOUR_API_KEY"
GET/api/v1/oktagon/events/upcoming
Upcoming ScheduleScheduled Oktagon cards, soonest first, with venue, city and bout count.

Summary

Scheduled Oktagon cards, soonest first, with venue, city and bout count.

REST
Bash
curl "https://api.citoapi.com/api/v1/oktagon/events/upcoming" \
  -H "x-api-key: YOUR_API_KEY"

Events & fight cards

GET/api/v1/oktagon/events
List EventsEvery Oktagon card on file, newest first, scheduled cards included. Filter by from, to or q.

Summary

Every Oktagon card on file, newest first, scheduled cards included. Filter by from, to or q.

REST
Bash
curl "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.

Summary

One event and its full card, main event first (slug e.g. oktagon-95), each bout with its whole-fight totals.

REST
Bash
curl "https://api.citoapi.com/api/v1/oktagon/events/{slug}" \
  -H "x-api-key: YOUR_API_KEY"
GET/api/v1/oktagon/events/{slug}/stats
Slug StatsEvery bout on the card with whole-fight and round-by-round stat rows in one call.

Summary

Every bout on the card with whole-fight and round-by-round stat rows in one call.

REST
Bash
curl "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-narkun
Event BoutsQuery bouts by fighter, opponent, event, weight class, method, title fight or date.

Summary

Query bouts by fighter, opponent, event, weight class, method, title fight or date.

REST
Bash
curl "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).

Summary

One bout: status, result, method, round and time, weight class, referee, statsCoverage and both corners (boutId e.g. oktagon-1491).

REST
Bash
curl "https://api.citoapi.com/api/v1/oktagon/bouts/{boutId}" \
  -H "x-api-key: YOUR_API_KEY"
GET/api/v1/oktagon/bouts/{boutId}/rounds
Bout RoundsRound-by-round rows per corner: landed significant and total strikes, head/body/leg, takedowns and submission attempts.

Summary

Round-by-round rows per corner: landed significant and total strikes, head/body/leg, takedowns and submission attempts.

REST
Bash
curl "https://api.citoapi.com/api/v1/oktagon/bouts/{boutId}/rounds" \
  -H "x-api-key: YOUR_API_KEY"
GET/api/v1/oktagon/bouts/{boutId}/stats
BoutId StatsWhole-fight totals (round 0) plus the round rows.

Summary

Whole-fight totals (round 0) plus the round rows.

REST
Bash
curl "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=true
List FightersEveryone who fought on an Oktagon card on file. ufc=true keeps only fighters who also have a UFC record.

Summary

Everyone who fought on an Oktagon card on file. ufc=true keeps only fighters who also have a UFC record.

REST
Bash
curl "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.

Summary

Bio (date of birth, height, reach, stance), Oktagon record, the UFC pointer, other promotions and recent fights.

REST
Bash
curl "https://api.citoapi.com/api/v1/oktagon/fighters/{slug}" \
  -H "x-api-key: YOUR_API_KEY"
GET/api/v1/oktagon/fighters/{slug}/fights
FightsEvery Oktagon bout from the fighter's side, newest first, with opponent and outcome.

Summary

Every Oktagon bout from the fighter's side, newest first, with opponent and outcome.

REST
Bash
curl "https://api.citoapi.com/api/v1/oktagon/fighters/{slug}/fights" \
  -H "x-api-key: YOUR_API_KEY"
GET/api/v1/oktagon/fighters/{slug}/stats
Slug StatsCareer landed totals across the fighter's Oktagon bouts with stats. Attempts and accuracy stay null (not logged).

Summary

Career landed totals across the fighter's Oktagon bouts with stats. Attempts and accuracy stay null (not logged).

REST
Bash
curl "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-narkun
H2hHead-to-head record and every meeting between two fighters (slugs or names).

Summary

Head-to-head record and every meeting between two fighters (slugs or names).

REST
Bash
curl "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.reason says which.
  • Card order is boutOrder: 1 is the main event. resultRound / resultTime say 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.historyWindow when a record is outside it.
  • Aliases are accepted: /oktagon/athletes maps to fighters, /oktagon/fight-cards to events and /oktagon/head-to-head to 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. Free keys see 30 days of history and Starter ($15/month) 90 days; Pro ($59/month) has the full archive back to 2016. On Free and Starter, live data arrives on a 60-second delay, as on UFC live; Pro is real time.