UFC API in Python
Load UFC cards and fighter records with requests. Free 500 calls a month.
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"]){
"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-keySend your Cito key on every request, not Authorization Bearer
GET /events/upcomingNext cards. includeBouts=true returns the fight list
GET /fighters/{slug}Profile and W-L-D record
GET /fighters/{slug}/fightsFight history when you need more than the record
Free tier500 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