API Documentation

Last updated November 11, 2026

The OWTV.gg API gives you programmatic access to match, team, player and tournament data. The documentation is public. A key is required to make requests, and keys are available to supporters on our Patreon. Use of the API is covered by our Terms of Service.

Overview

The API is a REST API that returns JSON. Every collection is available at the same base URL:

https://owtv.gg/api/<collection>

The schema can change while the API is in early access. Breaking changes are listed in the changelog.

Getting access

API access is included with the supporter tier on our Patreon. To get a key:

  1. Join the API access tier on Patreon.
  2. Request a key by emailing owtvgg@gmail.com or messaging us on Discord.
  3. We create your API client with the scopes and rate limit for your tier and let you know when it is ready.
  4. Generate your key from your API client. It is shown once.

Authentication

Send your key in the X-API-Key header on every request.

curl "https://owtv.gg/api/match?limit=10" \
  -H "X-API-Key: YOUR_KEY"

Keep your key private. Do not put it in client-side code, public repositories or screenshots. We store only a hash of your key, so we cannot recover it. If it leaks or you lose it, ask us to revoke it and generate a new one.

Rate limits

Each key is limited to 60 requests per minute by default. Higher limits can be set per key. When you exceed your limit the API responds with 429 Too Many Requests. Wait for the window to reset before retrying, and cache responses where you can.

Scopes

Each key has one or more scopes. A request to a collection outside your scopes returns 403.

ScopeAllowsCollections
read:matchesReadmatch, match-map, map-fight, player-map-stats, player-map-stats-hero, game-hero, game-map, hero-perk
read:teamsReadteam, team-membership, person
read:tournamentsReadtournament, tournament-phase, tournament-phase-round, tournament-phase-standing, tournament-result, region
read:fantasyReadComing soon. Not available yet.

Creating, updating and deleting any collection is not available through the API.

Reading data

Use GET /api/<collection> to list documents and GET /api/<collection>/<id> to fetch one.

ParameterExampleNotes
limitlimit=20Page size. Maximum 100.
pagepage=2Page number, starting at 1.
sortsort=-createdAtField to sort by. Prefix with - for descending.
depthdepth=0How far to expand related documents. 0 returns IDs only, 1 or 2 embeds them. Embedded data is limited to your scopes.
wherewhere[complete][equals]=trueFilter by field. Operators include equals, not_equals, in, greater_than and less_than.

Examples

All completed matches:

curl "https://owtv.gg/api/match?where[complete][equals]=true&limit=20" \
  -H "X-API-Key: YOUR_KEY"

Hero stats for one player on one map, with related data expanded:

curl "https://owtv.gg/api/player-map-stats-hero?where[playerMapStats][equals]=345&depth=1" \
  -H "X-API-Key: YOUR_KEY"

Paginated responses

List requests return docs plus pagination fields: totalDocs, limit, page, totalPages, hasNextPage and hasPrevPage.

Collections

Every document includes id, createdAt and updatedAt.

Teams and people

team

A team. Requires read:teams.

FieldTypeNotes
nametextTeam name.
initialstextShort name/ initials.
regionenumRegion the team is based in.
tierenumTier the team generally competes at. Currently unused.
nationalityenumNationality of the team.
imageID or objectTeam logo (media).
primaryColourtextHex code without #, for example FF0000.
accentColourtextHex code without #.
faceitIdtextFaceit team ID.
facebookUrltextURL
twitterUrltextURL
websiteUrltextOfficial website URL.
youtubeUrltextURL
liquipediaUrltextURL

person

A player, coach, analyst, content creator or other person in the scene. Requires read:teams.

FieldTypeNotes
aliastextGamer tag.
nametextLegal name. Often empty or same as alias.
jobenumThe job associated with this person.
playerRoleenumPlayer role. Empty for non-players.
regionenumRegion the person plays or works in.
nationalityenumNationality.
cachedTeamID[] (team)Current team or teams. Updated automatically from team-membership.
faceitIdtextFaceit ID.
gameIdtextGame-specific ID.
imageUrltextImage URL.
facebookUrltextURL
twitterUrltextURL
websiteUrltextURL
youtubeUrltextURL
liquipediaUrltextURL

team-membership

Which person was on which team, in which role, and when. Requires read:teams.

FieldTypeNotes
teamID (team)
personID (person)
jobenumJob on the team.
playerRoleenumRole on the team. Empty for non-players.
joinedDatedateWhen the person joined.
departedDatedateWhen the person left. Empty if they are still on the team.

Tournaments

region

A competitive region. Requires read:tournaments.

