Release Notes Schema Differences

Release Notes

▸ 2026-11-11

What's Changing?

Tactical positions now have a name. New type TacticalPosition with id, name and shortName (e.g. 4, Centre back, CB).

  • TacticalFormationPosition.position returns the position of a formation slot.
  • MatchTactical.position returns the position of the formation slot at posIndex. A formation lookup per row is no longer needed.

Positions cover football only (ids 1–13). For other sports, or when the id is unknown, position is null; TacticalFormationPosition.positionId still returns the raw id. MatchTactical.position is also null when tacticalFormationId or posIndex is missing or the formation has no matching slot.

A formation can use the same position more than once, e.g. three centre backs in the 3-1-4-2. Use xpos (0 = left, 1 = right) and ypos (0 = own goal, upwards) to tell them apart.

Example Query

query MatchPositions($matchIds: [ID!]) {
    tacticalFormation(filter: {id: 21}) {
        name
        positions {
            posIndex
            positionId
            position {
                id
                name
                shortName
            }
        }
    }
    matches(filter: {ids: $matchIds}) {
        data {
            id
            tacticals {
                personId
                posIndex
                position {
                    id
                    name
                    shortName
                }
                xpos
                ypos
            }
        }
    }
}

▸ 2026-11-10

What's Changing?

New root query competitionCollections returns a paginated list of competition collections, ordered by ID. Use filter.ids to select 1–100 collections, or omit the filter to list all accessible collections.

New root query competitionCollection(filter: {id: ...}) returns a single competition collection, or null when the ID does not exist.

Both queries reuse the existing CompetitionCollection.view permission. Users with allowed collection IDs can only list or request those collections; explicitly requesting a disallowed ID returns an authorization error. With no allowed-ID restriction, all collections are accessible. Site administrators have unrestricted access.

Collection allowed-ID restrictions now also apply to nested relationships and searchId(category: COMPETITION_COLLECTION), following the same global data-access filtering as applications and competitions. For example, Application.competitionCollection returns null when its collection is outside the user's allowed IDs. Collection search caches are separated by collection permissions.

The existing fields and relationships are available, including unpaginated applications and paginated competitions. Related fields retain their existing permission checks. globalParameters.language can select the language of nested competitions; collection names and descriptions are not localized.

Example Query

query CompetitionCollections($ids: [ID!], $id: ID!) {
    competitionCollections(filter: {ids: $ids}, first: 20, page: 1) {
        data {
            id
            name
            description
        }
        paginatorInfo {
            total
            hasMorePages
        }
    }
    competitionCollection(filter: {id: $id}, globalParameters: {language: EN_US}) {
        id
        name
        applications {
            id
        }
        competitions(first: 20) {
            data {
                id
                name
            }
        }
    }
}

▸ 2026-11-09

What's Changing?

New root query promotionTypes returns a paginated list of promotion types, ordered by ID. Filter by ids (1–100 IDs) and kind (DEFAULT or ODDSBOOST). Omitting kind returns all kinds.

New root query promotionType(filter: {id: ...}) returns a single promotion type, or null when the ID does not exist.

filter.language selects the localized name. When omitted or null, globalParameters.language is used, falling back to the configured default (DE_DE). Missing translations return name: null. Use translations(filter: {languages: [DE_DE, EN_US]}) for multiple languages; omitting or passing null for languages returns all translations.

Both queries require the new PromotionType.view permission, granting access to the full promotion-type catalog. The permission is not automatically granted to existing users. Existing nested Promotion.promotionType access is unchanged.

Example Query

query {
    promotionTypes(filter: {kind: ODDSBOOST, language: EN_US}, first: 20) {
        data {
            id
            name
            inputMask
            translations(filter: {languages: [DE_DE, EN_US]}) {
                language
                name
            }
        }
        paginatorInfo {
            total
            hasMorePages
        }
    }
    promotionType(filter: {id: 99, language: EN_US}) {
        id
        name
    }
}

▸ 2026-10-15

What's Changing?

