Welcome to Goalise Football API v3

Goalise provides reliable football data tailored for developers who need live, historical, and prediction insights for football matches across leagues worldwide.

v3 is the current version. Where v2 answered with bare foreign keys — home_team_id, league_id, venue_id — and left the client to resolve each one, v3 embeds the entity itself, so a screen is usually one request. v2 is frozen but untouched and keeps working; see the v2 docs if you are still on it.

🧩 What to do with Goalise?

  • Retrieve live match scores, events, odds and statistics.
  • Access team and player statistics, including form and goals.
  • Fetch league standings, top scorers, and matches by season.
  • Use advanced prediction endpoints for future matches.
  • Filter data by league, team, season, or match ID.
  • Resolve team, league and player names into the IDs the other endpoints need.
  • Check your remaining request allowance without spending a call.
  • For more things you can do, see API Reference section.

🚀 Quick Start

To start using the Goalise API:

  1. Subscribe to a pricing plan
    Choose your plan and billing period at Goalise Checkout.
  2. Get Your API Key
    Once subscribed, your API key will be available under your Dashboard.
  3. Make Your First Request

Here's an example using curl:

curl -X GET "https://api.goalise.com/api/v3/matches?league_id=618&season=2024" \
  -H "Authorization: Bearer YOUR_API_TOKEN"

📦 Response Envelope

Every answer — success or failure — comes back in the same shape:

{
  "status": "success",
  "pagination": { "total_count": 351, "page_size": 120, "page_count": 3, "current_page": 1 },
  "errors": null,
  "meta": { "api_version": "3.0.0", "generated_at": 1757721600, "expanded": ["venue"] },
  "response": []
}
  • response holds the payload — an object for single-entity endpoints, an array for lists.
  • pagination is null unless the endpoint returns a list.
  • errors is null unless status is error.
  • meta carries envelope-level information. New keys may be added here without notice, so ignore the ones you do not know.

🔎 Detail Levels and expand

An entity comes back at one of three sizes. A reference (id, name, logo) is what you get for an entity mentioned inside another one. A card adds the country and one or two headline fields. The full object is what the entity's own endpoint returns. Nesting never goes deeper than two levels: a team carries its country, that country does not carry its leagues back.

Raise a relation to its full object with ?expand=, comma separated, at most 5 paths, at most one dot per path:

curl -X GET "https://api.goalise.com/api/v3/match?id=1035037&expand=events,lineup" \
  -H "Authorization: Bearer YOUR_API_TOKEN"

Each endpoint documents the paths it accepts; anything else is a 400 with code expand.unknown. meta.expanded echoes back what was honoured, so you can tell a relation you asked for from one you did not.

📄 Pagination

?page= is 1-based and page size is fixed per endpoint — there is no cursor. Read pagination.page_count to know when to stop.

⚠️ Errors

Branch on errors[].code, never on the message text.

CodeMeaning
validation.requiredA required parameter was missing
validation.invalidA parameter was present but not usable
expand.unknownThe endpoint does not accept that expand path
expand.too_deepMore than one dot in an expand path
expand.too_manyMore than 5 expand paths
auth.requiredNo bearer token was sent
auth.invalidThe token was rejected
rate_limit.exceededThe allowance for a window ran out
not_foundNothing matched the identifiers given
internalSomething failed on our side

🔑 Auth and Rate Limits

Every endpoint needs Authorization: Bearer <token>, with the single exception of GET /country-coverage.

Every answer carries X-Rate-Limit-Limit, X-Rate-Limit-Remaining and X-Rate-Limit-Reset for whichever of the three windows — minute, hour, day — is closest to its ceiling, plus X-Rate-Limit-<window> / X-Rate-Remaining-<window> / X-Rate-Reset-<window> for each window separately. Reset values are unix seconds. Going over gives a 429 with rate_limit.exceeded and a Retry-After.

GET /quota -> returns the same numbers without spending a call.

🗂️ Conditional Requests

The dictionary endpoints — /countries, /venues, /league-seasons, /league-rounds, /bookmakers, /bets, /live-bets, /country-coverage — answer with an ETag and a Cache-Control. Keep the tag and send it back as If-None-Match: while the answer has not changed the reply is a 304 with no body.

Nothing whose answer moves under a reader carries one, so a fixture list, a live price or a prediction is always fetched in full.

🌍 Language and Time

Responses are in English. Dates are rendered in UTC unless a request asks for a zone with ?timezone= (an IANA name such as Europe/Madrid); the companion timestamp fields are always UTC unix seconds.

