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.

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

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

Every PFL card since the 2018 season (there was no 2020 season), newest first
Upcoming cards, soonest first, and the card order of every bout (boutOrder 1 = main event)
Live fight status during a card: status "live" with the current round and clock
Results within a minute or two of each fight: winner, method, round and time
Methods as published, e.g. "Decision - Unanimous", "KO/TKO", "Submission"
Weight class, scheduled rounds and title fight flag for every bout
Fighter profiles with date of birth, height, reach and stance, and recordAtFight on each corner when published
Fighters who also have a UFC record on the same slug as /ufc/fighters/{slug}

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

1See what is scheduled
GET /pfl/events/upcoming
2Watch a card while it runs
GET /pfl/live
3Open a card
GET /pfl/events/pfl-chicago-pettis-vs-mckee
4Open a result
GET /pfl/bouts/pfl-401861989
5Profile a fighter
GET /pfl/fighters/sergio-pettis
6Open the same fighter on UFC
GET /ufc/fighters/sergio-pettis

Promotion & search

GET/api/v1/pfl
PflOverview: coverage window (first and last event), counts (events, bouts, fighters, fighters with a UFC record) and the endpoint list.

Summary

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

REST
Bash
curl "https://api.citoapi.com/api/v1/pfl" \
  -H "x-api-key: YOUR_API_KEY"
GET/api/v1/pfl/search?q=pettis
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/pfl/search?q=pettis" \
  -H "x-api-key: YOUR_API_KEY"

Live & upcoming

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

Summary

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

REST
Bash
curl "https://api.citoapi.com/api/v1/pfl/live" \
  -H "x-api-key: YOUR_API_KEY"
GET/api/v1/pfl/events/upcoming
Upcoming ScheduleScheduled and running PFL cards, soonest first. Empty with a note in meta when nothing is scheduled yet.

Summary

Scheduled and running PFL cards, soonest first. Empty with a note in meta when nothing is scheduled yet.

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

Events & fight cards

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

Summary

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

REST
Bash
curl "https://api.citoapi.com/api/v1/pfl/events" \
  -H "x-api-key: YOUR_API_KEY"
GET/api/v1/pfl/events/recent
Recent MatchesCompleted cards only, newest first.

Summary

Completed cards only, newest first.

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

Summary

One event and its full card, main event first (slug e.g. pfl-chicago-pettis-vs-mckee).

REST
Bash
curl "https://api.citoapi.com/api/v1/pfl/events/{slug}" \
  -H "x-api-key: YOUR_API_KEY"
GET/api/v1/pfl/events/{slug}/bouts
Event BoutsEvery bout on the card in card order (boutOrder 1 = main event) with weight class, scheduled rounds, winner, method, round and time.

Summary

Every bout on the card in card order (boutOrder 1 = main event) with weight class, scheduled rounds, winner, method, round and time.

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

Summary

One 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).

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

Summary

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

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

Summary

Bio (date of birth, height, reach, stance), PFL record, the UFC pointer, other promotions and the last five PFL fights.

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

Summary

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

REST
Bash
curl "https://api.citoapi.com/api/v1/pfl/fighters/{slug}/fights" \
  -H "x-api-key: YOUR_API_KEY"
GET/api/v1/pfl/fighters/{slug}/stats
Slug 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.

Summary

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

REST
Bash
curl "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-mckee
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/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/events lists every card, scheduled ones included; /pfl/events/recent keeps completed cards only.
  • Card order is boutOrder: 1 is the main event. scheduledRounds is 3 or 5, and resultRound / resultTime say when the fight ended.
  • A fighter's record on /pfl counts the PFL fights on file only, as recordNote says, 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/athletes maps to fighters, /pfl/fight-cards to events and /pfl/head-to-head to 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. Free keys see 30 days of history and Starter ($15/month) 90 days; Pro ($59/month) has the full archive back to 2018. On Free and Starter, live data arrives on a 60-second delay, as on UFC live; Pro is real time.