All match related statistics are now served from HeimSpiel instead of the Sportscube database, with one union per sport like the existing statsByPerson. All values are numbers (Int or Float) and null if HeimSpiel does not deliver them.

  • New unions SeasonPersonStats, SeasonTeamStats and MatchTeamStats (currently FootballSeasonPersonStats, FootballSeasonTeamStats and FootballMatchTeamStats), to be queried with inline fragments. The relation fields season/team (season statistics) and match/team (MatchTeamStats and MatchPersonStats) resolve the related entity and are null if the id is missing or unknown.
  • Team.statsByMatch and Person.statsByMatch require the Competition.view and CompetitionCollection.view permissions, also when the team or person is reached through another field.
  • New field passesTotal on FootballMatchPersonStats (Match.statsByPerson / Person.statsByMatch).
  • New field playing (Int) on FootballMatchPersonStats and FootballSeasonPersonStats: playingLineup + playingSubstituteIn. null if both are null, otherwise a missing value counts as 0.
  • Team.statsByMatch, Team.statsBySeason, Team.statsBySeasonPerson, Person.statsBySeason, Person.statsByMatch and MatchEntity.statsByPerson are paginated (data, paginatorInfo, first, page). The full list is requested from HeimSpiel and cached, only the response is paged. MatchEntity.statsByTeam is a plain, non-null list ([X!]!). The filters are required, because HeimSpiel has to be asked for explicit seasons or matches (one request per season or match):
    • matchesFilter (Team.statsByMatch) must match at most 100 matches, and only matches of the team are used.
    • matchesFilter (Person.statsByMatch) must match at most 100 matches, and only matches of a team the person belonged to on the match date are used (club and national teams; memberships without dates count for their season).
    • seasonsFilter (Team.statsBySeason, Person.statsBySeason) must match at most 30 seasons, counted together for all teams/persons of the same field in one query. Unless ids are given, Team.statsBySeason only counts seasons in which the team has matches, and Person.statsBySeason only seasons in which the current team of the person has matches (a person without a current team has no season statistics then). Season statistics are cached for one hour.
    • seasonIds (Team.statsBySeasonPerson) takes at most 30 seasons, personIds is optional.
    • Match.statsByTeam can be requested for at most 100 matches at once.
  • If HeimSpiel fails for any season or match of a request, the field is an empty list for every parent of the same field in the query, never a partial result, and the error The statistics provider is temporarily unavailable, please try again later. is added once to errors. It has no path, extensions.reason names the statistics, the failedIds of the seasons or matches and the field (e.g. Team.statsBySeason). An empty list without this error means HeimSpiel has no statistics.
  • A person can have several entries per season (one per team). The id of the season statistics is {seasonId}_{personId}_{teamId} (person) or {seasonId}_{teamId} (team), the id of the match team statistics is {matchId}_{teamId}.
  • Removed the Sportscube-backed types StatsSeasonPerson, StatsSeasonTeam and StatsMatchTeam.

Changed Field Types

  • Team.statsByMatch: [StatsMatchTeam!] (paginated) → [MatchTeamStats!]! (paginated)
  • Team.statsBySeason: [StatsSeasonTeam!] (paginated) → [SeasonTeamStats!]! (paginated)
  • Team.statsBySeasonPerson: [StatsSeasonPerson!] (paginated) → [SeasonPersonStats!]! (paginated)
  • Person.statsBySeason: [StatsSeasonPerson!] (paginated) → [SeasonPersonStats!]! (paginated)
  • MatchEntity.statsByTeam: [StatsMatchTeam!] → [MatchTeamStats!]!

Changed Statistic Fields

  • ballsTouched (count): dropped. Team statistics have ballsTouchedPercentage (Float, a different measure), person statistics have none.
  • playing: dropped, use playingLineup, playingSubstituteIn, playingSubstituteOut and playingMinutes.
  • scorerpoints: dropped.
  • matches: dropped.
  • createdAt, updatedAt: dropped.
  • StatsSeasonPerson.score, assists, ...: unchanged names, additional fields like expectedGoals, passesTotal, tackles.
  • New on team statistics: goalKicks, throwIn, shotsOffGoal, expectedGoals, expectedAssists, passes*, duels*, saves.

Example Query

query TeamStatistics($teamId: ID!, $seasonId: [ID!], $matchIds: [ID!]!, $from: DateTime!, $to: DateTime!) {
    team(filter: {id: $teamId}) {
        statsBySeason(filter: {seasonsFilter: {ids: $seasonId}}) {
            ... on FootballSeasonTeamStats {
                seasonId
                ballsTouchedPercentage
                throwIn
                expectedGoals
            }
        }
        statsByMatch(filter: {matchesFilter: {ids: $matchIds, matchDateFrom: $from, matchDateTo: $to}}) {
            ... on FootballMatchTeamStats {
                matchId
                goalKicks
                shotsOnGoal
            }
        }
    }
}

▸ 2026-10-12

What's Changing?

When a match has multiple external associations (e.g. Sportradar, Kicker, Opta, Transfermarkt), the match's association now always returns the entry with the latest updated_at.

