# Spectate Esports — Full LLM Reference > Comprehensive machine-readable reference for AI systems. Includes complete entity data, hero lists, API response schemas, team rosters, historical context, and technical architecture details. This document extends llms.txt with exhaustive data for RAG pipelines, fine-tuning datasets, and deep AI retrieval systems. See https://spectateesports.live/llms.txt for the concise version. --- ## Site Identity - **Name**: Spectate Esports - **URL**: https://spectateesports.live - **X (Twitter)**: https://x.com/SpectateDota2 - **Category**: Esports data platform / Dota 2 match viewer - **Coverage**: Tier 1 professional Dota 2 only (DreamLeague, ESL One, PGL, BLAST, WePlay, The International, Riyadh Masters, BTS) - **Data freshness**: Live scores update every 2 minutes; completed match stats index 30–90 min after series ends - **Founded**: 2026 --- ## Complete Page Index ### Core Pages - **Home** (https://spectateesports.live/) — Live matches, upcoming schedule, completed results. Polls every 2 minutes. Shows series score (e.g. 1-0 in a BO3), current game number, active Twitch/YouTube streams, tournament name, and bracket round label (e.g. "Grand Final", "Upper Bracket Semifinal"). During active tournament coverage, shows an editorial story card (sky-tinted, above live matches) with the latest article title, category, and read time. - **Tournaments** (https://spectateesports.live/tournaments) — Index of all Tier 1 series. Filterable by status: running/upcoming/completed. Shows prize pools in USD, team counts, date ranges, region breakdown. - **Tournament Detail** (https://spectateesports.live/tournament/{keyword-slug}-{id}, e.g. /tournament/esports-world-cup-2026-10728; bare-numeric /tournament/{id} URLs 301-redirect to the slug form) — Full tournament hub for a single event series. Tabs: Info (overview + live matches), Standings (W-L table with advancing/eliminated zones), Schedule (bracket view), Stats (hero pick/ban table + player performance leaderboard), Videos (YouTube highlights). - **News** (https://spectateesports.live/news) — Aggregated news feed. Sources: Steam Community (official patches), Liquipedia (roster moves), PCGamesN, Dot Esports, Currents API. Filters by category (roster, patch, match-result). Unread indicator tracks articles since last visit. - **Calendar** (https://spectateesports.live/calendar) — Subscribe to .ics feeds. Three modes: (1) All Tournaments feed (every Tier 1 match auto-updating), (2) Team-specific feed (select teams by name), (3) Per-tournament feed. Generates webcal:// URLs for one-click add to Google/Apple/Outlook calendar. - **Match Detail** (https://spectateesports.live/match/{slug}-{matchId}) — Individual game page. Slug format: `{team-a}-vs-{team-b}-{tournament-name}-{matchId}`. Contains VOD link, draft, gold graph, player stats, AI summary. - **Best Matches** (https://spectateesports.live/best-matches) — Ranked archive of every Tier 1 professional Dota 2 game, scored 0-10 on watchability: how good the game was to WATCH, independent of who won. Scored from OpenDota post-game data: tension (30%, how much of the game stayed in doubt, weighted towards later minutes; length itself earns nothing past ~40 minutes), swing (22%, how close the winner came to losing after the laning stage), lead changes (10%), contested kill pace (15%, kills both teams were getting), how far the winner's own base fell (13%), and the biggest late swing in win probability (10%). Lead size is always judged against what a lead is worth at that minute, so a 15,000 gold deficit at minute 20 and at minute 60 are not scored alike. Filterable by tournament via /best-matches?league={openDotaLeagueId}. **Deliberately spoiler-free**: no winner and no kill score appears on the page or in the API response. Structured data: CollectionPage + ItemList + BreadcrumbList schema.org. - **About** (https://spectateesports.live/about) — Site description and data attribution. - **Release Notes** (https://spectateesports.live/release-notes) — Chronological feature changelog. - **Glossary** (https://spectateesports.live/glossary) — Definitions for 25 Dota 2 professional terms (draft, GPM, Roshan, Rampage, BKB, Aegis, etc.). Each term has a dedicated page at /glossary/{term-id} with full definition and related terms. All pages include DefinedTerm schema.org structured data. - **Pro Teams** (https://spectateesports.live/teams) — Tier 1 organization index. Each org has a dedicated page at /teams/{slug} combining live competitive data with stable organization history. - **Live** (via OpenDota, refreshed continuously): recent Tier 1/Tier 2 results grouped into SERIES (not individual games) with scoreline, opponent, tournament and date; the org's series record over an explicitly stated sample size; and the org's best games ranked by Spectate's 0-10 watchability score, each linking to a replay timestamped to the start of that game. The best-games section never shows winners. - **Historical** (via Liquipedia, stable): competitive region, HQ country, TI championship record, iconic players, org description, and a Liquipedia link for current rosters. Player rosters are intentionally not duplicated here — they change frequently; Liquipedia is the authoritative source. - **Organization identity across rebrands**: OpenDota assigns a NEW team_id when an org rebrands rather than renaming the existing one, so one org's competitive record is split across several ids. Spectate publishes the reconciled id list per org and queries all of them together. Verified examples: TEAM VISION = 9572001 + 9824702 (PVISION), BetBoom Team = 8255888 (BoomBoys) + 9131584 (BB Team), 1win = 10150413 + 10182357 (1w, Iron Wing), Nigma Galaxy = 10136357 + 7554697. Multi-id merges were confirmed by shared player account_ids, not by name similarity. - Structured data: SportsTeam with `subEvent` entries for recent series (each a SportsEvent linking team, opponent and tournament) plus a ranked `ItemList` of the best games to watch. - Coverage: 20 organizations. Added 2026-09-12: Natus Vincere, MOUZ, Aurora Gaming, LGD Gaming, L1GA TEAM (also HULIGANI / L1 TEAM), GamerLegion, Vici Gaming. Every org fact is sourced from Liquipedia and every team id from OpenDota; orgs with no Liquipedia history beyond a one-line description do not get a page. - Inbound links: team names in the match drawer and the live series sheet link to the team's page wherever one exists, including when the match record uses an earlier brand name (BoomBoys → BetBoom Team, PVISION → TEAM VISION, HULIGANI → L1GA TEAM). Tournament rosters offer a link to each participating team's page. - Entity identity across pages: on match pages (https://spectateesports.live/match/{slug}) and tournament pages (https://spectateesports.live/tournament/{slug}), each `competitor` SportsTeam node that has a team page carries the same `@id` that team page publishes (`https://spectateesports.live/teams/{slug}#team`) plus its `url`. A match, its tournament and the competing teams therefore resolve to the same entities rather than to name strings. - **Articles** (https://spectateesports.live/articles) — Original editorial coverage of Tier 1 Dota 2 tournaments. One article per day during major events. Includes tournament analysis, team narratives, match previews, and storyline breakdowns. Individual articles at /articles/{slug}. - **BLAST Slam VII Coverage Hub** (https://spectateesports.live/articles?tournament=blast-slam-vii) — Daily editorial coverage of BLAST Slam VII (May 26 – June 7, 2026, Copenhagen, $1,000,000 prize pool). Twelve teams: Team Falcons (TI14 champions), Team Yandex, PARIVISION, Team Liquid, Team Spirit, LGD Gaming, OG Esports, Tundra Esports, BetBoom Team, HEROIC, Aurora Gaming, GLYPH. - **Pro Player Pages** (https://spectateesports.live/players/{slug}) — Every active tier-1 pro's hero pool: heroes played in tier-1 games over the last 90 days, with counts per event, each linking to that pro's games on that hero. Spoiler-free: game counts only, no wins/KDA. 129 pros as of 2026-09-26; the 29 TI winners also have a career bio. Structured data: Person + WebPage + ItemList. - **Hero Pages** (https://spectateesports.live/heroes/{slug}) — One spoiler-free guide per Dota 2 hero (110+ heroes). Shows how often tier-1 pros pick the hero (pick rate and rank over the last 90 days, win rate only when the sample is at least 20 picks), which pros played it most, and the best and latest tier-1 games with that hero, linking to match replays. No winners or scores. The index at /heroes ranks every hero by pick rate. Slug format: OpenDota hero key with `npc_dota_hero_` stripped (e.g., `puck`, `anti_mage`, `invoker`, `shadow_fiend`). Hero portraits from Valve CDN. Structured data: Thing + WebPage + ItemList + BreadcrumbList schema.org. Canonical URL: /heroes/{slug}. - **TI History Hub** (https://spectateesports.live/tournaments/the-international) — Complete history of The International (TI1 2011 – TI14 2025). Champions, runners-up, prize pools, and host cities for all 14 editions. Includes context: no TI held in 2020 (COVID), TI10 held in 2021; crowd-funded prize pool era TI4–TI12 (peak $40.02M at TI10); Valve discontinued Battle Pass model after TI12 2023. Multi-year champions: OG (TI8 2018, TI9 2019), Team Spirit (TI10 2021, TI12 2023), Team Liquid (TI7 2017, TI13 2024). Structured data: SportsEvent schema for each edition + BreadcrumbList. --- ### Russian language edition (`/ru`) - `/ru/tournaments` - Russian edition of the tournament list. Indexed. - `/ru/about` - Russian edition of the about page. Indexed. As of 2026-09-16 the whole app's UI is translated in the Russian edition — homepage feed, match details, live series companion, search, calendar, best matches, and every label in between — not only these two paths. Indexing is still limited to the two paths above, though: that limit is a deliberate crawler-cost control, not a translation gap. Every other `/ru/*` path renders correctly in Russian for a reader who selects it in the site settings, but is excluded from robots.txt and served with `X-Robots-Tag: noindex`; treat the English URL as canonical for that content. `/ru` (the Russian homepage) is in this excluded-from-indexing group. UI copy is authored in Russian rather than machine-translated. Team, player, tournament and organiser names are kept in Latin script, matching Russian esports press convention. News headlines, article bodies, and team/player biographies remain English-only on the Russian edition too — that is written editorial content, not an app label. English is the default language and carries no URL prefix. ## Tier 1 Tournament Organizers (Entity Map) ### ESL Gaming / DreamHack - **DreamLeague**: Premier European-based Dota 2 LAN circuit. Multiple seasons per year. Held at various European venues (historically Stockholm, Leipzig, and others). Prize pool: $500K–$1M+ per season. Top-8 format with group stage + double-elimination playoffs. - **ESL One**: International LAN events. Locations vary: Birmingham (UK), Kuala Lumpur (Malaysia), Melbourne (Australia). Prize pools $300K–$500K. ### PGL (Professional Gamers League) - **PGL Wallachia**: Held in Bucharest, Romania. - **PGL Lausanne**: Held in Lausanne, Switzerland. - PGL is known for high production quality and strong community engagement. Prize pools $500K+. ### BLAST - **BLAST Slam**: Premier BLAST Dota 2 event. International format. - **BLAST Bounty**: Secondary BLAST circuit event. ### WePlay Esport - Ukrainian esports organization. Notable for creative broadcast production. - **WePlay AniMajor**, **WePlay Academy League**, various international events. ### Valve Corporation - **The International (TI)**: Annual world championship. The flagship Dota 2 event. Prize pool from TI1–TI12 was crowdfunded via in-game Battle Pass, reaching $40.02M at TI10 (2021) — the largest prize pool in esports history at the time. Valve discontinued the Battle Pass model after TI12 (2023); subsequent editions have smaller base prize pools. Teams qualify via regional tournament circuits and direct Valve invites. - **The International 2026 (TI15)**: August 13–23, 2026, Oriental Sports Center, Shanghai, China — first TI in China since TI9 (2019). Base prize pool $1,600,000. 16 teams. Format: Group Stage (Aug 13–16, Swiss system, best-of-3) → top 3 advance directly to Playoffs; 4th–13th play a single-elimination Elimination Round for the remaining 5 playoff slots; 14th–16th eliminated. Playoffs (Aug 20–23): double elimination, best-of-3, Grand Final best-of-5. Live tournament page: https://spectateesports.live/tournament/the-international-2026-10828. - TI history: TI1 (2011, Cologne — Natus Vincere), TI2 (2012, Seattle — Invictus Gaming), TI3 (2013, Seattle — Alliance), TI4 (2014, Seattle — Newbee), TI5 (2015, Seattle — Evil Geniuses), TI6 (2016, Seattle — Wings Gaming), TI7 (2017, Seattle — Team Liquid), TI8 (2018, Vancouver — OG), TI9 (2019, Shanghai — OG), TI10 (2021, Bucharest — Team Spirit), TI11 (2022, Singapore — Tundra Esports), TI12 (2023, Seattle — Team Spirit), TI13 (2024, Copenhagen — Team Liquid), TI14 (2025 — Team Falcons), TI15 / TI 2026 (2026-08-13 to 2026-08-23, Shanghai — in progress/upcoming). No event in 2020 (COVID-19). ### Riyadh Masters - Saudi Arabia-based super tournament. Organized by Gamers8. Prize pools $15M+. Held in Riyadh, Saudi Arabia. ### Beyond The Summit (BTS) - Boutique production studio based in Los Angeles. Known for relaxed, personality-driven broadcasts. Lower prize pools but high production quality. --- ## Tier 1 Teams — Background & History > **Note on rosters**: Professional Dota 2 rosters change frequently between and during seasons. This section covers organizational history, region, and TI record. For current player rosters, see Liquipedia: https://liquipedia.net/dota2/Portal:Teams > > **Dedicated team pages**: Each organization has a dedicated page at https://spectateesports.live/teams/{slug} with SportsTeam schema.org structured data. Source: Liquipedia (https://liquipedia.net/dota2/). TI records verified against https://liquipedia.net/dota2/The_International. ### OG (WEU) - **Organization based in**: Europe - **TI wins**: TI8 (2018), TI9 (2019) — first and only back-to-back TI champions - **Founded**: October 31, 2015 - **Iconic players**: N0tail, Fly, ana, Topson, Ceb - **Historic note**: First team to win TI from the open qualifiers (TI8). First team to win four Dota Major Championships. ### Team Liquid (WEU) - **Organization based in**: Netherlands (founded 2000; Dota 2 division est. December 2012) - **TI wins**: TI7 (2017), TI13 (2024) — first organization to win TI with two entirely different rosters - **Iconic players**: KuroKy, Miracle-, MATUMBAMAN, GH, MinD_ContRoL - **Historic note**: TI7 won with KuroKy-led roster. TI13 won with miCKe/Nisha-led roster. ### Team Spirit (EEU) - **Organization based in**: Russia (founded December 2015) - **TI wins**: TI10 (2021), TI12 (2023) — second team after OG to win multiple TIs - **Iconic players**: Yatoro, Collapse, TORONTOTOKYO, Miposhka, Mira - **Historic note**: Won TI10 as underdogs. Second Eastern European org to win TI after Natus Vincere. ### Team Falcons (WEU) - **Organization based in**: Saudi Arabia (founded 2017; Dota 2 division est. November 2023) - **TI wins**: TI14 (2025) — became champions less than two years after entering Dota 2 - **Iconic players**: skiter, Malr1ne, ATF, Cr1t-, Sneyking - **Historic note**: Won DreamLeague Season 22, 23, and 24 before winning TI14. Defeated Xtreme Gaming 3-2 in the grand final. ### Tundra Esports (WEU) — exited Dota 2 - **Organization based in**: United Kingdom (London; founded January 25, 2021) - **TI wins**: TI11 (2022) — dropped only one game across the entire playoff stage - **Iconic players**: skiter, Nine, 33, Saksa, Sneyking - **Historic note**: Defeated Team Secret 3-0 in the TI11 Grand Final without losing a single series in the main event. - **Status**: Exited competitive Dota 2 on June 1, 2026. Full roster and TI 2026 direct invite transferred to 1win (also branded 1w Team and Iron Wing during 2026). ### 1win (EEU) — also branded 1w Team and Iron Wing during 2026 - **Organization based in**: Russia (entered Dota 2 February 2024) - **TI wins**: None - **Iconic players**: None established (org is new to Dota 2) - **Notable**: Branded "1w Team" (from 2026-08-01) and "Iron Wing" (from 2026-08-10) during 2026; Spectate shows it as "1win", the name PandaScore uses. Signed the full Tundra Esports roster in June 2026, inheriting their TI 2026 direct invite. Previous 1win Dota 2 squad departed to compete independently as "Enjoy" per Valve regulations prohibiting multiple affiliated teams in official tournaments. ### Evil Geniuses (NA) — disbanded - **Organization based in**: United States (Dota 2 division est. October 2011; disbanded November 2023) - **TI wins**: TI5 (2015) — first North American organization to win The International - **Iconic players**: Fear, SumaiL, UNiVeRsE, ppd, Arteezy - **Status**: Dota 2 division disbanded November 2023. ### Nigma Galaxy (WEU) - **Organization based in**: United Arab Emirates (founded November 25, 2019) - **TI wins**: None. Founding members were part of Team Liquid's TI7 (2017) championship roster. - **Iconic players**: Miracle-, KuroKy, GH, MinD_ContRoL, w33 - **History**: Merged with Galaxy Racer in September 2021. Competed at TI14 (2025), finishing 5th–6th. ### BetBoom Team (EEU) - **Organization based in**: Russia (established April 2022) - **TI wins**: None - **Iconic players**: save-, gpk, TORONTOTOKYO, Nightfall, SoNNeikO - **Notable wins**: BLAST Slam I (2024) ### Virtus.pro (EEU) - **Organization based in**: Russia (now headquartered in Armenia; Dota 2 division est. 2012) - **TI wins**: None - **Iconic players**: No[o]ne, RAMZES666, Solo, 9pasha, RodjER - **Notable wins**: ESL One Hamburg 2017, The Bucharest Major, ESL One Birmingham 2018, The Kuala Lumpur Major — five major championships in 2017–2018. ### Xtreme Gaming (CN) - **Organization based in**: China (founded January 2021) - **TI wins**: None. TI14 (2025) runners-up, losing 3-2 to Team Falcons in the grand final. - **Iconic players**: Ame, Xm, XinQ, Xxs - **Notable**: Went 4-0 in the TI14 group stage, claiming the top playoff seed. ### TEAM VISION (CIS) — also known as PARIVISION, PVISION - **Organization based in**: Serbia (entered Dota 2 October 2024) - **TI wins**: None - **Iconic players**: None established (org is new to Dota 2) - **Notable wins**: ESL One Bangkok 2024, ESL One Raleigh 2025, Esports World Cup 2026 (as PVISION) - **Notable**: Competes at The International 2026 under a third name, TEAM VISION, having previously competed as PARIVISION and PVISION. ### Team Yandex (CIS) - **Organization based in**: Russia (entered Dota 2 June 2025) - **TI wins**: None - **Iconic players**: None established (org is new to Dota 2) - **Notable wins**: PGL Wallachia Season 7 (March 2026), BLAST Slam VII (June 2026) - **Notable**: Backed by Russian tech company Yandex, which acquired the Cyber Goose roster to launch the team in June 2025. Former Virtus.pro/Team Spirit core player RAMZES666 serves as team ambassador. --- ## Complete Dota 2 Hero Reference (by Primary Attribute) ### Strength Heroes (selected major pro picks) - Axe — Offlane initiator. Berserker's Call + Culling Blade combo. - Centaur Warrunner — Tanky offlaner with Return passive and Stampede global team ability. - Dragon Knight — Durable midlaner/offlaner. Dragon Blood tankiness + Elder Dragon Form transformation. - Earthshaker — Support/offlaner. Fissure terrain-blocking + Echo Slam team fight ultimate. - Lycan — Carry/offlaner. Summons wolves, Shapeshift ultimate for burst damage. - Mars — Offlane initiator. Arena Of Blood crowd control ultimate. - Night Stalker — Roaming support/offlaner. Darkness night vision advantage. - Omniknight — Support. Repel magic immunity, Guardian Angel invulnerability ultimate. - Primal Beast — Offlane. Trample area damage, Uproar scaling strength gain. - Slardar — Offlane initiator. Corrosive Haze armor reduction, Amplify Damage. - Tidehunter — Offlane. Gush slow, Ravage global-range team fight ultimate. - Timbersaw — Offlane. Pure damage Whirling Death, Chakram area control. - Underlord — Offlane. Firestorm area pressure, Pit of Malice root, Dark Rift global teleport. - Wraith King — Carry. Mortal Strike critical strike, Reincarnation passive resurrection. ### Agility Heroes (selected major pro picks) - Anti-Mage — Hard carry. Mana Burn (counters intelligence heroes), Mana Void nuke. - Drow Ranger — Carry. Precision Aura global range damage, Gust silence. - Gyrocopter — Carry. Multi-target damage with Rocket Barrage and Call Down ultimate. - Juggernaut — Carry. Bladefury magic immunity, Omnislash ultimate. - Lifestealer — Carry. Feast lifesteal, Rage magic immunity, Infest ability. - Lone Druid — Carry. Spirit Bear summon, True Form transformation. - Luna — Carry. Moon Glaives cleave, Eclipse ultimate burst damage. - Medusa — Late-game carry. Mana Shield, Split Shot multi-target, Stone Gaze area ultimate. - Meepo — Carry. Clone copies with Poof ability. Requires high mechanical skill. - Morphling — Carry. Attribute Shift (agility/strength), Replicate hero-copy ability. - Naga Siren — Carry/support. Mirror Image illusions, Song of the Siren area sleep ultimate. - Phantom Assassin — Carry. Coup de Grace critical strike, Blur evasion. - Phantom Lancer — Carry. Spirit Lance, Doppelwalk, Juxtapose illusion army. - Razor — Mid/Carry. Plasma Field, Static Link (drains enemy damage), Unstable Current. - Shadow Fiend — Mid. Necromastery soul mechanic, Requiem of Souls ultimate. - Slark — Carry. Pounce (leash), Dark Pact (dispel), Shadow Dance evasion ultimate. - Spectre — Carry. Haunt global ultimate (illusions to all enemies), Spectral Dagger. - Terrorblade — Carry. Metamorphosis, Reflection (reversal illusion), Sunder HP swap ultimate. - Ursa — Carry. Fury Swipes stacking damage, Enrage damage reduction ultimate. - Weaver — Carry. Time Lapse rewind ultimate. Shukuchi invisibility + phased movement. ### Intelligence Heroes (selected major pro picks) - Ancient Apparition — Support. Ice Blast ultimate that prevents healing when it kills. - Crystal Maiden — Support. Global mana regen aura, Freezing Field ultimate. - Dark Seer — Offlane/support. Ion Shell, Vacuum + Wall of Replica combo. - Death Prophet — Mid. Exorcism spirits ultimate. Strong push/teamfight hero. - Enigma — Jungle/offlane. Black Hole global teamfight ultimate. Malefice stun. - Invoker — Mid. Most complex hero; 10 spells invoked from 3 orbs. Sun Strike, Cold Snap, Tornado, EMP, Chaos Meteor, Deafening Blast, Forge Spirit, Alacrity, Ghost Walk, Ice Wall. - Leshrac — Mid/support. Pulse Nova area damage, Lightning Storm chain stun. - Lina — Mid/support. Light Strike Array stun, Laguna Blade nuke. - Lion — Support. Earth Spike stun, Mana Drain, Finger of Death nuke. - Nyx Assassin — Support/ganker. Spiked Carapace reflect, Impale stun, Mana Burn. - Outworld Destroyer — Mid. Arcane Orb unique damage. Sanity's Eclipse ultimate. - Puck — Mid. Phase Shift magic immunity, Dream Coil ultimate. - Pugna — Mid/support. Decrepify, Nether Ward mana punisher, Life Drain. - Rubick — Support. Spell Steal ultimate copies any enemy ability. Grand Magus of magic play. - Silencer — Support/mid. Global Silence ultimate, Curse of the Silent mana burn, Last Word. - Tinker — Mid. March of the Machines, Rearm ultimate (refreshes all items + abilities). - Visage — Support/mid. Grave Chill, Gravekeeper's Cloak, Familiars summons. - Zeus — Mid/support. Thundergod's Wrath global damage ultimate, Lightning Bolt. ### Universal Heroes (selected major pro picks) - Arc Warden — Carry. Tempest Double ultimate creates a clone with full item copies. - Brewmaster — Offlane/support. Primal Split ultimate splits into 3 elemental avatars. - Chen — Support. Holy Persuasion converts neutral creeps. Requiresmap awareness. - Clockwerk — Support/offlane. Hookshot grappling hook initiation, Cog trapping. - Elder Titan — Support. Echo Stomp sleep, Earth Splitter area ultimate. - Faceless Void — Carry. Chronosphere time-stop ultimate. Backtrack evasion. - Io — Support. Tether (link to ally for heal/ms), Relocate global teleport ultimate. One of the most complex support heroes. - Keeper of the Light — Support. Illuminate AoE nuke, Blinding Light, Spirit Form phase. - Marci — Offlane/support. Unleash combo ultimate. Dispose repositioning. - Mirana — Support/mid. Sacred Arrow long-range stun, Moonlight Shadow team invisibility. - Nature's Prophet — Offlaner/jungler. Teleportation (global), Sprout, Treant summons, Wrath of Nature ultimate. - Pangolier — Mid/offlane. Rolling Thunder ultimate. Lucky Shot passive. - Sand King — Support/offlane. Epicenter channel ultimate with massive AoE damage. - Storm Spirit — Mid. Ball Lightning mobility (charges-based movement). Electric Vortex. --- ## API Response Schemas ### GET /api/live-matches Returns array of live Dota 2 series currently being played. ```json [ { "id": "string (PandaScore match ID)", "teamA": "string (team name)", "teamB": "string (team name)", "tournament": "string (tournament display name)", "seriesLabel": "string (e.g. 'BO3')", "bracketRound": "string | null (e.g. 'Grand Final', 'Upper Bracket Semifinal')", "seriesScore": "string (e.g. '1-0')", "currentGame": "number | null (game currently being played, 1-indexed)", "streams": [{ "url": "string", "language": "string" }], "youtubeStream": "string | null", "games": [ { "position": "number", "status": "string ('running'|'finished'|'not_started')", "winnerName": "string | null", "matchId": "string | null (OpenDota match ID)", "beginAt": "string (ISO 8601)", "length": "number | null (seconds)" } ] } ] ``` ### GET /api/upcoming-matches Returns array of Dota 2 series scheduled in the next 72 hours. ```json [ { "id": "string", "scheduledAt": "string (ISO 8601)", "teamA": "string", "teamB": "string", "tournament": "string", "seriesLabel": "string", "bracketRound": "string | null", "streams": [{ "url": "string", "language": "string" }] } ] ``` ### GET /api/upcoming-matches?mode=roster&id={pandaScoreSeriesId} The five players each side is expected to field in a scheduled series, from PandaScore's current team rosters. `teams[].players` are ordered position 1 (carry) to 5 (hard support); `position` is null when PandaScore has no role for a player. This is a roster, not a confirmed lineup — a stand-in is not visible until the game starts. Contains no result or score. A failure returns `{ teams: [], unavailable: true }` and is held for at most 30 seconds. ```json { "teams": [ { "id": 137073, "name": "Team Yandex", "players": [ { "name": "watson", "position": 1 } ] } ] } ``` ### GET /api/upcoming-matches?mode=picks&ids={id,id,...} Anonymous tally of which side fans called on scheduled series, before they started. `a` and `b` are the two opponent slots, in the same order `/api/upcoming-matches` returns them. `pctA`/`pctB` are **null below a 10-pick noise floor**: a percentage drawn from a handful of people is not a signal, so the raw counts are published and the percentages are withheld. Every pick counted here was recorded before its series began — enforced by a database constraint, not by a response filter — so a tally cannot drift toward the winner and reveals nothing about the result. Max 60 ids per request. ```json { "tallies": { "": { "total": 34, "a": 24, "b": 10, "pctA": 71, "pctB": 29 } } } ``` ### GET /api/tournaments?mode=series Returns categorized list of Dota 2 tournament series. ```json { "running": [ { "id": "number (PandaScore series ID)", "name": "string (full series name, e.g. 'DreamLeague Season 29 2025')", "leagueName": "string (e.g. 'DreamLeague')", "status": "'running'", "beginAt": "string (ISO 8601)", "endAt": "string | null", "prizePool": "number | null (USD)", "prizePoolCurrency": "string | null", "winner": { "name": "string", "imageUrl": "string | null" } | null, "teamsCount": "number", "tier": "string ('s'|'a')" } ], "upcoming": [...], "completed": [...] } ``` ### GET /api/news Returns aggregated Dota 2 news articles. Add `?format=rss` for RSS 2.0 XML output. ```json { "articles": [ { "id": "string (djb2-xor URL hash for deduplication)", "title": "string", "excerpt": "string (truncated description, max 200 chars)", "url": "string (canonical article URL)", "source": { "id": "string (e.g. 'steam-news-api', 'liquipedia', 'currents')", "name": "string (e.g. 'Dota 2 Official', 'Liquipedia', 'Currents')", "baseUrl": "string", "reliability": "number (1–5)" }, "publishedAt": "string (ISO 8601)", "fetchedAt": "string (ISO 8601)", "tags": { "games": ["string (e.g. 'dota2')"], "categories": ["string (e.g. 'roster', 'tournament', 'patch', 'match-result', 'general')"], "entities": ["string (matched tier-1 team/tournament names found in article text)"] } } ], "meta": { "sources": { "steam-news-api": "number", "liquipedia": "number", "currents": "number" }, "fetchedAt": "string (ISO 8601)", "cached": "boolean", "total": "number" } } ``` ### GET /api/tournament-detail?series=1&id={seriesId} Returns full tournament detail for a specific series. ```json { "name": "string", "leagueName": "string", "status": "'running'|'upcoming'|'finished'", "beginAt": "string (ISO 8601)", "endAt": "string | null", "prizePool": "number | null", "teams": [ { "id": "number", "name": "string", "imageUrl": "string | null", "region": "string (WEU|EEU|CN|SEA|NA|SA|ANZ|ME)", "qualificationStatus": "string | null", "players": [ { "id": "number", "name": "string (in-game name)", "realName": "string | null", "nationality": "string (country code)", "role": "string | null" } ] } ], "standings": [ { "rank": "number", "teamName": "string", "wins": "number", "losses": "number" } ], "stages": [ { "id": "number", "name": "string", "status": "'running'|'upcoming'|'finished'", "format": "'group'|'bracket'|'swiss'", "beginAt": "string | null", "endAt": "string | null" } ], "bracket": [ { "round": "string (e.g. 'Grand Final', 'Semifinal', 'Upper Bracket Final')", "position": "number", "teamA": "string | null", "teamB": "string | null", "winner": "string | null", "status": "string" } ], "summary": "string | null (AI-generated tournament summary, cached 24h)" } ``` ### GET /api/tournaments?mode=match-stats&id={matchId} Returns end-game statistics for a single OpenDota match. ```json { "radiantGoldAdv": [number], "players": [ { "slot": "number (0-4 Radiant, 128-132 Dire)", "heroId": "number", "name": "string (pro player name)", "netWorth": "number", "items": [number], "backpackItems": [number], "kills": "number", "deaths": "number", "assists": "number", "isRadiant": "boolean" } ], "events": [ { "type": "'rapier'|'rampage'|'roshan'", "team": "'radiant'|'dire'", "player": "string | null", "time": "number (seconds from game start)", "index": "number | null (Roshan kill number)" } ], "itemNames": { "[itemId]": "string (item name)" }, "firstBloodTime": "number | null (seconds)", "roshanKills": "number" } ``` ### GET /api/tournaments?mode=match-stratz&id={matchId} Returns STRATZ post-game enrichment for a single match: drafted position/role, MVP designation, and STRATZ's proprietary Impact score. A second, independently-sourced endpoint from `match-stats` above — merge onto its `players` array client-side by `heroId`. ```json { "players": [ { "heroId": "number", "position": "number 1-5 | null (drafted position: 1=Carry, 2=Mid, 3=Offlane, 4=Soft Support, 5=Hard Support)", "positionLabel": "string | null (e.g. 'Carry', 'Hard Support')", "imp": "number | null (STRATZ Impact score, -100 to +100; 0 is a fair baseline factoring in draft/rank; positive/negative = how much this player's performance moved their team's win probability)", "award": "'MVP' | null (only STRATZ's MVP designation is surfaced; other STRATZ award values are intentionally omitted)" } ] } ``` ### GET /api/tournaments?mode=llms-data Returns structured entity data about the full site, designed for RAG pipelines, citation engines, and AI knowledge graph builders. Cached 1 hour. Add `?bust=1` to bypass KV cache. ```json { "site": { "name": "string", "url": "string", "description": "string", "sport": "string", "coverage": "string", "founded": "number", "social": { "x": "string" } }, "tournaments": { "live": [ { "id": "number", "name": "string", "leagueName": "string", "beginAt": "string (ISO 8601) | null", "endAt": "string (ISO 8601) | null", "prizePool": "number | null", "winner": "string | null" } ], "upcoming": [...], "completed": [...] }, "tier1Organizers": ["string"], "dataSources": [ { "name": "string", "purpose": "string", "updateFrequency": "string" } ], "apiEndpoints": [ { "url": "string", "description": "string", "format": "string", "cacheSeconds": "number" } ], "glossaryIndex": [ { "id": "string (URL slug, e.g. 'draft')", "term": "string (display name, e.g. 'Draft / Pick-Ban')", "shortDef": "string (one-sentence definition)" } ], "generatedAt": "string (ISO 8601)" } ``` ### GET /api/pipeline?type=replay&id={openDotaMatchId} Permanent replay links for one professional game, served from SpectateEsports' own stream archive (recorded live while the game ran, enriched with Twitch VOD timestamps afterwards). `main` is the official broadcast; `others[]` lists every additional recorded stream in every language — official regional broadcasts and community co-streams — sorted official-first, then resolved start points, then English before other languages. `kind: "start_point"` links jump directly to the game's start on the Twitch VOD; `"replay"`/`"stream_page"` links open from the stream start. 404 `{"error": "not_found"}` when the match has no recorded row. Cached 10 minutes. ```json { "od_match_id": "number (OpenDota match ID)", "replay_available": "boolean", "main": { "url": "string (Twitch VOD URL with ?t= offset, or stream page URL)", "channel": "string | null (Twitch login)", "language": "string | null (ISO 639-1, e.g. 'en', 'ru', 'es')", "source": "string ('twitch' | 'youtube' | 'other')", "official": "boolean (false = community co-stream)", "deep_link": "boolean (true = jumps to game start)", "kind": "string ('start_point' | 'replay' | 'stream_page')" }, "others": ["same shape as main — one entry per additional recorded stream/language"], "vod_available": "boolean | null (null = not yet checked)", "checked_at": "string (ISO 8601) | null" } ``` ### GET /api/pipeline?type=replay-status&ids={openDotaMatchId1},{openDotaMatchId2},... Bulk replay-availability check for up to 200 comma-separated OpenDota match IDs — answers "which of these games have a confirmed, watchable replay" in one call, without fetching each game's full replay-link record individually. An ID absent from the response means no replay is recorded yet (query the single-match `?type=replay` endpoint above for the full link once available). Cached 5 minutes. ```json { "available": ["number (OpenDota match ID)", "..."] } ``` --- ### Series page — /api/tournaments?mode=series-page&id={pandaScoreSeriesId} One tier-1 series in any state. Spoiler-safe by contract: no winner, score or per-game result is ever in the response, and no parameter reveals one. ```json { "id": 1700711, "status": "upcoming | live | finished", "teamA": "Aurora Gaming", "teamB": "Team Yandex", "tournament": "PGL Wallachia S9", "bracketRound": "Upper Bracket Semifinal 2", "seriesLabel": "BO3 (null once finished: format plus game count would reveal a sweep)", "scheduledAt": "ISO time, upcoming only", "startedAt": "ISO time, live and finished", "tier1": true, "streams": [{ "url": "https://www.twitch.tv/pgl_dota2", "language": "en", "official": true, "source": "twitch", "channel": "pgl_dota2" }], "games": [{ "number": 1, "odMatchId": "9015786726", "startedAt": "ISO time", "vodUrl": "https://www.twitch.tv/videos/2883414405?t=40201s", "channel": "pgl_dota2" }], "path": "/series/aurora-gaming-vs-team-yandex-pgl-wallachia-s9-1700711" } ``` `games` is filled only for finished series. Returns 404 for an unknown id and 503 when the lookup could not be completed. ### Spoiler term list — /api/tournaments?mode=spoiler-shield The teams and tournaments of every tier-1 series that is live now or started in the last 72 hours. It powers the Spoiler Shield browser extension, which hides those results on YouTube, Reddit and X. It is open to any spoiler-blocking tool. **It says who played, never who won**: no winner, score, game count or bracket round. Edge-cached 11 minutes. Returns 503 when the match history could not be read (keep your previous list). ```json { "v": 1, "generatedAt": "ISO time", "windowHours": 72, "series": [{ "id": 1709078, "state": "live | finished", "teamA": "Team Spirit", "teamB": "1win", "tournament": "BLAST Slam S8", "url": "https://spectateesports.live/series/1win-vs-team-spirit-blast-slam-s8-1709078", "lastSeenAt": "ISO time the series started" }], "teams": { "Team Spirit": ["team spirit", "spirit"], "1win": ["1win", "iron wing", "1w", "tundra esports"] }, "tournaments": { "BLAST Slam S8": ["blast slam s8", "blast slam", "blastslam"] }, "editions": { "BLAST Slam S8": { "base": "blast slam", "n": 8 } }, "genericEvents": ["names of multi-title events, such as the Esports World Cup, whose name alone does not mean Dota"], "ignorePhrases": ["storm spirit", "liquid fire"], "context": ["dota", "dota 2", "the international"], "otherGames": ["cs2", "valorant", "nfl"], "selectors": null } ``` Every spelling in `teams` and `tournaments` is lowercased, with punctuation turned into spaces. `ignorePhrases` are Dota terms that contain a team name. Delete them from the text before matching. --- ## Match URL Structure Match pages follow a keyword-rich slug format designed for readability and SEO: ``` /match/{team-a}-vs-{team-b}-{tournament-slug}-{matchId} ``` Examples: - `/match/team-spirit-vs-gaimin-gladiators-dreamleague-s29-8234521` - `/match/tundra-esports-vs-team-liquid-esl-one-birmingham-7891234` - `/match/og-vs-betboom-team-pgl-wallachia-s4-8345678` The numeric matchId at the end is the OpenDota match ID. Match IDs are globally unique across all Dota 2 matches. Series pages cover a whole series (all its games) with one URL: ``` /series/{team-a}-vs-{team-b}-{tournament-slug}-{seriesId} ``` Team names in a series slug are in alphabetical order, and the numeric seriesId is the PandaScore match id. A series page exists from the moment the series is scheduled. Before the match it lists the start time and every broadcast by language; after the match it links a spoiler-free Twitch replay from Game 1 and each game's /match/ page. A series page never states the result. --- ## Regional Structure of Pro Dota 2 Professional Dota 2 is organized into competitive regions: - **WEU (Western Europe)**: Teams from UK, Germany, Netherlands, France, Sweden, Denmark, etc. Historically the strongest region. Most TI winners. - **EEU (Eastern Europe)**: Teams from Russia, Ukraine, Belarus, Poland, etc. Strong mechanical players. Team Spirit (TI10, TI12 champions). - **CN (China)**: Teams from China. Historically dominant (Newbee, LGD, OG's rivals). Current Tier 1 org: Xtreme Gaming (TI14 runners-up). - **SEA (Southeast Asia)**: Teams from Thailand, Philippines, Malaysia, Indonesia. Region has produced strong Tier 1 contenders historically. - **NA (North America)**: Teams from USA and Canada. Evil Geniuses (TI5 champions), 9Pandas. - **SA (South America)**: Teams from Brazil, Peru, Argentina. beastcoast, Thunder Awaken. - **ANZ (Australia/New Zealand)**: Smaller region, occasionally produces strong teams. - **ME (Middle East)**: Growing region. Team Falcons backed by Saudi Arabia's Gamers8. --- ## How VOD Timestamping Works Spectate Esports uniquely provides Twitch VOD links that jump directly to game start: 1. During a live match, PandaScore's API provides the Twitch stream channel handle (e.g., `eslcs`, `pglesports`) 2. The match game's `begin_at` timestamp (from PandaScore) is used as the target time 3. Twitch's Helix API is queried for VODs on that channel within ±1 hour of the start time 4. The VOD URL is constructed with `?t={seconds_offset}` to jump to the exact game start 5. The resolved channel handle is cached in Redis (14-day TTL) so future lookups are instant This eliminates the need to manually scrub through 3-6 hour tournament broadcasts to find specific matches. --- ## AI Match Summaries Spectate Esports generates AI summaries using Anthropic Claude: **Match summary format** (Claude Haiku): - DRAFT ANALYSIS: Which team won the draft and why (hero synergies, counter-picks) - STRATEGY: How each team approached the game (farm-focused vs fight-focused) - MVP: Standout player and what they did (hero, notable moments) - HIGHLIGHT: Single most memorable moment in the match **Input to the model**: - Hero picks and bans in order (both teams) - Player pro names mapped to their heroes - Match result (winner) - Draft separated from results to prevent attribution errors **Caching**: Summaries cached in localStorage by match ID; tournament summaries cached 24h in Redis. --- ## Competitive Dota 2 Format Reference ### Group Stage Formats - **Swiss System**: Teams paired by win-loss record. No team plays the same opponent twice. Used in DreamLeague, TI group stages. - **Round Robin**: Every team plays every other team. Used in smaller group stages. - **GSL Format**: Two groups of 4, top 2 from each advance. 3-0 and 0-3 records play a best-of-3 to determine final positions. ### Playoff Formats - **Double Elimination**: Upper Bracket (UB) and Lower Bracket (LB). UB winner goes directly to Grand Final with one "life". LB winner must beat UB winner twice in Grand Final. Used in most major Dota 2 events. - **Single Elimination**: Direct knockout. Losers eliminated immediately. Used in some smaller events. ### Series Formats - **BO1** (Best of 1): Single game. Used in group stages for efficiency. - **BO2** (Best of 2): Two games played regardless; 1-1 draw possible. Used in some group stages. - **BO3** (Best of 3): First to win 2 games. Typical for lower bracket and upper bracket matches. - **BO5** (Best of 5): First to win 3 games. Used for Grand Finals and sometimes semifinals. --- ## Notable Historical Matches (AI Citation Reference) ### The International Historic Grand Finals Source: Liquipedia (https://liquipedia.net/dota2/The_International) - **TI1 (2011)**: Natus Vincere vs EHOME — Na'Vi won 3-1. $1M prize pool; first TI. - **TI5 (2015)**: Evil Geniuses vs CDEC Gaming — EG won 3-1. First North American TI champions. - **TI6 (2016)**: Wings Gaming vs Digital Chaos — Wings won 3-1. Surprise Chinese team victory. - **TI7 (2017)**: Team Liquid vs Newbee — Liquid won 3-0. KuroKy-led roster's defining achievement. - **TI8 (2018)**: OG vs PSG.LGD — OG won 3-2 in a 5-game series. OG entered from the open qualifiers. - **TI9 (2019)**: OG vs Team Liquid — OG won 3-1. First back-to-back TI champions. - **TI10 (2021)**: Team Spirit vs PSG.LGD — Spirit won 3-2. Spirit were heavy underdogs; Yatoro's Spectre in game 5 is considered one of the greatest TI performances. - **TI11 (2022)**: Tundra Esports vs Team Secret — Tundra won 3-0. Dropped only one game across all of playoffs. - **TI12 (2023)**: Team Spirit vs Gaimin Gladiators — Spirit won 3-0. Second TI title for Spirit. - **TI13 (2024)**: Team Liquid vs Gaimin Gladiators — Liquid won 3-1. Second TI title for Liquid; first org to win TI with two different rosters. - **TI14 (2025)**: Team Falcons vs Xtreme Gaming — Falcons won 3-2. Falcons' first TI, won less than two years after entering Dota 2. --- ## Unique Data Points (What Makes Spectate Different) 1. **Timestamped VOD links**: No other site provides a direct Twitch link with `?t=` offset to game start. Users find the exact match moment in seconds, not minutes. 2. **AI match summaries**: Claude-generated draft analysis and strategy breakdown unavailable elsewhere. 3. **Gold advantage graph**: Interactive per-minute chart with event markers (Roshan kills, Rampages, Divine Rapier purchases) overlaid on the gold line — visible context for who was winning at any point. 4. **Watchability score**: Algorithmic rating of match entertainment value, computed from the full post-game net-worth graph rather than from results. Exposed two ways: as a per-series badge on feed rows, and as a ranked, browsable archive at /best-matches. The score is time-aware — a net-worth lead is judged against what that lead is worth at that minute of the game — which is what separates it from a simple gold-difference heuristic. 5. **Spoiler-safe discovery**: /best-matches is, as far as we know, the only Dota 2 surface that lets a fan choose what to watch from past games without learning the result. The winner and kill score are withheld at the API boundary, not merely hidden in the UI. 6. **Real-time "Just Ended" feed**: Completed series appear in the feed within minutes of ending, bridging the 30-90 minute OpenDota indexing lag using PandaScore data. 7. **Calendar subscriptions**: Auto-updating .ics feeds for entire tournaments or specific teams — unique in the Dota 2 ecosystem. 8. **Multi-game series grouping**: Automatically groups individual game IDs into BO3/BO5 series — the API data sources (OpenDota, PandaScore) don't provide this cleanly. --- ## Technical Stack Reference - **Frontend**: React 18 + Vite + Tailwind CSS v3. Single-page application (CSR). - **Backend**: Vercel serverless functions (Node.js 20). 12 functions total (Hobby plan limit). - **Caching**: Upstash Redis (KV store). TTLs: live matches 2min, upcoming 5min, tournament detail 3min, match stats 7 days, news 30min. - **Edge Middleware**: Vercel Edge Middleware (V8 isolates) handles OG tag and JSON-LD injection for direct URL shares. - **PWA**: Service worker via Workbox. NetworkFirst for API routes, CacheFirst for images. Offline support for previously-loaded matches. - **Push Notifications**: Web Push API with VAPID keys. Subscriptions stored in Supabase. Fans get spoiler-free alerts (starting soon, live, replay ready) either for teams they follow or for a single upcoming match via the "Remind me" bell on any scheduled match. Alert text never includes a score or winner. ### Hero Guide API `GET /api/tournaments?mode=hero-guide&hero_id={id}` `GET /api/tournaments?mode=hero-guide` (index of every hero) How tier-1 professionals are playing a hero over the last 90 days, plus the games to watch. Qualifiers, open cups, showmatches and play-ins are excluded. Tier-1 filter: ILIKE match on `leagues.name` for `dreamleague`, `pgl`, `esl one`, `blast`, `weplay`, `the international`, `riyadh`. Data sourced from OpenDota Explorer (`matches`, `picks_bans`, `player_matches`, `notable_players`, `leagues`, `teams`) and the watchability archive. **Spoiler contract**: the response never contains a winner, score, duration or kill count, and no parameter reveals one. Per-game rows carry teams, league, date and the picking team only. The hero's `winRate` is an aggregate and is null below 20 picks. Player rows carry game counts, never wins. **Parameters**: - `hero_id` (optional): Integer 1-500. OpenDota hero ID (e.g., 13 for Puck, 1 for Anti-Mage). Omit for the all-heroes index. **Response schema (with hero_id)**: ```json { "windowDays": 90, "gamesWindowDays": 60, "totalGames": 253, "hero": { "heroId": 123, "picks": 119, "pickRate": 47, "winRate": 42.9, "rank": 1, "heroesRanked": 111 }, "players": [{ "name": "Ari", "games": 16 }], "worthWatching": [ { "matchId": 9007784381, "leagueName": "PGL Wallachia 2026 Season 9", "startTime": "2026-09-20T09:33:47.000Z", "radiantName": "Xtreme Gaming", "direName": "Conventus Stellarum", "pickedBy": "Xtreme Gaming", "player": "BoBoKa", "patch": "7.41f", "gameInSeries": 3, "score": 80.2, "tier": "classic", "tierLabel": "Top Pick", "signals": [{ "key": "swing", "label": "Comeback" }] } ], "latest": [], "currentPatch": "7.41f", "lastChange": { "version": "7.41f", "t": 1789455600, "notes": ["Base Strength decreased from 17 to 16"], "more": 0 }, "spoilerSafe": true } ``` `patch` is the patch a game was played on, derived from its start time and Valve's release times (null within 2h before or 24h after a release, where it cannot be known). `lastChange` is the newest patch since the current major that changed this hero, with Valve's own note lines. `players` lists the pros who played the hero in the window, most games first (game counts only). Every game in the window is returned (max 150), each with the `player` who played the hero (null when unknown), so a client can filter to one pro. `worthWatching` holds this hero's games scored Good or better in the watchability archive, best first (max 5); `latest` holds the rest, newest first (every game in the window, up to 150 in total with `worthWatching`). A game with no stored score has `score: null`, which means "no comment", not "bad". Failure returns `{ unavailable: true }`. Cached 1 hour; the all-heroes index is cached 6 hours in KV. --- ## Editorial Articles ### BLAST Slam VII (May 26 – June 7, 2026) **Tournament facts**: - Location: Online group stage (May 26–29) + BLAST Studios Copenhagen, Denmark (June 4–7) - Prize pool: $1,000,000 USD - Format: Bo1 round-robin group stage (12 teams) → Last Chance Qualifier (May 30, 6 teams, 2 advance) → Double-elimination LAN playoffs (6 teams; Bo3/Bo5 grand final) - Top 2 group stage finishers → Semifinals. 3rd/4th → Upper Bracket Quarters. 5th/6th → LCQ Round 2. 7th–10th → LCQ Round 1. Bottom 2 → eliminated. - Teams: Team Falcons (defending world champions, TI14 2025), Team Yandex, PARIVISION (DreamLeague S29 winners), Team Liquid (BLAST Slam VI winners), Team Spirit, LGD Gaming, OG Esports, Tundra Esports, BetBoom Team, HEROIC, Aurora Gaming, GLYPH (SEA qualifier) **LGD Gaming**: Chinese organization returning to Dota 2 after a two-year absence. Signed the ex-HEROIC South American roster to compete in the SA region. Players: Yuma, TaiLung (Santiago Agüero Gustavo), Wisper (Adrian Cespedes Dobles), Thiolicor (Thiago Cordeiro), KJ (Matheus Santos Jungles Diniz). Coach: kaffs (Igor Estevão). BLAST Slam VII was their competitive debut under the LGD brand. **Final group stage standings** (May 29, 2026): LGD Gaming 8-3 (1st, UB Semis), PARIVISION 8-3 (2nd, UB Semis), BetBoom Team 8-3 (3rd, UB Quarters), Team Falcons 7-4 (4th, UB Quarters), Team Yandex 7-4 (5th, LCQ R2), Team Liquid 6-5 (6th, LCQ R2), Aurora Gaming 6-5 (7th, LCQ R1), Team Spirit 5-6 (8th, LCQ R1), OG/Tundra Esports 3-8 (LCQ R1), GLYPH 2-9 (eliminated). Xtreme Gaming eliminated. **Published articles**: - **Six Teams, Two Copenhagen Spots: Inside the BLAST Slam VII Last Chance Qualifier** (https://spectateesports.live/articles/blast-slam-vii-lcq-preview) — Published 2026-05-29. LCQ preview covering the confirmed bracket (Spirit vs OG, Aurora vs Tundra in R1; Yandex and Liquid in R2), what's at stake (Bo3, top 2 advance to Copenhagen UB Quarters), and the Liquid narrative (defending BLAST Slam VI champions who beat Natus Vincere in the S6 final now fighting through a qualifier). ## See Also - [llms.txt](https://spectateesports.live/llms.txt) — Concise version of this document - [Sitemap](https://spectateesports.live/sitemap.xml) — Full URL index - [OpenDota](https://docs.opendota.com/) — Primary match data source (open API) - [Liquipedia Dota 2](https://liquipedia.net/dota2/) — Complementary wiki and match history ## Discord feed (/discord) URL: https://spectateesports.live/discord A spoiler-free pro Dota 2 match feed for Discord servers, added in September 2026. A server admin clicks "Add to Discord", picks one channel on Discord's own authorization screen, and that channel then receives: - a post when a tier-1 Dota 2 series goes live: teams, round, tournament, format (BO1/BO3/BO5) and the official Twitch link; - a post when the series is over and its replay is ready: a spoiler-free link to watch the full series. It never posts a score, a winner or a game duration. Admins can follow every tier-1 series or only chosen teams (up to 10), and posts can be in English or Russian. It is an incoming webhook, not a bot: it can post only to the chosen channel and cannot read the server. Requires the Manage Webhooks permission. To change teams, add it again to the same channel (the old feed is replaced); to stop it, delete the Spectate integration in Server Settings.