College football play-by-play API

Every play of an FBS college football game, live or final, in order: the play text, type, clock, quarter and score after the play. Page through a full game, or have each new play pushed to you.

Data is aggregated from public sources and is typically 20-30 seconds behind live play (about 1 second after our source). There is no SLA.

AvailableReturned College Football data when checked.

Endpoint

  • GET/api/v1/sports/football/leagues/college-football/events/{eventId}/plays

Live College Football example

Request

curl -H "Authorization: Bearer $RSA_API_KEY" \
  "https://www.realtimesportsapi.com/api/v1/sports/football/leagues/college-football/events/401860924/plays?limit=3"

Response captured from live data at 2026-11-07 13:48 UTC (refreshed every few minutes). Long arrays are trimmed; meta.rateLimit values are illustrative for a Free key. Plays from Oregon State Beavers at Fresno State Bulldogs.

Response

{
  "success": true,
  "data": [
    {
      "id": "4018609242",
      "sequenceNumber": "0",
      "text": "Oregon State wins the toss, and defers. Fresno State to receive. Oregon State defends.",
      "shortText": "Oregon State wins the toss, and defers. Fresno State to receive. Oregon State defends.",
      "alternativeText": "Oregon State wins the toss, and defers. Fresno State to receive. Oregon State defends.",
      "type": {
        "id": "70",
        "text": "Coin Toss"
      },
      "period": 1,
      "clock": {
        "value": 900,
        "displayValue": "15:00"
      },
      "homeScore": 0,
      "awayScore": 0,
      "scoringPlay": false,
      "scoreValue": 0,
      "situation": {
        "down": 0,
        "distance": 10,
        "yardLine": 0,
        "yardsToEndzone": 0
      },
      "endSituation": {
        "down": 0,
        "distance": 10,
        "yardLine": 0,
        "yardsToEndzone": 0
      },
      "yardsGained": 0,
      "athletes": [],
      "priority": false,
      "modified": "2026-11-01T06:47Z"
    },
    {
      "id": "4018609243",
      "sequenceNumber": "1",
      "text": "(15:00) #98 J.Oh kickoff 65 yards to the FRES00, Touchback",
      "shortText": "J. Oh kickoff for 65 yds for a touchback",
      "alternativeText": "(15:00) #98 J.Oh kickoff 65 yards to the FRES00, Touchback",
      "type": {
        "id": "53",
        "text": "Kickoff",
        "abbreviation": "K"
      },
      "period": 1,
      "clock": {
        "value": 900,
        "displayValue": "15:00"
      },
      "wallClock": "2026-11-01T03:07:33Z",
      "homeScore": 0,
      "awayScore": 0,
      "scoringPlay": false,
      "scoreValue": 0,
      "situation": {
        "down": 1,
        "distance": 10,
        "yardLine": 65,
        "yardsToEndzone": 65
      },
      "endSituation": {
        "down": 1,
        "distance": 10,
        "yardLine": 25,
        "yardsToEndzone": 75
      },
      "yardsGained": 0,
      "athletes": [
        {
          "id": "5161639",
          "name": "Jadyn Oh",
          "displayName": "Jadyn Oh",
          "shortName": "J. Oh",
          "position": "PK",
          "team": {
            "id": "204"
          },
          "role": "kicker",
          "type": "kicker",
          "order": 1
        }
      ],
      "priority": false,
      "modified": "2026-11-01T06:47Z"
    },
    {
      "id": "40186092412",
      "sequenceNumber": "2",
      "text": "(14:54) Shotgun #2 R.Luke rush middle for 5 yards gain to the FRES30 (#1 D.Layne; #22 I.Houi)",
      "shortText": "R. Luke run for 5 yds",
      "alternativeText": "(14:54) Shotgun #2 R.Luke rush middle for 5 yards gain to the FRES30 (#1 D.Layne; #22 I.Houi)",
      "type": {
        "id": "5",
        "text": "Rush",
        "abbreviation": "RUSH"
      },
      "period": 1,
      "clock": {
        "value": 891,
        "displayValue": "14:51"
      },
      "wallClock": "2026-11-01T03:09:02Z",
      "homeScore": 0,
      "awayScore": 0,
      "scoringPlay": false,
      "scoreValue": 0,
      "situation": {
        "down": 1,
        "distance": 10,
        "yardLine": 25,
        "yardsToEndzone": 75,
        "downDistanceText": "1st & 10 at FRES 25",
        "possessionText": "FRES 25"
      },
      "endSituation": {
        "down": 2,
        "distance": 5,
        "yardLine": 30,
        "yardsToEndzone": 70
      },
      "yardsGained": 5,
      "athletes": [
        {
          "id": "4685445",
          "name": "Rayshon Luke",
          "displayName": "Rayshon Luke",
          "shortName": "R. Luke",
          "position": "RB",
          "team": {
            "id": "278"
          },
          "role": "rusher",
          "type": "rusher",
          "order": 1
        },
        {
          "id": "5083176",
          "name": "Dylan Layne",
          "displayName": "Dylan Layne",
          "shortName": "D. Layne",
          "position": "LB",
          "team": {
            "id": "204"
          },
          "role": "assistedBy",
          "type": "assistedBy",
          "order": 2
        },
        {
          "id": "5225274",
          "name": "Isaiah Houi",
          "displayName": "Isaiah Houi",
          "shortName": "I. Houi",
          "position": "DB",
          "team": {
            "id": "204"
          },
          "role": "assistedBy",
          "type": "assistedBy",
          "order": 3
        }
      ],
      "priority": false,
      "modified": "2026-11-01T06:47Z"
    }
  ],
  "meta": {
    "pagination": {
      "page": 1,
      "pageSize": 3,
      "total": 186,
      "totalPages": 62,
      "hasNextPage": true,
      "hasPreviousPage": false
    },
    "rateLimit": {
      "limit": 125,
      "remaining": 124,
      "reset": 1796083200000
    }
  }
}