▸ 2026-10-02

What's Changing?

promotions filters countries and countrySubdivisionCodes now also return global promotions, i.e. promotions without any country or subdivision assignment, in addition to those assigned to the requested countries or subdivisions. Previously global promotions were excluded.

Bookie.applicationAssociations filter countries now treats associations without a country as global ones. For each requested country, the association assigned to that country is returned if it exists, otherwise the global association is used as a fallback. Global associations are returned only once, and associations of countries that were not requested are never returned.

▸ 2026-09-30

What's Changing?

New HeimSpiel data is available in the GraphQL API:

  • honourTitle and honourTitles (paginated, filter by ids and kinds) return honour titles. tacticalFormation and tacticalFormations (optional ids filter) return tactical formations.
  • TacticalFormation.positions returns the positions of a formation.
  • Person.nationality returns all nationalities of a person (including dual nationality), each with an optional country.
  • Person.honours and Team.honours return honours, filterable by competitionIds, seasonIds, honourTitleIds and kinds. Each honour exposes its honourTitle.
  • MatchEntity.tacticals returns the raw tactical entries of a match. sourceId is the data source, and tacticalFormationId links to MatchTactical.tacticalFormation.

Example Query

query HeimSpielData($personIds: [ID!], $matchIds: [ID!]) {
    honourTitles(filter: {kinds: ["top_scorer"]}, first: 10) {
        data {
            id
            name
            kind
        }
    }
    tacticalFormations(filter: {ids: [21, 53]}) {
        id
        name
        positions {
            posIndex
            xpos
            ypos
        }
    }
    persons(filter: {ids: $personIds}) {
        data {
            id
            nationality {
                countryId
                country {
                    id
                }
            }
            honours(filter: {kinds: ["top_scorer"]}) {
                id
                name
                honourTitle {
                    shortName
                }
            }
        }
    }
    matches(filter: {ids: $matchIds}) {
        data {
            id
            tacticals {
                sourceId
                tacticalFormationId
                kind
                posIndex
                tacticalFormation {
                    name
                }
            }
        }
    }
}

▸ 2026-09-29

What's Changing?

Promotion.goLinks now also returns go links of any type that carry one of the promotion's goLinkTags (one tag per line, case-insensitive) and belong to the promotion's bookmaker. These are merged with the go links directly assigned to the promotion, without duplicates.

▸ 2026-09-23

What's Changing?

searchId now returns results in ascending ID order for every category, including all-language searches. SearchIdFilter.limit accepts values from 1 to 500. When omitted or null, the query returns at most the first 500 matching results. Searches that previously returned more than 500 results now return only those first 500.

Example Query

query SearchTeamIds {
    searchId(filter: {searchTerm: "Madrid", category: TEAM, limit: 10}) {
        ... on Team {
            id
            name
        }
    }
}

▸ 2026-09-16

What's Changing?

Bookmaker payout ranges are now available through Bookie.applicationAssociations. Each association exposes nullable payoutMin and payoutMax values and can be filtered by application ID or country ISO.

Example Query

query BookmakersWithPayoutRanges($applicationIds: [Int!], $countries: [CountryEnum!]) {
    bookies {
        data {
            id
            name
            applicationAssociations(filter: {applicationIds: $applicationIds, countries: $countries}) {
                applicationId
                countryId
                payoutMin
                payoutMax
            }
        }
    }
}

▸ 2026-09-04

What's Changing?

GlobalParameters now supports country and countrySubdivisionCode. These values apply to compatible filters throughout a query, including country and country-subdivision list filters. Local filter values take precedence.

Example Query

query AustrianBookies {
    bookies(globalParameters: {country: AT, countrySubdivisionCode: "AT-9"}) {
        data {
            id
            name
        }
    }
}

▸ 2026-08-26

What's Changing?

MatchEntity.statsByPerson and Person.statsByMatch now return HeimSpiel match-person statistics as paginated MatchPersonStats unions. This is a breaking change from the previous StatsMatchPerson list response: select football KPIs through an inline fragment and read results from data.

Breaking Changes

  • Person.statsByMatch now requires filter, including a non-empty matchesFilter.
  • MatchesRelationFilter.matchDateFrom and matchDateTo are optional when ids is provided. Without ids, both dates are required.
  • MatchEntity.statsByPerson returns a paginator response rather than a plain list. Update selections to use data.
  • Both fields now return the MatchPersonStats union rather than StatsMatchPerson. Wrap football-stat selections in ... on FootballMatchPersonStats.
  • The FootballMatchPersonStats fields corners, freeKicks, and savePercentage were removed. Use cornerKicks, freekicks, and keeperSweeper where applicable.
  • Match-person-stat IDs are now composite strings based on match, person, and team instead of source statistic IDs.