FieldTypeNotes
nametextDisplay name, for example Europe.
slugtextIdentifier, for example eu.
colortextHex colour including #.
logoID or objectRegion logo or flag (media).

tournament

A tournament. Requires read:tournaments.

FieldTypeNotes
nametext
slugtextURL-safe name, up to 40 characters.
descriptiontext
informationJSONRich text content in Lexical JSON format.
regionsID[] (region)Regions the tournament is played in.
tierenumTournament tier. Not currently used.
startDatedate
endDatedate
formatonline | lan
locationtextCity and country of the venue. LAN only.
venuetextVenue name. LAN only.
countryCodetextISO 3166-1 alpha-2 code, for example KR. LAN only.
mapPoolID[] (game-map)Maps available in the tournament.
hasDropsbooleanWhether drops are enabled.
imageID or objectTournament image (media).
phasesjoinRead-only list of tournament-phase documents.
resultsjoinRead-only list of tournament-result documents.

tournament-phase

A stage of a tournament, such as groups or playoffs. Requires read:tournaments.

FieldTypeNotes
titletextGenerated. Tournament name and phase name.
tournamentID (tournament)
nametextFor example Groups or Playoffs.
typeenumPhase format.
descriptiontext
startDatedate
endDatedate
carryOverFromID (tournament-phase)Phase whose standings carry into this one.
mapPoolOverrideID[] (game-map)Replaces the tournament map pool for this phase. Empty means inherit.
roundsjoinRead-only list of tournament-phase-round documents.
matchesjoinRead-only list of match documents.
standingsjoinRead-only list of tournament-phase-standing documents.

tournament-phase-round

A round within a phase. Requires read:tournaments.

FieldTypeNotes
tournamentPhaseID (tournament-phase)
nametextFor example Week 1 or Round of 16.
ordernumberDisplay order.

tournament-phase-standing

A team's standing within a phase. Requires read:tournaments.

FieldTypeNotes
tournamentPhaseID (tournament-phase)
teamID (team)
seednumberEntry seeding. Set on the first phase of a tournament.
groupNumbernumberGroup within the phase, if there are groups.
cachedGamesPlayednumberMatches played.
cachedGamesWonnumberMatches won.
cachedGamesLossednumberMatches lost.
cachedGamesDrewnumberMatches drawn.
cachedMapsPlayednumberMaps played.
cachedMapsWonnumberMaps won.
cachedMapsLossednumberMaps lost.
cachedMapsDrewnumberMaps drawn.
tiebreakerOrdernumberManual ordering used to break ties.

tournament-result

A final placement in a tournament. Requires read:tournaments.

FieldTypeNotes
tournamentID (tournament)
teamID (team)Team that achieved the result.
positionFromnumberStart of the placement range, for example 4 for 4th to 5th.
positionTonumberEnd of the range. Empty for a single position.
prizenumberPrize money in USD.
qualifiesToID[] (tournament)Tournaments this placement qualifies the team for.

Matches and stats

match

A match between two teams. Scores and winner are generated from its maps. Requires read:matches.

FieldTypeNotes
tournamentPhaseID (tournament-phase)
roundID (tournament-phase-round)
slugtextURL-safe identifier.
team1ID (team)Empty until the team is decided. See team1Placeholder.
team2ID (team)Empty until the team is decided. See team2Placeholder.
team1PlaceholdertextLabel shown while team1 is undecided.
team2PlaceholdertextLabel shown while team2 is undecided.
team1ScorenumberMaps won by team 1.
team2ScorenumberMaps won by team 2.
winningTeamID (team)
resultTypeenumHow the match ended: normal play, forfeit or disqualification.
startDatedateScheduled start time.
completebooleanWhether the match has concluded.
firstTonumberMap wins needed. 2 for a Bo3, 3 for a Bo5.
regionsID[] (region)Generated from the tournament.
mapsjoinRead-only list of match-map documents.
cachedTeam1VotesnumberGenerated from supporter votes.
cachedTeam2VotesnumberGenerated from supporter votes.
previousSlugsarrayObjects with a slug field. Old slugs for redirects.
bracketMatchNumbernumberMatch number within the bracket.
bracketGrouptextGroup label when a phase has parallel brackets.
bracketSideenumwinners, losers, grand_final, third_place, seeding, main or fifth_place.
nextMatchWinnerID (match)Match the winner advances to.
nextMatchWinnerSlotteam1 | team2Slot the winner fills.
nextMatchLoserID (match)Match the loser drops to. Double elimination.
nextMatchLoserSlotteam1 | team2Slot the loser fills.
qualifiesWinnerToPhaseID (tournament-phase)Phase the winner advances to.
qualifiesWinnerToPhaseLabeltextCustom label for the winner's qualification.
qualifiesLoserToPhaseID (tournament-phase)Phase the loser advances to.
qualifiesLoserToPhaseLabeltextCustom label for the loser's qualification.

