Football API pricing: pay per match, not per request
A 10,000 request plan covers 4 matches if you poll and 200 if you use webhooks. Size your plan by matches tracked, with the arithmetic.
GOAL API· Engineering

You size a football API plan by requests per day. Your users think in matches. The gap between those two numbers decides your bill.
Here is how to price your build around matches instead, with the arithmetic.
Requests per day tells you nothing
A plan quoting 10,000 requests per day sounds concrete. Ask a simple question and the number dissolves: how many matches does 10,000 requests cover?
The answer depends entirely on your transport.
- Polling every 15 seconds: 10,000 requests cover 4 matches for one 9 hour Saturday.
- Polling every 60 seconds: the same quota covers 18 matches.
- WebSockets: the same quota covers every match you subscribe to, because live updates arrive outside the request count.
- Webhooks: the same quota covers roughly 200 matches, because you receive events instead of asking for them.
One quota, four answers, spanning two orders of magnitude. Requests per day describes your polling habits, not your product.
Work out your cost per match
Start with the number your product already has: matches tracked per day.
For polling, the formula is:
requests = matches x (3600 / poll_interval_seconds) x hours_live
A worked example. You track 20 matches across a 9 hour Saturday, polling every 15 seconds:
20 x (3600 / 15) x 9 = 20 x 240 x 9 = 43,200 requests
Divide by 20 and each match costs 2,160 requests. At GOAL API Pro pricing of 19 dollars for 10,000 requests per day, you exceed the plan before the early kickoffs finish.
Now move to webhooks. A match produces roughly 50 events across goals, cards, substitutions, and state changes like kickoff and full time.
20 matches x 50 events = 1,000 deliveries
Fifty requests per match instead of 2,160. Same 20 matches, same live coverage, 43 times less traffic.
The same match, four transports
| Transport | Requests per match | 20 matches | Update lag |
|---|---|---|---|
| Poll every 15s | 2,160 | 43,200 | up to 15s |
| Poll every 60s | 540 | 10,800 | up to 60s |
| Webhooks | ~50 | ~1,000 | under 1s |
| WebSocket | 0 | 1 connection | under 1s |
Polling costs more and delivers later. Both columns move the wrong way.
Fit your plan to your matches
Take the four GOAL API tiers and convert each quota into matches tracked, assuming webhooks at roughly 50 events per match:
| Plan | Price | Requests/day | Matches/day via webhooks |
|---|---|---|---|
| Free | 0 dollars | 1,000 | ~20 |
| Pro | 19 dollars/mo | 10,000 | ~200 |
| Ultra | 29 dollars/mo | 100,000 | ~2,000 |
| Mega | 45 dollars/mo | 1,000,000 | ~20,000 |
Roughly 1,500 professional matches happen worldwide on a busy Saturday. Ultra at 29 dollars per month covers every one of them, with quota left for your fixture lists and standings.
Now convert the same tiers assuming 15 second polling:
| Plan | Requests/day | Matches/day via polling |
|---|---|---|
| Free | 1,000 | 0 |
| Pro | 10,000 | 4 |
| Ultra | 100,000 | 46 |
| Mega | 1,000,000 | 462 |
Your transport choice moves you three tiers. Polling 500 matches needs the 45 dollar plan. Webhooking the same 500 matches fits inside the 19 dollar plan.
Budget the rest of your traffic
Live events are the volatile part of your bill. Everything else is predictable and cacheable.
A typical app also serves:
- Fixture lists. One request per league per day, cached for hours.
- Standings. One request per league per hour during a season.
- Team and player profiles. Cached for a day.
- Historical results. Cached forever, because a finished match never changes.
Twenty leagues with hourly standings and daily fixtures costs about 500 requests per day. Add your webhook deliveries and the total stays well inside a 10,000 request plan.
The pattern holds across vendors. Reference data is cheap. Live data turns expensive the moment you poll.
Three rules
Size your plan with these:
- Count matches, then multiply by your transport's cost per match. Skip the raw request quota until you have done the multiplication.
- Cache anything with a known refresh cycle. Standings change hourly, not per page view.
- Move live data to webhooks or a socket before you upgrade your plan. Upgrading to cover polling costs pays for the wrong thing.
The third rule saves the most money. A team polling 200 matches sits on a 45 dollar plan. The same team on webhooks sits on the 19 dollar plan and gets updates faster.
Read webhooks, WebSockets or polling for the transport decision, then stop polling for goals to register your first endpoint.
Sources: GOAL API pricing and documentation.