Example Query

query MatchPersonStats($id: ID!) {
    match(filter: {id: $id}) {
        statsByPerson(first: 10, page: 1) {
            data {
                ... on FootballMatchPersonStats {
                    matchId
                    personId
                    playingMinutes
                }
            }
        }
    }
}

▸ 2026-08-25

What's Changing?

Payment method images are now available through PaymentType.images. Use the existing ImageFilter to select the PAYMENT_TYPE style and Image.url to retrieve the image URL.

Example Query

query BookiePaymentMethodImages($id: ID!) {
    bookie(filter: {id: $id}) {
        paymentTypeAssociations {
            paymentType {
                id
                name
                images(filter: {style: PAYMENT_TYPE}) {
                    url
                }
            }
        }
    }
}

▸ 2026-08-24

What's Changing?

Bookmaker platform support is now available through Bookie.platformAssociations, including global and country-specific associations, localized platform names, and optional platform images.

Bookie.platformAssociations supports isCountryFallbackActive. When used with countries, it returns both country-specific and globally available platform associations.

Example Query

query BookiePlatforms($id: ID!, $countries: [CountryEnum!]) {
    bookie(filter: {id: $id}) {
        platformAssociations(filter: {
            countries: $countries
            isCountryFallbackActive: true
        }) {
            country {
                iso
            }
            platform(filter: {language: EN_US}, scopeApplicator: ["Platform.name"]) {
                id
                priority
                slug
                name
                shortName
                images {
                    url
                }
            }
        }
    }
}

▸ 2026-08-21

What's Changing?

Bookmaker availability regions are now available through Bookie.countries and Bookie.countrySubdivisions. Both fields are ordered by code and include the existing localized translations. Bookies can also be filtered by country ISO or country subdivision code.

Example Query

query BookieAvailability($country: CountryEnum!) {
    bookies(first: 10, filter: {countries: [$country]}) {
        data {
            name
            countries(first: 100) {
                data {
                    code
                    translations(filter: {languages: [EN_US]}) {
                        name
                    }
                }
            }
            countrySubdivisions(first: 100) {
                data {
                    code
                }
            }
        }
    }
}

▸ 2026-08-06

What's Changing?

Match venues are now available through MatchEntity.place, including the localized name, country, and all place translations.

Example Query

query MatchPlace($id: ID!) {
    match(filter: {id: $id}, globalParameters: {language: EN_US}) {
        place {
            name
            town
            capacity
            country {
                id
                name
            }
            translations(filter: {languages: [DE_DE, EN_US]}) {
                language
                name
            }
        }
    }
}

▸ 2026-08-03

What's Changing?

Bookie reviews are now available through Bookie.reviews, including review articles, localized article categories, reviewers, and reviewer images.

Example Query

query BookieReviews($id: ID!, $applicationId: Int!) {
    bookie(filter: {id: $id}) {
        reviews(filter: {languages: [EN_US], applicationId: $applicationId, isActive: true}) {
            reviewer {
                firstName
                lastName
            }
            articles {
                text
                category(filter: {language: EN_US}) {
                    name
                }
            }
        }
    }
}

▸ 2026-07-31

What's Changing?

Sport1 source-association data is now available through MatchEntity.associations.sport1.

Example Query

query MatchSport1Association($id: ID!) {
    match(filter: {id: $id}) {
        id
        associations {
            sport1 {
                sport1MatchId
                sport1CompetitionName
            }
        }
    }
}

▸ 2026-07-23

What's Changing?

MatchesFilter now supports sports: [SportEnum!] to restrict matches to competitions in the requested sports.

Example Query

query FootballMatches {
    matches(filter: {sports: [FOOTBALL]}) {
        data {
            id
            matchDate
        }
    }
}

▸ 2026-07-22

What's Changing?

Competition.competitionCollectionCompetitionAssociations now exposes each competition's collection-specific ELO coefficient through eloCoefficient.

Use filter: {competitionCollectionIds: [Int!]} to limit the associations to specific competition collections.

Example Query

query CompetitionEloCoefficient($id: ID!, $competitionCollectionIds: [Int!]) {
    competition(filter: {id: $id}) {
        id
        competitionCollectionCompetitionAssociations(filter: {
            competitionCollectionIds: $competitionCollectionIds
        }) {
            data {
                competitionCollectionId
                eloCoefficient
            }
        }
    }
}