match-map

A single map played within a match. Requires read:matches.

FieldTypeNotes
matchID (match)Parent match.
mapID (game-map)
mapIndexnumberPosition of the map in the match.
slugtextURL-safe identifier.
team1ScorenumberScore for team 1.
team2ScorenumberScore for team 2.
winningTeamID (team)
completebooleanWhether the map has concluded.
resultTypeenumHow the map ended: normal play, forfeit or disqualification.
blueTeamID (team)Team on blue side. Used for advanced stats.
redTeamID (team)Team on red side. Used for advanced stats.
mapPickerTypeenumHow the map was chosen.
mapPickerID (team)Team that picked the map.
firstBanID (team)Team with the first ban.
team1BanID (game-hero)Hero banned by team 1.
team2BanID (game-hero)Hero banned by team 2.
oneVsOneWinnerID (team)Winner of the 1v1 that decides picks. OWWC Format.
winnerChoicemap | banOrderWhat the 1v1 winner chose.
banOrderChoicefirst | secondBan order chosen.
replayCodetextReplay code, up to 12 characters.
replayParsedtextReplay parsing status.
eventLogJSONRaw map event log.
playerStatsjoinRead-only list of player-map-stats documents.

map-fight

A team fight within a map. Requires read:matches.

FieldTypeNotes
matchMapID (match-map)
fightNumbernumberFight order within the map, from 1.
fightStartTimenumberSeconds from map start. 0 or more.
fightLengthnumberSeconds.
winningTeamID (team)Empty if the fight had no winner.
losingTeamID (team)Empty if the fight had no loser.
team1Killsnumber
team2Killsnumber
team1Deathsnumber
team2Deathsnumber
team1UltsarrayObjects with a hero ID. One per ultimate used.
team2UltsarrayObjects with a hero ID. One per ultimate used.
eventLogJSONRaw fight event log.

player-map-stats

A player's stat line for one map. Requires read:matches.

FieldTypeNotes
matchMapID (match-map)
teamID (team)
personID (person)
roleenumRole played on this map.
eliminationsnumber
assistsnumber
deathsnumber
damageDealtnumber
healingDonenumber
damageMitigatednumber
cachedFantasyScorenumberGenerated fantasy score.
matchStartDatedateGenerated from the match.
heroStatsjoinRead-only list of player-map-stats-hero documents, longest playtime first.

player-map-stats-hero

A player's stats on one hero within a map. Requires read:matches.

FieldTypeNotes
playerMapStatsID (player-map-stats)
heroID (game-hero)
playtimenumberSeconds.
totalElimsnumber
totalAssistsnumber
totalDeathsnumber
totalDmgnumberDamage dealt.
totalHealnumberHealing done.
totalMitnumberDamage mitigated.
fightsTotalnumberFights played on this hero.
totalUltsUsednumber
totalUltChargeTimenumberSeconds.
minorPerksID[] (hero-perk)
majorPerksID[] (hero-perk)

Game data

game-hero

A hero. Use these IDs in stats payloads. Requires read:matches.

FieldTypeNotes
nametext
gameRoleenumTank, damage or support.
gameIdtextInternal game identifier.
faceitIdtextFaceit hero ID.
imageID or objectHero image (media).

game-map

A map. Requires read:matches.

FieldTypeNotes
nametext
modeenumGame mode.
gameIdtextInternal game identifier.
imageID or objectMap image (media).

hero-perk

A minor or major perk for a hero. Requires read:matches.

FieldTypeNotes
nametext
heroID (game-hero)Hero the perk belongs to.
perkTypeenumMinor or major.
activebooleanWhether the perk is currently in the game.
releasedAtdateRelease date.
sunsetAtdateDate the perk was removed. Never before releasedAt.

Errors

StatusMeaningWhat to do
400The body or query failed validation.Check field names, types and required fields.
401The key is missing, invalid or revoked.Check the X-API-Key header.
403Your key lacks the scope, or a field is not writable.Check your scopes and the writable fields above.
404The collection or document does not exist.Check the collection name and ID.
429You exceeded your rate limit.Wait for the next 60 second window.

Error responses are JSON:

{
  "errors": [{ "message": "Forbidden: field not writable" }]
}

Changelog and support

  • November 11, 2026. Public documentation published.

Found a bug, need a higher rate limit or want a key revoked? Email owtvgg@gmail.comor message us on Discord .