New integrations should prefer the
/api/v1/fixtures endpoints over
/api/v1/games. A fixture is the whole match — both sides, both rosters,
all stats — in one payload. The games endpoints return one side at a time
and are kept only for backwards compatibility.If you’re building on the API and hit something that isn’t covered here, email
support@framesports.ai before reverse-engineering private endpoints.Base URL
/api/v1/.
Authentication
Every endpoint (exceptPOST /api/v1/auth and POST /api/v1/users) requires a
bearer token:
Get a token
- Sign in to Framesports and open API tokens.
- Choose Create token.
- Give the token a name, choose the club it is for and choose when it expires.
- Choose Create token, then copy the token. It is shown only once.
Account-Id header, and
lists your tokens with when each was last used. To stop a token, open its ⋯
menu and choose Delete token. It stops working on its next request.
A token made for an AI assistant on Settings → Third-Party AI does not work
on this API.
If you can’t see API tokens in your Settings menu, use the link in step 1. The
page works for everyone.
Account scoping
Most endpoints are scoped to a single account (the multi-tenant unit — a club or governing body). The account is selected in this priority order:- The
Account-Idheader on the request (prefix ID, e.g.acct_Ex4mpLeAcc0unt1d567890). - The club the token was made for.
- The account stored in the user’s session (for browser-originated calls).
- The user’s newest / fallback account.
IDs
Object IDs are always prefix IDs — opaque strings with a type-specific prefix:
Raw integer IDs are not accepted — always pass the prefix ID.
Player identity
Within a fixture, each roster row (players[]) carries two identifiers.
They look similar but serve different purposes:
Pagination
List endpoints use Pagy with JSON:API-style links. Passpage and per_page as query parameters:
Errors
Errors are returned with an appropriate HTTP status and (usually) a JSON body of the form{ "error": "..." }. Unauthenticated responses (401) currently
return an empty body with content-type: text/html. Treat any 401 as
“token missing, deleted, expired or not valid for this API”, whatever the body.
Versioning
/api/v1/ is stable. Fields may be added without notice; fields will not
be removed or change meaning without a new major version. Any field whose
object includes "deprecated": true is scheduled for removal — migrate off it.