▸ 2026-07-20

What's Changing?

Bookie metadata is now available through these association fields:

  • customerServiceAssociations
  • bettingMarketAssociations
  • featureAssociations
  • paymentTypeAssociations
  • ratings
  • licenseAssociations

TeamPerson now exposes its related team and role:

  • TeamPerson.team: Team
  • TeamPerson.role: Role

▸ 2026-07-07

What's Changing?

GoLink.hrefReplaced(filter: HrefReplacedFilter) now also supports geo filters:

  • countries: [CountryEnum]
  • countrySubdivisionCodes: [String]

These filters restrict the returned replaced href entries to the requested countries and/or country subdivisions.

The relation goLinks filter now supports isFiltersFallbackActive: Boolean on these fields:

  • Bookie.goLinks(filter: RelationGoLinksFilter)
  • Bonus.goLinks(filter: RelationGoLinksFilter)
  • Promotion.goLinks(filter: RelationGoLinksFilter)
  • Channel.goLinks(filter: RelationGoLinksFilter)

When isFiltersFallbackActive: true is used and the requested client-specific filters remove all matching goLinks for a relation item, the resolver performs a fallback query and returns goLinks with these filters relaxed:

  • countries
  • countrySubdivisionCodes
  • devices
  • languages
  • platforms

The fallback still keeps the relation scope and the other goLink filters such as types, applicationIds, isActive, and tags.

Example Query

query PromotionGoLinksWithFallback($id: ID!) {
    promotion(filter: {id: $id}) {
        id
        goLinks(filter: {
            isFiltersFallbackActive: true
            countries: [AT]
            devices: [MOBILE]
            languages: [DE_DE]
        }) {
            id
            href
        }
    }
}

▸ 2026-06-29

What's Changing?

A new Absence GraphQL type has been added for player absence data.

New fields are now available on existing types:

  • MatchEntity.absences: [Absence!]!
  • Competition.currentAbsences: [Absence!]!

Absence also includes a nested person field to resolve the related Person.

Example Queries

Match Absences

query MatchAbsences($id: ID!) {
    match(filter: {id: $id}) {
        id
        absences {
            id
            kind
            reason
            person {
                id
                fullName
            }
        }
    }
}

Competition Current Absences

query CompetitionCurrentAbsences($id: ID!) {
    competition(filter: {id: $id}) {
        id
        currentAbsences {
            id
            kind
            reason
            person {
                id
                fullName
            }
        }
    }
}

▸ 2026-06-22

What's Changing?

Match association fields are now grouped under a new nested field on MatchEntity:

  • associations: MatchAssociations

Use the new nested path for provider-specific match association data:

  • match.associations.betql
  • match.associations.as
  • match.associations.deltatre
  • match.associations.dfl
  • match.associations.faz
  • match.associations.futbol24
  • match.associations.gazzetta
  • match.associations.kicker
  • match.associations.manual
  • match.associations.oddset
  • match.associations.opta
  • match.associations.phoenix
  • match.associations.ronin
  • match.associations.sportradar
  • match.associations.transfermarkt
  • match.associations.tonline
  • match.associations.toralarm
  • match.associations.livescore
  • match.associations.goaldotcom
  • match.associations.globo
  • match.associations.xscores

Remove Notice

The legacy top-level match association fields on MatchEntity are deprecated and will be removed on 2026-08-01. Use associations.<provider> instead.

Example Queries

Old Query (Deprecated)

query OldQuery($id: ID!) {
    match(filter: {id: $id}) {
        id
        betql {
            id
        }
        opta {
            id
        }
    }
}

New Query (Recommended)

query NewQuery($id: ID!) {
    match(filter: {id: $id}) {
        id
        associations {
            betql {
                id
            }
            opta {
                id
            }
        }
    }
}

▸ 2026-06-18

What's Changing?

The SearchIdTeamFilter input now supports competitionIds: [Int!]. This filter applies only when searchId.filter.category is TEAM and returns only teams that:

  • match the searchTerm
  • have played in at least one of the provided competitions

When multiple competition ids are provided, the filter uses OR semantics. A team is returned if it has participated in any of the given competitions.

The SearchIdCompetitionFilter input now supportincludeInternational: Boolean. When includeInternational: true is used on its own, only competitions without a country (countryId = null) are returned. When country and includeInternational: true are used together, the result includes both:

  • competitions from the selected country
  • competitions without a country

▸ 2026-06-08

What's Changing?

