PFL API
The Professional Fighters League as clean JSON: every PFL card since the 2018 season, the upcoming schedule, live fight status during a card, results with method, round and time, fighter profiles and head-to-head. Fighters with a UFC record keep their UFC slug. New to it? Start with the PFL API overview. Bellator, PRIDE, Strikeforce and the other promotions, and /mma across all of them, are in the MMA archive docs.
https://api.citoapi.com/api/v1Results only: no strike stats
The PFL publishes no official strike stats, so PFL bouts carry results only: winner, method, round, time, weight class, scheduled rounds and card order. There are no significant strikes, takedowns, control time or round-by-round rows for PFL fights. The stats routes still answer, so code written for /bellator or /ufc does not break: /pfl/bouts/{boutId}/stats returns availability: "not_available", /pfl/bouts/{boutId}/rounds is an empty list, and every bout has hasStats: false and officialStats: false.
Live fight status during a card
While a PFL card runs, /pfl/live returns it with its bouts. The bout in the cage has status: "live" and live: { round, clock }; finished bouts carry their winner, method, round and time within a minute or two of the result. Between cards it returns an empty list with a note in meta pointing to the schedule, and /pfl/events/upcoming lists the next cards, soonest first.
- Check
/pfl/events/upcomingfor the card's date and start time. - From the start time, poll
/pfl/liveevery 30 to 60 seconds. Faster polling does not get results sooner, it only spends requests. - Stop when the list is empty again, then read the finished card from
/pfl/events/{slug}.
curl "https://api.citoapi.com/api/v1/pfl/live" \
-H "x-api-key: YOUR_API_KEY"
{
"success": true,
"data": [],
"meta": {
"total": 0,
"note": "No PFL card is live right now. Next cards: /pfl/events/upcoming."
}
}// Poll every 45 s while a card runs; log each bout's status, round and clock.
const res = await fetch("https://api.citoapi.com/api/v1/pfl/live", {
headers: { "x-api-key": process.env.CITO_API_KEY },
});
const { data } = await res.json();
for (const card of data) {
for (const bout of card.card ?? []) {
if (bout.status === "live") console.log(bout.id, "round", bout.live?.round, bout.live?.clock);
else if (bout.status === "completed") console.log(bout.id, bout.winnerFighterSlug, bout.method, bout.resultRound, bout.resultTime);
}
}What PFL data is available?
Live fight trackers
Show which bout is in the cage, the round and the clock, and each result a minute or two after it lands.
Results feeds
Winner, method, round and time for every PFL bout since 2018, for apps, bots and results pages.
Fight cards
Upcoming and past cards in running order, main event first, with weight class and scheduled rounds.
Fighter pages
Bio, PFL record and fight history, linked to the fighter's UFC record where one exists.
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 the same fighter on UFC
6 calls, real idsGET /pfl/events/upcomingGET /pfl/liveGET /pfl/events/pfl-chicago-pettis-vs-mckeeGET /pfl/bouts/pfl-401861989GET /pfl/fighters/sergio-pettisGET /ufc/fighters/sergio-pettisPromotion & search
GET/api/v1/pflPflOverview: coverage window (first and last event), counts (events, bouts, fighters, fighters with a UFC record) and the endpoint list.
/api/v1/pflcurl "https://api.citoapi.com/api/v1/pfl" \
-H "x-api-key: YOUR_API_KEY"GET/api/v1/pfl/search?q=pettisSearchSearch fighters and events by name or nickname. Fighters carry ufcFighterSlug when they also have a UFC record.
/api/v1/pfl/search?q=pettiscurl "https://api.citoapi.com/api/v1/pfl/search?q=pettis" \
-H "x-api-key: YOUR_API_KEY"Live & upcoming
GET/api/v1/pfl/liveLive MatchesCards running right now with their bouts. A bout in progress has status "live" and live.round / live.clock; finished bouts carry their result within a minute or two. Empty with a note in meta between cards.
/api/v1/pfl/livecurl "https://api.citoapi.com/api/v1/pfl/live" \
-H "x-api-key: YOUR_API_KEY"GET/api/v1/pfl/events/upcomingUpcoming ScheduleScheduled and running PFL cards, soonest first. Empty with a note in meta when nothing is scheduled yet.
/api/v1/pfl/events/upcomingcurl "https://api.citoapi.com/api/v1/pfl/events/upcoming" \
-H "x-api-key: YOUR_API_KEY"Events & fight cards
GET/api/v1/pfl/eventsList EventsEvery PFL card on file, newest first, scheduled cards included. Filter by from, to or q.
/api/v1/pfl/eventscurl "https://api.citoapi.com/api/v1/pfl/events" \
-H "x-api-key: YOUR_API_KEY"GET/api/v1/pfl/events/recentRecent MatchesCompleted cards only, newest first.
/api/v1/pfl/events/recentcurl "https://api.citoapi.com/api/v1/pfl/events/recent" \
-H "x-api-key: YOUR_API_KEY"GET/api/v1/pfl/events/{slug}SlugOne event and its full card, main event first (slug e.g. pfl-chicago-pettis-vs-mckee).
/api/v1/pfl/events/{slug}curl "https://api.citoapi.com/api/v1/pfl/events/{slug}" \
-H "x-api-key: YOUR_API_KEY"GET/api/v1/pfl/events/{slug}/boutsEvent BoutsEvery bout on the card in card order (boutOrder 1 = main event) with weight class, scheduled rounds, winner, method, round and time.
/api/v1/pfl/events/{slug}/boutscurl "https://api.citoapi.com/api/v1/pfl/events/{slug}/bouts" \
-H "x-api-key: YOUR_API_KEY"Bouts
GET/api/v1/pfl/bouts?fighter=sergio-pettisEvent BoutsQuery bouts by fighter, opponent, event, weight class, method, title fight or date.
/api/v1/pfl/bouts?fighter=sergio-pettiscurl "https://api.citoapi.com/api/v1/pfl/bouts?fighter=sergio-pettis" \
-H "x-api-key: YOUR_API_KEY"GET/api/v1/pfl/bouts/{boutId}BoutIdOne bout: status, live round and clock while it runs, result, method, round and time, weight class, scheduled rounds and both corners (boutId e.g. pfl-401861989).
/api/v1/pfl/bouts/{boutId}curl "https://api.citoapi.com/api/v1/pfl/bouts/{boutId}" \
-H "x-api-key: YOUR_API_KEY"Fighters & head-to-head
GET/api/v1/pfl/fighters?ufc=trueList FightersEveryone who fought on a PFL card on file. ufc=true keeps only fighters who also have a UFC record.
/api/v1/pfl/fighters?ufc=truecurl "https://api.citoapi.com/api/v1/pfl/fighters?ufc=true" \
-H "x-api-key: YOUR_API_KEY"GET/api/v1/pfl/fighters/{slug}SlugBio (date of birth, height, reach, stance), PFL record, the UFC pointer, other promotions and the last five PFL fights.
/api/v1/pfl/fighters/{slug}curl "https://api.citoapi.com/api/v1/pfl/fighters/{slug}" \
-H "x-api-key: YOUR_API_KEY"GET/api/v1/pfl/fighters/{slug}/fightsFightsEvery PFL bout from the fighter's side, newest first, with opponent and outcome.
/api/v1/pfl/fighters/{slug}/fightscurl "https://api.citoapi.com/api/v1/pfl/fighters/{slug}/fights" \
-H "x-api-key: YOUR_API_KEY"GET/api/v1/pfl/fighters/{slug}/statsSlug StatsKept for the same route shape as /bellator and /ufc. The PFL publishes no strike stats, so there are no strike or takedown numbers to total; use /fights for results.
/api/v1/pfl/fighters/{slug}/statscurl "https://api.citoapi.com/api/v1/pfl/fighters/{slug}/stats" \
-H "x-api-key: YOUR_API_KEY"GET/api/v1/pfl/h2h?fighter1=sergio-pettis&fighter2=mitch-mckeeH2hHead-to-head record and every meeting between two fighters (slugs or names).
/api/v1/pfl/h2h?fighter1=sergio-pettis&fighter2=mitch-mckeecurl "https://api.citoapi.com/api/v1/pfl/h2h?fighter1=sergio-pettis&fighter2=mitch-mckee" \
-H "x-api-key: YOUR_API_KEY"Event example
PFL Chicago (April 11, 2026), main event first. The response holds all ten bouts; this is the first of them.
curl "https://api.citoapi.com/api/v1/pfl/events/pfl-chicago-pettis-vs-mckee" \
-H "x-api-key: YOUR_API_KEY"
{
"success": true,
"data": {
"slug": "pfl-chicago-pettis-vs-mckee",
"promotion": "pfl",
"name": "PFL Chicago: Pettis vs. McKee",
"headline": "Pettis vs. McKee",
"status": "completed",
"startsAt": "2026-04-11T22:00:00.000Z",
"date": "2026-04-11",
"venue": "Wintrust Arena",
"location": "Wintrust Arena, Chicago, IL, USA",
"boutCount": 10,
"hasStats": false,
"card": [
{
"id": "pfl-401861989",
"boutOrder": 1,
"weightClass": "Bantamweight",
"titleFight": false,
"scheduledRounds": 5,
"status": "completed",
"live": null,
"result": "win",
"winnerFighterSlug": "mitch-mckee",
"method": "Decision - Unanimous",
"resultRound": 3,
"resultTime": "5:00",
"officialStats": false,
"hasStats": false,
"fighters": [
{ "corner": "red", "fighterSlug": "sergio-pettis", "fighterName": "Sergio Pettis",
"outcome": "loss", "ufcFighterSlug": "sergio-pettis", "totals": null },
{ "corner": "blue", "fighterSlug": "mitch-mckee", "fighterName": "Mitch McKee",
"outcome": "win", "ufcFighterSlug": null, "totals": null }
]
}
]
},
"meta": {}
}totals is null on PFL bouts because there are no strike stats. When the PFL publishes a fighter's record going into the fight, the corner also carries recordAtFight.
Same fighter ID as UFC
A PFL fighter who also has a UFC record keeps the same slug on both APIs: sergio-pettis is the same id on /pfl and /ufc. Every fighter object carries ufcFighterSlug (null when there is no UFC record), and the profile adds the UFC path, so joining the two promotions never needs a name match.
curl "https://api.citoapi.com/api/v1/pfl/fighters/sergio-pettis" \
-H "x-api-key: YOUR_API_KEY"
{
"slug": "sergio-pettis",
"name": "Sergio Pettis",
"nickname": "The Phenom",
"dateOfBirth": "1993-08-18",
"heightIn": 66,
"reachIn": 69,
"stance": "Orthodox",
"born": { "city": null, "state": null, "country": "USA" },
"record": { "wins": 0, "losses": 1, "draws": 0, "noContests": 0, "text": "0-1-0" },
"recordNote": "Record in PFL fights in our archive (2018-present), not the fighter's full career.",
"ufc": {
"ufcFighterSlug": "sergio-pettis",
"ufcFighterPath": "/api/v1/ufc/fighters/sergio-pettis"
},
"otherPromotions": [],
"recentFights": [ "…the last five PFL bouts, same shape as the card above" ]
}Filter the directory to these fighters with /pfl/fighters?ufc=true. For a fighter's record in every non-UFC promotion at once (PFL, Bellator, PRIDE, Strikeforce and the rest), use /mma/fighters/{slug}, and /mma/bouts?promotion=pfl queries PFL bouts through /mma. For a whole pro career including UFC fights, the UFC career endpoint.
Good to know
- Coverage starts with the 2018 season. There was no 2020 PFL season, so there are no 2020 cards.
/pfl/eventslists every card, scheduled ones included;/pfl/events/recentkeeps completed cards only.- Card order is
boutOrder: 1 is the main event.scheduledRoundsis 3 or 5, andresultRound/resultTimesay when the fight ended. - A fighter's record on /pfl counts the PFL fights on file only, as
recordNotesays, not their full career. - Like /ufc, in-depth data follows your plan's history window. Older records are left out of lists and refused outside it, with the reason in
meta.historyWindow. The dashboard sandbox opens any archive record before you upgrade. - Aliases are accepted:
/pfl/athletesmaps to fighters,/pfl/fight-cardsto events and/pfl/head-to-headto h2h. OpenAPI spec (tag "PFL"): api.citoapi.com/api/v1/openapi.json
Included with UFC
The PFL comes with UFC on every plan, no extra game to add. Cards, results and fighters work on a free key within your plan's history window, and live PFL data follows the UFC live rules.