Code samples

curl

curl -H "Authorization: Bearer $RSA_API_KEY" \
  "https://www.realtimesportsapi.com/api/v1/sports/football/leagues/college-football/events/401860924/plays?limit=3"

JavaScript (fetch)

const res = await fetch("https://www.realtimesportsapi.com/api/v1/sports/football/leagues/college-football/events/401860924/plays?limit=3", {
  headers: { Authorization: `Bearer ${process.env.RSA_API_KEY}` }
});
const { success, data, meta } = await res.json();
console.log(data, meta.rateLimit);

Python (requests)

import os, requests

res = requests.get(
    "https://www.realtimesportsapi.com/api/v1/sports/football/leagues/college-football/events/401860924/plays?limit=3",
    headers={"Authorization": f"Bearer {os.environ['RSA_API_KEY']}"},
    timeout=10,
)
body = res.json()
print(body["data"])

MCP prompt (Claude, Cursor, ChatGPT)

Using the Realtime Sports MCP server (https://www.realtimesportsapi.com/api/mcp), call get_plays with sport "football" and league "college-football" and pick a finished game from get_events and summarize its scoring plays for College Football.

Connect the hosted MCP server first: setup guide. Each tool call counts as one API call.

Each request above is 1 call. Free covers 125 calls a month after a 1,000-call first month, at 1 request/second. Starter is $29/month for 10,000 calls (about 333 a day) plus webhooks and WebSocket, so you stop polling for changes; 7-day free trial. Compare plans

Fields

FieldTypeNotes
idstring
sequenceNumberstring
textstring
shortTextstring
alternativeTextstring
typeobject
periodinteger
clockobject
wallClockstring
homeScoreinteger
awayScoreinteger
scoringPlayboolean
scoreValueinteger
scoringTypestring
situationobject
endSituationobject
yardsGainedinteger
teamIdstring
athletesPlayAthlete[]
priorityboolean
modifiedstring

Rate limits and pricing

PlanPriceCallsRateWebSocketWebhooks
Free$0125/mo (1,000 first 30 days)1/s500 msgs/moNo
Starter$29/mo ($290/yr)10,000/mo5/sShares monthly poolShares monthly pool
Growth$49/mo ($490/yr)25,000/mo10/sShares monthly poolShares monthly pool
Pro$99/mo ($990/yr)50,000/mo20/s100,000 msgs/mo25,000/mo
Business$179/mo ($1,790/yr)150,000/mo40/s300,000 msgs/mo75,000/mo
Scale$299/mo ($2,990/yr)500,000/mo100/s500,000 msgs/mo100,000/mo

Every successful REST call counts as one call. Over the limit you get HTTP 429 with a Retry-After header. No SLA. Full pricing.

FAQ

Is there a free college football play-by-play API?
Yes. A free key (no card) includes every endpoint and league: 1,000 calls in the first 30 days, then 125 a month at 1 request per second. Paid plans start at $29/month for 10,000 calls and add webhooks and WebSocket.
Does it cover every FBS game?
The events list and schedule cover every FBS game each week, and plays were returned for completed college football games when we checked.
Can I get college football plays pushed live?
On paid plans, each new play is also pushed to you: webhooks send event.play and the WebSocket stream sends event_play, so you don't have to poll the plays endpoint during a game.

Related