A new set of alias relations and GraphQL types has been added:

  • Sport.sportAliases: [SportAlias!]!
  • Team.teamAliases: [TeamAlias!]!
  • Competition.competitionAliases: [CompetitionAlias!]!
  • Person.personAliases: [PersonAlias!]!

The new alias types expose the alias entries as nested objects:

  • SportAlias
  • TeamAlias
  • CompetitionAlias
  • PersonAlias

TeamAlias also includes competitionId to expose the competition-specific alias scope.

For Person, the existing single-value alias field is kept for backward compatibility, and the new personAliases field should be used to access the full list of aliases.

A new nested categoryFilters input has been added to SearchIdFilter. It groups the per-category filters so each category can be filtered with its relevant fields:

  • team: SearchIdTeamFilter — applied when category is TEAM. Fields: sports: [SportEnum!], kind: TeamKindEnum, gender: GenderEnum, age: AgeEnum, country: CountryEnum.
  • competition: SearchIdCompetitionFilter — applied when category is COMPETITION. Same fields as the team filter.
  • person: SearchIdPersonFilter — applied when category is PERSON. Field: country: CountryEnum.

A new SportEnum is introduced for the sports filter on team and competition category filters with the following values: FOOTBALL, BASKETBALL, BASEBALL, ICE_HOCKEY, TENNIS, HANDBALL, GOLF, RUGBY, AMERICAN_FOOTBALL, CRICKET, VOLLEYBALL, FORMULA_1.

When both the legacy top-level fields and categoryFilters are provided, the values in categoryFilters take precedence.

The TeamsFilter input now supports sports: [SportEnum!] for filtering teams by sport.

The legacy sportIds: [Int] filter on TeamsFilter is deprecated and will be removed on 2026-08-01. Use sports instead.

Remove Notice

The incorrect person alias field aliasName will be removed in a future release. A person can have multiple aliases, so clients should migrate to personAliases.

The top-level age and gender arguments on SearchIdFilter are deprecated and will be removed on 2026-08-01. After this date, queries using the deprecated arguments will no longer be supported. Use categoryFilters instead.

The deprecated sportIds argument on TeamsFilter will be removed on 2026-08-01. After this date, queries using the deprecated argument will no longer be supported.

Example Queries

Old Query (Deprecated)

query OldQuery {
    searchId(filter: {searchTerm: "Madrid", category: TEAM, language: DE_DE, age: A_TEAM, gender: MALE}) {
        ... on Team {
            id
            name
        }
    }
}

New Query (Recommended)

query NewQuery {
    searchId(filter: {
        searchTerm: "Madrid",
        category: TEAM,
        language: DE_DE,
        categoryFilters: {
            team: {
                sports: [FOOTBALL],
                age: A_TEAM,
                gender: MALE,
                country: ES
            }
        }
    }) {
        ... on Team {
            id
            name
        }
    }
}

Old Teams Query (Deprecated)

query OldTeamsQuery($sportIds: [Int]) {
    teams(filter: {sportIds: $sportIds}) {
        paginatorInfo {
            total
        }
    }
}
{
  "sportIds": [1]
}

New Teams Query (Recommended)

query NewTeamsQuery($sports: [SportEnum!]) {
    teams(filter: {sports: $sports}) {
        paginatorInfo {
            total
        }
    }
}
{
  "sports": ["FOOTBALL"]
}

▸ 2026-05-20

What's Changing?

A new groupOptions filter has been added to StandingsFilter.

It consists of two subfilters:

  • groupMode - ENUM possible values: LEAGUE, CONFERENCE, DIVISION. (Default: LEAGUE)
  • returnGroupCompetitors - BOOLEAN. (Default: false)

If roundIds and teamIds is provided and returnGroupCompetitors is true, the response will include the team's group competitors based on the provided groupMode and teamIds.

▸ 2026-04-27

What's Changing?

When matches are sorted by score, or the score field is queried, and no other filters are active:

  • Default: Results are limited to the next 7 days.
  • POST state only: Results are limited to the past 7 days.
  • POST state + any other state: Results span from the past 7 days through the next 7 days.

A new h2hTeamIds filter has been added to MatchesFilter. It accepts an array of exactly 2 team IDs and restricts results to head-to-head matches between those teams. This filter is mutually exclusive with the teamIds filter.

The searchId query has been enhanced with the following changes:

  • All-language search: When no language argument is provided, the search now queries across all available languages in the translation tables instead of defaulting to a single language. This applies to TEAM, COMPETITION, and SPORT categories.
  • New optional filters added to SearchIdFilter:
    • age: AgeEnum — Filter results by age category (e.g. A_TEAM, U21, U19). Applies to TEAM and COMPETITION categories.
    • gender: GenderEnum — Filter results by gender (MALE, FEMALE, MIXED). Applies to TEAM and COMPETITION categories.

