NewRead the PFL API docs

The PFL API for developers.

Every Professional Fighters League card since the 2018 season as clean JSON: fight cards in running order, results with method, round and time, the upcoming schedule, and live fight status while a card runs. Fighters who also fought in the UFC keep their UFC ID.

  • Every card since 2018
  • Live fight status during a card
  • Same fighter IDs as UFC
GET /pfl/events/pfl-chicago-pettis-vs-mckee200 OK
$ curl "https://api.citoapi.com/api/v1/pfl/events/pfl-chicago-pettis-vs-mckee" \ -H "x-api-key: $CITO_API_KEY"
{  "success": true,  "data": {    "slug": "pfl-chicago-pettis-vs-mckee",    "name": "PFL Chicago: Pettis vs. McKee",    "date": "2026-04-11",    "venue": "Wintrust Arena",    "card": [      {        "id": "pfl-401861989",        "boutOrder": 1,        "weightClass": "Bantamweight",        "scheduledRounds": 5,        "status": "completed",        "winnerFighterSlug": "mitch-mckee",        "method": "Decision - Unanimous",        "resultRound": 3,        "resultTime": "5:00"      }    ]  }}

Seamless Integration with our MCP Server

Give Claude, Cursor, and ChatGPT the Cito MCP server. One command writes the MCP config; for PFL cards, results and live fight status, agents call the /pfl REST endpoints with your key, which stays on your machine.

MCPInstall the Cito MCP server
Claude
Cursor
OpenAI
Python
Cito API
Next.js
Discord
Slack
GitHub

Everything PFL

Cards, results, live fight status and fighters from every PFL season since 2018, from one API.

Every card since 2018

Every PFL card since the 2018 season, newest first, plus the upcoming schedule. There was no 2020 season.

Live fight status

During a card, the bout in the cage shows status live with the round and clock, and each result lands within a minute or two.

Results to the second

Winner, method ("Decision - Unanimous", "KO/TKO", "Submission"), round and time for every bout.

Cards in running order

boutOrder 1 is the main event; weight class, scheduled rounds and title fight flag on every bout.

Fighter profiles

Date of birth, height, reach, stance, PFL record and fight history, and the record going into a fight when published.

Same fighter IDs as UFC

sergio-pettis is the same id on /pfl and /ufc; ufcFighterSlug marks every fighter with a UFC record.

How does live PFL fight data work?

While a PFL card runs, /pfl/live returns it with every bout. The bout in the cage has status "live" and live.round / live.clock; finished bouts carry their winner, method, round and time within a minute or two of the result. Poll it every 30 to 60 seconds during a card. Between cards it returns an empty list with a note, and /pfl/events/upcoming lists the next cards.

On Free and Starter, live data arrives on the same 60-second delay as UFC live; Pro is real time.
FieldOn a live boutOn a finished bout
status"live""completed"
live{ round, clock }null
winnerFighterSlug / methodnull until the resulte.g. "mitch-mckee" / "Decision - Unanimous"
resultRound / resultTimenull until the resulte.g. 3 / "5:00"
GET /api/v1/pfl/live (between cards)
{
  "success": true,
  "data": [],
  "meta": {
    "total": 0,
    "note": "No PFL card is live right now. Next cards: /pfl/events/upcoming."
  }
}

Does the PFL API have strike stats?

No. The PFL publishes no official strike stats, so PFL bouts carry results only: winner, method, round, time, weight class, scheduled rounds and card order. The stats routes keep the same shape as /bellator and /ufc so shared code does not break: /pfl/bouts/{boutId}/stats returns availability "not_available" and /pfl/bouts/{boutId}/rounds is empty. For round-by-round MMA stats, use the UFC API or the Bellator archive.

  • Results: winner, method, round and time for every bout
  • Cards: running order, weight class, scheduled rounds, title fights
  • Fighters: date of birth, height, reach, stance, PFL record
  • Not available: significant strikes, takedowns, control time, round rows

How do PFL fighters link to their UFC record?

By the same slug. A PFL fighter who also has a UFC record keeps the id they have on /ufc/fighters/{slug}: sergio-pettis is the same id on both APIs. Every fighter object carries ufcFighterSlug (null without a UFC record), and /pfl/fighters?ufc=true lists only those fighters.

GET /api/v1/pfl/fighters/sergio-pettis
{
  "slug": "sergio-pettis",
  "name": "Sergio Pettis",
  "nickname": "The Phenom",
  "dateOfBirth": "1993-08-18",
  "heightIn": 66,
  "reachIn": 69,
  "stance": "Orthodox",
  "ufc": {
    "ufcFighterSlug": "sergio-pettis",
    "ufcFighterPath": "/api/v1/ufc/fighters/sergio-pettis"
  }
}

What is the first PFL endpoint to call?

Check the schedule with /pfl/events/upcoming, follow a card live with /pfl/live, and read finished cards with /pfl/events/recent and /pfl/events/{slug}.

curl
curl "https://api.citoapi.com/api/v1/pfl/events/upcoming" \
  -H "x-api-key: $CITO_API_KEY"

Endpoints you can ship with

Five groups, one UFC key. Follow a card live, open its results, then follow a fighter to their UFC record.

Live & upcoming

The bout in the cage shows status live with its round and clock, and each result lands within a minute or two. Poll every 30 to 60 seconds during a card.

View docs
  • GET/api/v1/pfl/live

    Cards running now with every bout: status, live.round and live.clock, results as they land.

  • GET/api/v1/pfl/events/upcoming

    Scheduled and running PFL cards, soonest first.

FAQs

Coverage, live data, plans and identity

Can't find what you're looking for? Contact our customer support team

Read the PFL docs

Build live fight trackers

Create a free key with UFC as your game and call your first PFL endpoint in a minute.