Api Football Authentication
API-Football authenticates with a single static API key sent in a request header. There is no OAuth, no OIDC, no bearer/JWT flow and no mTLS. The key is issued from the API-Sports dashboard and the SAME key works across every API-Sports sport surface. Two header names are accepted, and which one you use depends on which of the two distribution channels you bought through.
API Football declares 2 security scheme(s) across its OpenAPI definitions.
Security Schemes
Source
Authentication Profile
specification: API Commons Authentication
specificationVersion: '0.1'
provider: API Football
providerId: api-football
generated: '2026-09-02'
modified: '2026-09-02'
method: probed
source: >-
Live unauthenticated + bogus-key probes of https://v3.football.api-sports.io/status
run 2026-09-02, cross-read against the provider's own widget library at
https://widgets.api-sports.io/football/2.0.3/library/standings.js and the
documented auth section at
https://www.api-football.com/documentation-v3#section/Authentication
description: >-
API-Football authenticates with a single static API key sent in a request
header. There is no OAuth, no OIDC, no bearer/JWT flow and no mTLS. The key is
issued from the API-Sports dashboard and the SAME key works across every
API-Sports sport surface. Two header names are accepted, and which one you use
depends on which of the two distribution channels you bought through.
schemes:
- id: apisports-key
name: API-Sports direct key
type: apiKey
in: header
header: x-apisports-key
host: v3.football.api-sports.io
channel: direct
description: >-
The key issued in the API-Sports dashboard, used when calling the API
directly at https://v3.football.api-sports.io. Sent on every request.
obtained_at: https://dashboard.api-football.com/register
rotatable: unknown
scopes: []
- id: rapidapi-key
name: RapidAPI marketplace key
type: apiKey
in: header
header: x-rapidapi-key
companion_header: x-rapidapi-host
host: api-football-v1.p.rapidapi.com
channel: marketplace
description: >-
The RapidAPI-issued key, used when the subscription was bought through the
RapidAPI hub. Requires the companion x-rapidapi-host header naming the
RapidAPI edge host. The provider's own widget library switches base URL on
the value of that header: when x-rapidapi-host is not
"v3.football.api-sports.io" it calls
https://api-football-v1.p.rapidapi.com/v3/ instead.
obtained_at: https://rapidapi.com/api-sports/api/api-football
scopes: []
evidence:
- what: The API host advertises exactly which key headers it accepts.
url: https://v3.football.api-sports.io/status
http_status: 200
header_observed: 'access-control-allow-headers: x-rapidapi-key, x-apisports-key, x-rapidapi-host'
fetched: '2026-09-02'
- what: >-
With NO key header the API returns HTTP 403 and an envelope whose "get"
field is empty.
url: https://v3.football.api-sports.io/status
http_status: 403
body: >-
{"get": "","parameters": [],"errors": {"token": "Missing application key,
Check our documentation on how to add your API key in headers.","error":
"4xHe"},"results": 0,"paging": {"current": 1,"total": 1},"response": []}
fetched: '2026-09-02'
- what: >-
With an INVALID key header present the API switches to HTTP 200 and a
different message. The status code therefore distinguishes "no credential
supplied" (403) from "credential supplied but rejected" (200 + errors.token).
url: https://v3.football.api-sports.io/status
request_header: 'x-apisports-key: <32-char placeholder>'
http_status: 200
body: >-
{"get":"status","parameters":[],"errors":{"token":"Error/Missing application
key. Go to https://www.api-football.com/documentation-v3 to learn how to get
your API application
key."},"results":0,"paging":{"current":1,"total":1},"response":[]}
fetched: '2026-09-02'
- what: >-
The RapidAPI edge host is a genuinely separate, gated surface (401, not the
API-Sports envelope).
url: https://api-football-v1.p.rapidapi.com/v3/status
http_status: 401
fetched: '2026-09-02'
- what: The provider's own widget library sets both headers and switches host on them.
url: https://widgets.api-sports.io/football/2.0.3/library/standings.js
http_status: 200
fetched: '2026-09-02'
notes:
- >-
AUTH FAILURE IS NOT SIGNALLED BY STATUS CODE ALONE. Once any key header is
present, a rejected key still returns HTTP 200 with the failure carried in
the body's `errors` object. An agent that branches only on response.ok will
read a rejected key as a successful empty result. Always test
`errors` and `results` before trusting a 200.
- >-
No OAuth 2.0 or OpenID Connect surface exists: /.well-known/openid-configuration
and /.well-known/oauth-authorization-server return 404 on every host
(see well-known/api-football-well-known.yml). There are consequently no
scopes to document, and no scopes/ artifact is written.
- >-
One key spans the whole API-Sports family (football, basketball, baseball,
hockey, rugby, volleyball, handball, Formula 1, NFL/AFL). The key is
account-scoped, not product-scoped.
maintainers:
- FN: Kin Lane
email: info@apievangelist.com
Work with this as data
Every security artifact here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for security posture
4 MCP tools reach this
find_securityBrowse and filter every security artifact in the catalog.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.
Call it yourself
curl for this page
curl "https://apis.io/api/v1/security/api-football-authentication"
curl "https://apis.io/api/v1/security?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.