Example Queries

Search teams without language (all languages)

query {
    searchId(filter: {searchTerm: "Real Madrid", category: TEAM}) {
        ... on Team {
            id
            name
            ageName
            primaryColor
        }
    }
}

Search teams with age and gender filter

query {
    searchId(filter: {searchTerm: "Madrid", category: TEAM, language: DE_DE, age: A_TEAM, gender: MALE}) {
        ... on Team {
            id
            name
            ageName
            gender
        }
    }
}

▸ 2026-04-13

What's Changing?

Added new fields to the Standing type

  • rankDivision
  • rankConference
  • winPercentageDivision
  • winPercentageConference
  • streak
  • winDivision
  • lostDivision
  • drawDivision
  • winConference
  • lostConference
  • drawConference
  • gamesLive
  • winOnPenalty
  • lostOnPenalty
  • winOnExtraTime
  • lostOnExtraTime
  • winOnPenaltyAway
  • winOnPenaltyHome
  • lostOnPenaltyAway
  • lostOnPenaltyHome
  • winOnExtraTimeAway
  • winOnExtraTimeHome
  • lostOnExtraTimeAway
  • lostOnExtraTimeHome

▸ 2026-03-05

What's Changing?

  • Removed userId field form these types:
    • Application
    • BettingMarket
    • BettingMarketOutcome
    • Bonus
    • BonusType
    • Bookie
    • BookieCountrySubdivisionAssociation
    • Channel
    • Country
    • Currency
    • GoLink
    • PaymentType
    • Promotion
    • PromotionOddsBoost
    • PromotionOddsBoostMatchAssociation
    • PromotionOddsBoostMatchAssociationBettingMarketOutcomeAssociation
    • PromotionType
  • Removed comment field form these types: Bonus, MatchResult
  • Removed productOwnerUserId field form Application type

▸ 2026-02-27

What's Changing?

  • Added the uniqueId field to the Bet type. This field is unique for each bet.

▸ 2025-11-28

What's Changing?

  • Added the images field to the Sport type

▸ 2025-11-24

What's Changing?

  • Added the brandColor field of type ImageBrandColor to the Image type

▸ 2025-11-24

What's Changing?

  • Added the mandatory argument bookieId on BetFilter input type
  • Field matchMonth on Bet type is removed

▸ 2025-11-21

What's Changing?

  • Argument matchDate added to MatchesOrderBy input type. This argument allows to sort matches by match date.

▸ 2025-11-05

What's Changing?

HrefReplaced type added to the GoLink type. This type is used to retrieve the href of the link with replaced tracking parameters (when available).

Example Queries

query MyQuery {
    goLink(filter: {id: "1"}) {
        id
        href
        hrefReplaced(filter: {bookieIds: [2]}) {
            href
            affiliateId
            applicationId
            entityId
            entityType
            country
            countrySubdivisionCode
        }
    }
}

Result

{
  "data": {
    "goLink": {
      "id": "1",
      "href": "https://www.test.com/open-account?###affiliate_params###",
      "hrefReplaced": [
        {
          "href": "https://www.test.com/open-account?affiliate=case123",
          "affiliateId": "affiliate=case123",
          "applicationId": 1,
          "entityId": 2,
          "entityType": 'bookie',
          "country": null,
          "countrySubdivisionCode": null
        },
        {
          "href": "https://www.test.com/open-account?affiliate=case456",
          "affiliateId": "affiliate=case456",
          "applicationId": 1,
          "entityId": 2,
          "entityType": 'bookie',
          "country": "AT",
          "countrySubdivisionCode": null
        }
      ]
    }
  }
}

▸ 2025-11-03

What's Changing?

  • Field roundMarker on Round type now returns an array

▸ 2025-10-21

What's Changing?

  • Added root queries round and rounds
  • New RoundFilter and RoundsFilter are added
  • Old RoundFilter type renamed to the CompetitionRoundFilter
  • New arguments ids, seasonIds and currentMatchDays are added to the CompetitionRoundFilter with the same functionality as the old arguments
  • Old arguments id, seasonId and currentMatchDay in CompetitionRoundFilter will be deprecated
  • Argument ids is required without seasonIds on CompetitionRoundFilter
  • Matches can be filter based on the roundIds
  • MatchDay argument in Matches filter are also considering group_matchday
  • TeamPerson relation added to the Person type
  • New arguments added to the PersonsFilter

