The answers below take seconds. If yours is not there, open a ticket and someone who can query your account and the archive replies, not a macro and not a bot.
home_half_time_price is null on every 2024 Serie A row,
though kickoff prices are there. Is half-time only on some competitions?
Half-time sits low archive-wide, it came from a source we held for a narrow window, and Serie A 2024 falls outside it. Every competition page publishes its real fill rate per field, so you can check before you build. Inventing the field would be worse than leaving it null.
Sign in with Google and one is issued immediately. No card, no sales call, no waiting for approval.
Countries, competitions and clubs, and every match from yesterday, as one whole day, settled and final, at 50 calls a day. Today, the fixtures ahead and the in-play feed come with Live; prices, statistics and older seasons with the paid plans.
https://api.footballsoccerapi.com/v1. The version prefix is optional on that host, so /matches and /v1/matches are the same call.
In the X-API-Key header, or as Authorization: Bearer. Never in the address: a key in a query string is refused, because addresses end up in logs, proxies and screenshots.
The free key is the sandbox. It hits the same archive with the same shapes, for yesterday, as one whole day, so nothing you build against it behaves differently when you upgrade.
The endpoint exists, your plan doesn’t reach it. Every refusal names the plan it needs and links to pricing, we never send a bare 403 and leave you guessing.
Upgrades apply immediately and prorate. A downgrade takes effect when the period you have paid for ends, and the higher tier keeps working until then.
From your account. The old key stops the moment the new one is issued, so change it in your code first.
Yes. Separate keys for staging and production means revoking one doesn’t take the other down with it.
Access continues to the end of the period you have paid for, then the key drops to free-tier reach rather than dying. Your integration degrades instead of breaking.
No, and we say it here rather than burying it in the terms. Cancel any time and keep access until the period ends.
Never. Requests past your limit get a 429 with Retry-After. There is no overage bill and no surprise invoice.
Add it in your account before the next renewal and it appears on every invoice from then on.
Card, through Stripe. We never see or store your card details.
Yes, annual is ten months for twelve on both paid plans.
To 2012, across every country and competition we carry. Depth varies by country, and every competition page publishes its own coverage rather than making you guess.
Because we don’t hold it, and inventing a value would be worse. The coverage block on each competition page shows exactly what share of matches carry each field.
More than one source, and we publish which. Every priced match carries kickoff_book_pct, near 102% is an exchange, 105–108% a bookmaker, slightly under 100% is best-of-market. Filter on the number rather than trusting a label.
It rebuilds nightly, and every response carries data_as_of so you always know how old the answer is rather than assuming.
Yes, wherever the fixtures exist, though prices are thinner there, which the coverage figures will tell you before you build on them.
No. Bulk export isn’t offered, /v1/matches with a cursor walks the whole set as fast as you can consume it.
That is correct. Ids carry their type, so a club id passed where a competition belongs fails loudly instead of quietly returning the wrong thing. Raw integers are refused with a 400.
page for a UI pager, cursor for walking the whole set, it pages by sort position, so page 10,000 is as fast as page 1 and a new match arriving cannot shift the boundary under you.
Yes, plus a Postman collection and an MCP server, all generated from the same registry as the documentation, so they cannot drift from it.
Per minute, by plan, and every response tells you where you stand in X-RateLimit-Remaining. You never have to guess or back off blindly.
No. Stable ids are a promise in the terms, not an implementation detail, a rebuild maps everything back to the same numbers.
Scores refresh about once a minute, and the response carries seconds_behind so you can tell a quiet minute from a stalled feed.
Not switched on, and the documentation says so plainly rather than listing an endpoint that does not answer. Webhooks cover the same ground without a socket to keep alive.
Stripe-shaped, deliberately, t=<unix>,v1=<hmac>, so verification code you already have works unchanged.
Delivery retries with backoff over about three days. Twenty consecutive failures disables the endpoint and writes it to your account feed, so it fails loudly rather than silently.
Not answered here? Open a ticket: a person answers, usually within a working day.
Open a ticket. It goes to a person, not a queue that forwards it to another queue.
Open a ticket →