📚 API Reference

A quick overview of available API endpoint groups:

🔍 Search

Resolve a team, league or player name into the ID that the other endpoints expect. Results come back ordered by relevance, exact matches first.

See more ->

🌍 Countries

List of all supported countries with flags and codes. Use the available_leagues property from country object to check if the country has leagues in our API.

See more ->

🏆 Leagues

All competitions by country, including seasons, rounds, and detailed information.

See more ->

🏟️ Teams

Club and national teams including statistics and detailed info.

See more ->

🧑‍💼 Coaches

The coach currently in charge of a team, with the period of the spell in start_date / end_date.

See more ->

👤 Players

Players with personal data, stats, transfers, ratings and more.

See more ->

📅 Matches

Scheduled and live matches with status, score, lineup, events and statistics. Both teams and the venue come back as objects, so a fixture list renders without a second round of lookups.

See more ->

Match Status Codes

CodeDescription
TBDScheduled but date and time are not known
NSMatch is scheduled and has not started
1HFirst half is in progress
HTMatch is at halftime
2HSecond half is in progress
ETExtra time is being played
BTBreak during extra time
PPenalty shootout is in progress
SUSPSuspended by referee's decision, may be rescheduled
INTMatch interrupted temporarily, should resume shortly
FTMatch finished in regular time
AETMatch finished after extra time
PENMatch finished after penalties
PSTPostponed to a later date
CANCCancelled and will not be played
ABDAbandoned before completion (e.g., weather, safety)
AWDTechnical loss awarded (not played)
WOWalkOver - opponent forfeited
LIVEIn progress but detailed timing not available

📊 Standings

League tables with rankings, points, form, etc.

See more ->

⚽ Events

In-match events like goals, cards, substitutions.

See more ->

📈 Statistics

Detailed match stats per team and player.

See match statistics ->

See team statistics ->

See player statistics ->

See player match statistics ->

🔁 Transfers

Player transfer history and current market data.

See more ->

🩹 Injuries

Players missing a fixture, injured or unavailable for another reason. Covers upcoming and very recently played fixtures, so it answers who is out right now; use is_injury to tell an injury from a suspension or a coach decision.

See more ->

🧠 Predictions

Match outcome predictions and tips. Every team named in the call — the favourite and the two form blocks included — is an object, which v2 identified only by the provider's own ids.

See more ->

🎯 Odds

Bookmaker odds and live odds for each match.

See more ->

📹 Video Highlights

Match highlight videos with embed urls, filtered by match, league, team or date range — at least one filter is required. Clips are often restricted to specific markets, so check the restriction object before serving one to a viewer.

See more ->

🏅 Top Scorers

List of top players by goals, assists, cards, etc.

See more ->

🗓️ Seasons

All available seasons per league.

See more ->

🌐 Coverage

Which data features are available for each league. Coverage flags are included in league objects, and /country-coverage returns every country that has at least one published competition together with those competitions — one call to decide which countries are worth offering.

See more ->

📰 News

Latest football news, articles, and updates by date, team, league or category.

See more ->

🏟️ Venues

Stadium information including name, location, capacity, and surface type.

See more ->

🛠️ Service

Endpoints about the API itself rather than about football: your remaining allowance, and your token's own recent calls.

See more ->

Explore all available endpoints in the API Reference section.

🔀 Migrating from v2

  • Read from response. Everything now sits inside the envelope described above.
  • Stop resolving ids by hand. Related entities arrive embedded; use ?expand= only when you need the full object rather than the reference.
  • Branch on errors[].code, not on HTTP status text or message strings.
  • id_list is now ids, comma separated. The old dash-separated id_list still works on /matches.
  • Tags moved. Highlights and Injuries are their own groups, and /predictions now lives under Matches.
  • /injures is now /injuries. The v2 spelling is not served on v3.
  • ?timezone= is accepted more widely, including on /match-events, /match-statistics, /match-lineup, /predictions, /highlights, /player-match-statistics, /odds and /live-odds.
  • New endpoints: /quota, /logs and /country-coverage.

💡 Tips

  • All parameters are case-sensitive.
  • Use id, team_id, league_id, and season when available to filter data efficiently.
  • Cache the dictionary endpoints with If-None-Match rather than refetching them.
  • Follow rate limits defined by your subscription to avoid being blocked.

Still have questions? Visit Goalise Support or contact Goalise directly.