Remove Notice

The old arguments will be removed on November 18, 2025. After this date, queries using the deprecated arguments will no longer be supported.

Example Queries

Old Query (Deprecated)

query OldQuery($filter: RoundFilter!) {
    competitions {
        data {
            rounds(filter: $filter) {
                data {
                    id
                }
            }
        }
    }
}
{
"filter": {
    "id": ["1"],
    "currentMatchDay": [10],
    "seasonId": [10]
    }
}

New Query (Recommended)

query NewQuery($filter: CompetitionRoundFilter!) {
    competitions {
        data {
            rounds(filter: $filter) {
                data {
                    id
                }
            }
        }
    }
}
{
"filter": {
    "ids": ["1"],
    "currentMatchDays": [10],
    "seasonIds": [10]
    }
}

▸ 2025-10-13

What's Changing?

SerachId field is now available for application groups, channels, markets, persons, and sports. The SearchIdResult type is extended to support the new types.

▸ 2025-09-22

What's Changing?

  • The field differenceName will be replaced by differenceType in the Standing type.
  • The field differenceName is now nullable.

Remove Notice

The old field will be removed on October 27, 2025. After this date, queries using the deprecated types will no longer be supported.

Example Queries

Old Query (Deprecated)

query OldQuery {
    standings {
        data {
            id
            differenceName
        }
    }
}

New Query (Recommended)

query NewQuery {
    standings {
        data {
            id
            differenceType
        }
    }
}

▸ 2025-09-19

What's Changing?

The goLinks filters now use soft filtering. Soft Filtering means that if, for example, you filter by Country AT, you will get back both all AT goLinks and all globally available goLinks without a country restriction. Previously, globally defined goLinks were excluded when filtering by a specific country. The same behaviour also applies to the other mentioned soft filters.

The soft filter arguments are:

  • countries
  • countrySubdivisionCodes
  • languages
  • platforms
  • devices

▸ 2025-09-10

What's Changing?

The country argument in these filters is renamed to countries.

  • BetsFilter
  • MatchEntityBetsFilter

Remove Notice

The old argument will be removed on October 27, 2025. After this date, queries using the deprecated argument will no longer be supported.

Example Queries

Old Query (Deprecated)

query OldQuery {
  matches {
    data {
      id
      bets(filter: {
        bookieIds: 10, 
        country: [AT, DE] # Deprecated
        }) {
        data {
          id
        }
      }
    }
  }
}

New Query (Recommended)

query NewQuery {
  matches {
    data {
      id
      bets(filter: {
        bookieIds: 10, 
        countries: [AT, DE]
        }) {
        data {
          id
        }
      }
    }
  }
}

▸ 2025-09-04

What's Changing?

  • The competitionCollectionId argument in the MatchesFilter is replaced by competitionCollectionIds and now accepts arrays.

Remove Notice

The old argument will be removed on October 27, 2025. After this date, queries using the deprecated argument will no longer be supported.

Example Queries

Old Query (Deprecated)

query OldQuery {
    matches(filter: {competitionCollectionId: 2}) {
        data {
            id
            competitionId
        }
    }
}

New Query (Recommended)

query NewQuery {
    matches(filter: {competitionCollectionIds: [2]}) {
        data {
            id
            competitionId
        }
    }
}

▸ 2025-08-21

What's Changing?

  • Introduced the new goLink(s) root query and field type
  • Moving deepLinks filter to the goLinks
  • New type selection argument for the goLinks filter
  • Deprecating the deepLinks field in the bookie type
  • Deprecating some fields in the DeepLink type
  • Removing isFiltersFallbackActive from bookie.deepLink filter

Remove Notice

The deprecated fileds will be removed on October 27, 2025. After this date, queries using the deprecated fields will no longer be supported.

Example Queries

Old Query (Deprecated)

query OldQeury {
    bookies {
        data {
            id
            deepLinks(filter: {country: AT}) { #deprecated
                id #deprecated
                countries #deprecated
                urlPattern #deprecated
                isFillingBetSlip
                glue
            }
        }
    }
}

New Query (Recommended)

query NewQuery {
    bookies {
        data {
            id
            goLinks(filter: {countries: AT, types: [DEEP_LINK, MULTI_DEEP_LINK]}) {
                data {
                    id # same as deepLink id
                    countries # same as deepLink countries
                    href # same as deepLink urlPattern
                    deepLink {
                        isFillingBetSlip
                        glue
                    }
                }
            }
        }
    }
}