UFC API in Python

Load UFC cards and fighter records with requests. Free 500 calls a month.

python · requests
import os
import requests

API = "https://api.citoapi.com/api/v1/ufc"
headers = {"x-api-key": os.environ["CITO_API_KEY"]}

card = requests.get(
    f"{API}/events/upcoming",
    params={"includeBouts": "true", "limit": 5},
    headers=headers,
    timeout=20,
)
card.raise_for_status()
event = card.json()["data"][0]
print(event.get("title") or event.get("name"))

for bout in event.get("bouts") or []:
    fighters = bout.get("fighters") or []
    names = " vs ".join(
        f.get("fighterName") or f.get("name") or "?"
        for f in fighters
    )
    print(bout.get("cardPosition") or bout.get("cardSection"), names)

fighter = requests.get(
    f"{API}/fighters/islam-makhachev",
    headers=headers,
    timeout=20,
)
fighter.raise_for_status()
print(fighter.json()["data"]["recordText"])
json · upcoming event
{
  "success": true,
  "data": [
    {
      "slug": "ufc-fight-night-august-29-2026",
      "title": "UFC Fight Night: Nurmagomedov vs Song",
      "startsAt": "2026-08-28T09:00:00.000Z",
      "bouts": [
        {
          "cardSection": "Main Card",
          "boutOrder": 1001,
          "fighters": [
            { "fighterName": "Umar Nurmagomedov", "corner": "red" },
            { "fighterName": "Song Yadong", "corner": "blue" }
          ]
        }
      ]
    }
  ]
}

What data is returned

x-api-key
Send your Cito key on every request, not Authorization Bearer
GET /events/upcoming
Next cards. includeBouts=true returns the fight list
GET /fighters/{slug}
Profile and W-L-D record
GET /fighters/{slug}/fights
Fight history when you need more than the record
Free tier
500 requests/month. Upgrade when you automate

When to use this

  • Scripts that print tonight's card or a fighter record
  • Notebooks and research jobs that should not scrape HTML
  • A Discord or site bot you later wrap around the same calls

Full reference docs citoapi.com/docs/api/ufc

Get your free UFC API key