Template Variables
Templates use variables enclosed in curly braces that get replaced with real data when EPG is generated. Teamarr provides 260 variables across 20 categories.
Team vs Event Templates
Variables are scoped to the template type they make sense in. The template editor’s variable picker only surfaces variables that apply to the template you’re editing.
- Team templates have an “our team” perspective — the subscribed team is the anchor. These templates expose team-perspective variables like
{team},{opponent},{is_home},{team_record},{win_streak},{result},{odds_moneyline}, and similar “my team vs the other team” variables. - Event templates are positional — they describe a matchup without a reference team. These templates expose positional variables like
{home_team},{away_team},{home_team_record}, and game-level data. Event templates additionally expose the feed-team family ({feed_team},{feed_team_short},{is_home_feed}, etc.) for feed-separated channels. - Shared variables (most of the list) are available in both — positional teams, venue, date/time, playoffs, odds (excluding the team-perspective
{odds_moneyline}pair), soccer, combat sports, and league/sport identifiers.
If you hand-type a scope-restricted variable into a template where it doesn’t belong (e.g., {team} in an event template), it will still resolve (backward compatibility), but the picker won’t offer it. Use the picker to stay within the intended scope.
Hovering any variable in the picker shows its description and an example value drawn from the current preview (so with a live preview selected, the example is real data from that event). Variables insert at the cursor of the last field you clicked into — the picker reminds you to click into a field first when none is focused.
Previewing Templates
The template editor renders a live preview of every field as you type. The Previewing as bar above the tabs picks which league to preview against — the leagues you’ve subscribed to (from the Subscriptions tab, plus the leagues of teams you follow) are listed with their logos, grouped by sport and searchable. Before you’ve subscribed to anything, all available leagues are shown. It drives every preview on the page: the inline per-field previews, the condition trace on the Conditions tab, and the Guide Preview card in the right rail — an EPG-style card showing the title, subtitle, and description exactly as a viewer’s guide would, including any conditional rows that win a field for the preview event (marked with a green target).
Live by default. The preview tries to render real data for a recent or upcoming event in the selected league, and the badge turns green Live with a coverage count (e.g. 137/181 variables live · 44 gaps) — how many of the variables that apply to this kind of event the real event actually populated. A “gap” is a variable that could apply but the event didn’t provide (variables for other sports aren’t counted). If no event is available or the provider can’t be reached, it falls back automatically to sample data and the badge reads No event.
Click the badge to toggle to Sample mode, which uses generic, intentionally-fictitious placeholders (the same three sample shapes — a team game, a fight card, a race — regardless of league) so you can see every variable filled even when nothing is live.
Suffix Support
Team templates support suffixes to reference different games:
| Suffix | Context | Example |
|---|---|---|
| (none) | Current game | {opponent} |
.next | Next upcoming game | {opponent.next} |
.last | Most recent game | {opponent.last} |
Event templates don’t need suffixes - each channel exists for a single game, so there’s no “next” or “last” to reference.
When there’s no next (or last) game — offseason, end of a season — suffixed variables resolve to empty and the usual cleanup removes leftover wrappers, so raw
{…}braces never reach your guide. A misspelled variable name, or a suffix the variable doesn’t support, still renders literally so you can spot the mistake. For a proper offseason message, use the Offseason idle register on the Fillers tab (enabled with generic content by default on new templates).
In the tables below, the Suffixes column indicates which suffixes are available:
- base = no suffix (current game)
- .next = next game
- .last = last game
Artwork & Game Thumbs
Three template fields hold image URLs and accept the same variables as any other field:
| Field | Used for |
|---|---|
Program Art URL (program_art_url) | the programme <icon> in the EPG (per-game artwork) |
Channel Logo URL (event_channel_logo_url, event templates) | the Dispatcharr channel logo and the EPG channel icon |
Filler Art URL (pregame/postgame/idle art_url) | artwork on filler programmes |
Game-Thumbs base URL
Instead of writing the full image host in every template, set it once in EPG → Output → Game Thumbs → Game-Thumbs Base URL (e.g. your Game Thumbs host). Templates then store only the relative path, always starting with /:
/{league_id}/{away_team_pascal}/{home_team_pascal}/cover.png?style=6&logo=true&fallback=true
At generation the base URL — host and port, exactly as you entered it — is prefixed onto the relative path. Rules:
- Relative paths (start with
/) get the base prefixed. - Absolute URLs (anything with
http:///https://) are left unchanged, so you can still hardcode a one-off full URL in a single field. - Empty base URL = no prefixing (every art field must then be a full URL).
The same reconstructed URL is sent everywhere it’s needed — the EPG <icon> and the Dispatcharr channel logo — so the guide artwork and the channel logo always match. The live preview in the template editor applies the base URL too, so what you see matches the generated output (and renders the actual image so you can confirm the link resolves).
URL-encoding variable values (|urlencode)
When a variable value goes into the query string of an art URL, characters like spaces and & need to be percent-encoded — otherwise a value such as {race_name} = Pit Stop & Podium truncates the URL at the &, so only the first part reaches Game-Thumbs. Add the |urlencode filter (short alias |url) to any variable to encode its value:
/f1/cover?title={race_name|urlencode}&subtitle={session_name|urlencode}&iconurl=
- The filter encodes only the variable’s value — the template’s own
?,&, and=that form the URL structure stay literal. - It’s opt-in: variables without the filter are unchanged, so a variable that already holds a full URL is never double-encoded.
- A misspelled filter (e.g.
|urlencodee) renders literally, just like a misspelled variable name, so you can spot the typo. The live preview applies the filter too.
Identity
Core identifiers for teams, leagues, and matchups.
| Variable | Description | Suffixes | Sample |
|---|---|---|---|
{team_name} | Team display name | base | Detroit Lions |
{team_name_the} | Team name with Gracenote-convention article (clubs get ‘the’, national teams don’t) | base | the Detroit Lions |
{team_name_ranked_the} | Team name with rank and article composed (article survives when unranked) | base | the No. 7 Detroit Lions |
{team_abbrev} | Team abbreviation uppercase | base | DET |
{team_abbrev_lower} | Team abbreviation lowercase | base | det |
{team_name_pascal} | Team name in PascalCase for channel IDs | base | DetroitLions |
{team_short} | Team short name | base | Lions |
{opponent} | Opponent team name | base, .next, .last | Chicago Bears |
{opponent_the} | Opponent name with Gracenote-convention article | base, .next, .last | the Chicago Bears |
{opponent_ranked_the} | Opponent with rank and article composed | base, .next, .last | the No. 14 Chicago Bears |
{opponent_abbrev} | Opponent team abbreviation uppercase | base, .next, .last | CHI |
{opponent_abbrev_lower} | Opponent abbreviation lowercase | base, .next, .last | chi |
{opponent_short} | Opponent short name | base, .next, .last | Bears |
{matchup} | Full matchup string | base, .next, .last | Chicago Bears @ Detroit Lions |
{matchup_abbrev} | Abbreviated matchup uppercase | base, .next, .last | CHI @ DET |
{matchup_short} | Short name matchup | base, .next, .last | Bears @ Lions |
{league} | League short alias | base | NFL |
{league_name} | League full display name | base | National Football League |
{league_id} | League identifier for URLs | base | nfl |
{league_code} | Raw league code | base | nfl |
{sport} | Sport display name | base | Football |
{sport_lower} | Sport in lowercase | base | football |
{gracenote_category} | Gracenote category for EPG; customizable per league (Settings → Advanced → Gracenote Category Overrides) | base | NFL Football |
{exception_keyword} | Exception keyword label (e.g., ‘Spanish’, ‘4K’) | base | 4K |
Date & Time
Game scheduling information.
| Variable | Description | Suffixes | Sample |
|---|---|---|---|
{game_date} | Full game date | base, .next, .last | Sunday, December 22, 2024 |
{game_date_short} | Short game date | base, .next, .last | Dec 22 |
{game_day} | Day of week | base, .next, .last | Sunday |
{game_day_short} | Short day of week | base, .next, .last | Sun |
{game_time} | Game time formatted per user settings | base, .next, .last | 1:00 PM EST |
{days_until} | Days until game | base, .next, .last | 0 |
{today_tonight} | ‘today’ or ‘tonight’ based on 5pm cutoff | base, .next, .last | today |
{today_tonight_title} | ‘Today’ or ‘Tonight’ (title case) | base, .next, .last | Today |
{relative_day} | Relative day: ‘today’, ‘tonight’, ‘tomorrow’, day of week, or date | base, .next | tomorrow |
{relative_day_title} | Relative day (title case) | base, .next | Tomorrow |
Venue
Stadium and location information.
| Variable | Description | Suffixes | Sample |
|---|---|---|---|
{venue} | Stadium/arena name | base, .next, .last | Ford Field |
{venue_city} | Venue city | base, .next, .last | Detroit |
{venue_state} | Venue state | base, .next, .last | MI |
{venue_full} | Full venue location | base, .next, .last | Ford Field, Detroit, MI |
Home/Away
Positional team references and home/away context.
| Variable | Description | Suffixes | Sample |
|---|---|---|---|
{home_team} | Home team name (positional) | base, .next, .last | Detroit Lions |
{home_team_the} | Home team name with Gracenote-convention article | base, .next, .last | the Detroit Lions |
{home_team_ranked_the} | Home team with rank and article composed (rank slots after the article; article survives when unranked) | base, .next, .last | the No. 20 Arkansas Razorbacks |
{home_team_abbrev} | Home team abbreviation uppercase | base, .next, .last | DET |
{home_team_abbrev_lower} | Home team abbreviation lowercase | base, .next, .last | det |
{home_team_pascal} | Home team name in PascalCase | base, .next, .last | DetroitLions |
{home_team_short} | Home team short name | base, .next, .last | Lions |
{home_team_logo} | Home team logo URL | base, .next, .last | ESPN logo URL |
{away_team} | Away team name (positional) | base, .next, .last | Chicago Bears |
{away_team_the} | Away team name with Gracenote-convention article | base, .next, .last | the Chicago Bears |
{away_team_ranked_the} | Away team with rank and article composed | base, .next, .last | the No. 14 Texas A&M Aggies |
{away_team_abbrev} | Away team abbreviation uppercase | base, .next, .last | CHI |
{away_team_abbrev_lower} | Away team abbreviation lowercase | base, .next, .last | chi |
{away_team_pascal} | Away team name in PascalCase | base, .next, .last | ChicagoBears |
{away_team_short} | Away team short name | base, .next, .last | Bears |
{away_team_logo} | Away team logo URL | base, .next, .last | ESPN logo URL |
{is_home} | ‘true’ if team is home, ‘false’ if away | base, .next, .last | true |
{is_away} | ‘true’ if team is away, ‘false’ if home | base, .next, .last | false |
{home_away_text} | ‘at home’ or ‘on the road’ | base, .next, .last | at home |
{vs_at} | ‘vs’ if home, ‘at’ if away; neutral-site games read ‘vs’ | base, .next, .last | vs |
{at_vs} | Perspective-free connector: ‘at’ for US team sports, ‘vs.’ otherwise; neutral-site games always read ‘vs.’ | base, .next, .last | at |
{home_away_verb} | ‘host’ at home, ‘visit’ away | base, .next, .last | host |
{vs_@} | ‘vs’ if home, ‘@’ if away; neutral-site games read ‘vs’ | base, .next, .last | vs |
The _the variables emit a lowercase the for mid-sentence use (“take on the Detroit Pistons”). When one opens a title or description, the renderer capitalizes it automatically (“The Detroit Pistons host…”). National teams (“Netherlands”) and individual-sport competitors never get the article, matching Gracenote convention.
Feed Team
When a channel is configured for a specific home or away broadcast feed (via the Feed Separation setting), these variables resolve to the team whose feed this channel carries — independent of which team is home or away on any given day. If the channel has no feed assignment, all Feed Team variables return empty strings (they disappear gracefully from templates).
These are most useful for Event EPG templates on stream-separated channels (e.g., an MLB “Home feed” channel that always shows the home broadcaster’s perspective regardless of which team is home today).
| Variable | Description | Suffixes | Sample |
|---|---|---|---|
{feed_team} | Feed team full name | base | Baltimore Orioles |
{feed_team_short} | Feed team short name | base | Orioles |
{feed_team_abbrev} | Feed team abbreviation uppercase | base | BAL |
{feed_team_abbrev_lower} | Feed team abbreviation lowercase | base | bal |
{feed_team_logo} | Feed team logo URL | base | ESPN logo URL |
{is_home_feed} | 'true' if this channel is the home team’s feed, 'false' if away, '' if no feed | base | true |
{is_away_feed} | 'true' if this channel is the away team’s feed, 'false' if home, '' if no feed | base | false |
{feed_home_away} | 'Home' if home feed, 'Away' if away feed, '' if no feed | base | Home |
{broadcast_feed} | 'Home Team Feed' / 'Away Team Feed' / '' if no feed | base | Home Team Feed |
{broadcast_feed_team} | '{Team Name} Feed' or '' if no feed | base | Baltimore Orioles Feed |
Feed Team variables do not support .next / .last suffixes — they describe the channel’s configuration, not a specific game’s schedule. For per-game home/away references, use the {home_team} / {away_team} variables above.
{broadcast_feed} and {broadcast_feed_team} are pre-formatted — they include the literal " Feed" suffix. When feed separation isn’t active they return "" as a unit, so the whole phrase disappears cleanly from the template (unlike composing {feed_home_away} Team Feed yourself, which would leave "Team Feed" orphaned).
Records
Team and opponent win-loss records.
| Variable | Description | Suffixes | Sample |
|---|---|---|---|
{team_record} | Team’s overall record | base | 10-4 |
{team_wins} | Team’s total wins | base | 10 |
{team_losses} | Team’s total losses | base | 4 |
{team_ties} | Team’s total ties/draws | base | `` |
{team_win_pct} | Team’s winning percentage | base | .714 |
{home_record} | Team’s home record | base | 6-1 |
{home_win_pct} | Team’s home winning percentage | base | .857 |
{away_record} | Team’s away/road record | base | 4-3 |
{away_win_pct} | Team’s away winning percentage | base | .571 |
{opponent_record} | Opponent’s overall record | base, .next, .last | 8-6 |
{opponent_wins} | Opponent’s total wins | base, .next, .last | 8 |
{opponent_losses} | Opponent’s total losses | base, .next, .last | 6 |
{opponent_ties} | Opponent’s total ties/draws | base, .next, .last | `` |
{opponent_win_pct} | Opponent’s winning percentage | base, .next, .last | .571 |
{home_team_record} | Home team’s overall record for this game | base, .next, .last | 10-4 |
{away_team_record} | Away team’s overall record for this game | base, .next, .last | 8-6 |
{home_team_seed} | Home team’s playoff seed | base, .next, .last | 2 |
{away_team_seed} | Away team’s playoff seed | base, .next, .last | 5 |
Streaks
Current winning and losing streaks.
| Variable | Description | Suffixes | Sample |
|---|---|---|---|
{streak} | Team’s current streak formatted (e.g., ‘W3’ or ‘L2’) | base | W2 |
{streak_length} | Team’s streak as absolute value | base | 2 |
{streak_type} | Team’s streak direction: ‘win’ or ‘loss’ | base | win |
{win_streak} | Team’s winning streak length (empty if losing) | base | 2 |
{loss_streak} | Team’s losing streak length (empty if winning) | base | `` |
{opponent_streak} | Opponent’s current streak formatted | base, .next, .last | L1 |
{opponent_streak_length} | Opponent’s streak as absolute value | base, .next, .last | 1 |
{opponent_streak_type} | Opponent’s streak direction | base, .next, .last | loss |
{opponent_win_streak} | Opponent’s winning streak (empty if losing) | base, .next, .last | `` |
{opponent_loss_streak} | Opponent’s losing streak (empty if winning) | base, .next, .last | 1 |
{home_team_streak} | Home team’s current streak formatted | base, .next, .last | W2 |
{home_team_streak_length} | Home team’s streak as absolute value | base, .next, .last | 2 |
{home_team_win_streak} | Home team’s winning streak (empty if losing) | base, .next, .last | 2 |
{home_team_loss_streak} | Home team’s losing streak (empty if winning) | base, .next, .last | `` |
{away_team_streak} | Away team’s current streak formatted | base, .next, .last | L1 |
{away_team_streak_length} | Away team’s streak as absolute value | base, .next, .last | 1 |
{away_team_win_streak} | Away team’s winning streak (empty if losing) | base, .next, .last | `` |
{away_team_loss_streak} | Away team’s losing streak (empty if winning) | base, .next, .last | 1 |
Scores
Game scores and results. Empty for future games.
| Variable | Description | Suffixes | Sample |
|---|---|---|---|
{team_score} | Team’s score (empty if game not started) | base, .next, .last | 31 |
{opponent_score} | Opponent’s score (empty if game not started) | base, .next, .last | 24 |
{score} | Score (e.g., ‘24-17’). Empty if not started. | base, .next, .last | 31-24 |
{final_score} | Score with team perspective (team score first) | base, .next, .last | 31-24 |
{home_team_score} | Home team’s score | base, .next, .last | 31 |
{away_team_score} | Away team’s score | base, .next, .last | 24 |
{score_diff} | Score differential (+7 = won by 7, -7 = lost by 7) | base, .next, .last | +7 |
{score_differential} | Score differential as absolute value | base, .next, .last | 7 |
{score_differential_text} | Score differential as text | base, .next, .last | by 7 |
{event_result} | Full event result. Empty if not final. | base, .next, .last | Detroit Lions 31 - Chicago Bears 24 |
{event_result_abbrev} | Abbreviated event result. Empty if not final. | base, .next, .last | DET 31 - CHI 24 |
{winner} | Winning team name. Empty if not final or tie. | base, .next, .last | Detroit Lions |
{winner_abbrev} | Winning team abbreviation. Empty if not final or tie. | base, .next, .last | DET |
{loser} | Losing team name. Empty if not final or tie. | base, .next, .last | Chicago Bears |
{loser_abbrev} | Losing team abbreviation. Empty if not final or tie. | base, .next, .last | CHI |
Outcome
Game result indicators. Empty for future games.
| Variable | Description | Suffixes | Sample |
|---|---|---|---|
{result} | Game result (‘W’, ‘L’, or ‘T’) | base, .next, .last | W |
{result_lower} | Game result lowercase (‘w’, ‘l’, or ‘t’) | base, .next, .last | w |
{result_text} | Game result as text (‘defeated’, ‘lost to’, ‘tied’) | base, .next, .last | defeated |
{overtime_text} | ‘in overtime’ if game went to overtime, empty otherwise | base, .next, .last | `` |
{overtime_short} | ‘OT’ if game went to overtime, empty otherwise | base, .next, .last | `` |
Standings
Playoff position and standings information.
| Variable | Description | Suffixes | Sample |
|---|---|---|---|
{playoff_seed} | Team’s playoff seed (e.g., ‘1’ for 1-seed) | base | 2 |
{games_back} | Games behind division/conference leader | base | - |
{opponent_playoff_seed} | Opponent’s playoff seed | base, .next, .last | 5 |
{opponent_games_back} | Opponent’s games behind leader | base, .next, .last | - |
Statistics
Team scoring averages.
| Variable | Description | Suffixes | Sample |
|---|---|---|---|
{team_ppg} | Team’s points per game average | base | 28.4 |
{team_papg} | Team’s points allowed per game average | base | 21.6 |
{opponent_ppg} | Opponent’s points per game average | base, .next, .last | 24.2 |
{opponent_papg} | Opponent’s points allowed per game average | base, .next, .last | 22.8 |
{home_team_ppg} | Home team’s PPG for this game | base, .next, .last | 28.4 |
{away_team_ppg} | Away team’s PPG for this game | base, .next, .last | 24.2 |
Playoffs
Season type indicators. All providers normalize their native season codes to a canonical value so these variables behave consistently regardless of the underlying data source.
| Variable | Description | Suffixes | Sample |
|---|---|---|---|
{season_type} | Canonical season type — one of preseason, regular, postseason, offseason, or empty if unknown | base, .next, .last | postseason |
{is_playoff} | 'true' if postseason game | base, .next, .last | `` |
{is_preseason} | 'true' if preseason/exhibition game | base, .next, .last | `` |
{is_regular_season} | 'true' if regular season game | base, .next, .last | true |
Provider coverage:
| Provider | Playoff detection |
|---|---|
| ESPN | Full — derived from season slug (post-season, semifinals, etc.) with numeric-type fallback |
| MLB Stats | Full — gameType codes (F/D/L/W/P → postseason, S/E → preseason) |
| HockeyTech | Full — via per-season playoff flag (CHL, AHL, PWHL, USHL) |
| TSDB | Partial — postseason detected via special intRound codes (125/150/160/170/180/200) used by some leagues (NBA, NHL, IPL, European knockouts). Leagues that keep normal round numbering through finals (AFL, NRL, boxing) can’t be detected and return empty. Preseason is never detected for TSDB. |
Odds
Betting lines and odds (when available).
| Variable | Description | Suffixes | Sample |
|---|---|---|---|
{has_odds} | ‘true’ if odds are available for this game | base, .next | true |
{odds_spread} | Point spread | base, .next | -3.0 |
{odds_moneyline} | Team’s moneyline (e.g., ‘-150’ or ‘+130’) | base, .next | -150 |
{odds_opponent_moneyline} | Opponent’s moneyline | base, .next | +130 |
{odds_over_under} | Over/under total (e.g., ‘47.5’) | base, .next | 48.5 |
{odds_provider} | Odds provider name | base, .next | ESPN BET |
{odds_details} | Full odds description string | base, .next | DET -3.0, O/U 48.5 |
Broadcast
TV and streaming information.
| Variable | Description | Suffixes | Sample |
|---|---|---|---|
{broadcast_network} | Primary broadcast network (first in list) | base, .next, .last | FOX |
{broadcast_simple} | Comma-separated broadcast networks | base, .next, .last | FOX, NFL Network |
{broadcast_national_network} | National broadcast networks only | base, .next, .last | FOX |
{is_national_broadcast} | ‘true’ if game is on national TV | base, .next, .last | true |
Summary & Context
Provider editorial/context copy for a game, passed through raw. These are sparse by nature — empty when the provider didn’t supply them.
| Variable | Description | Suffixes | Sample |
|---|---|---|---|
{game_recap} | Postgame recap headline — short, self-contained, carries the result. Empty until a game is final | base, .next, .last | Brunson scores 45, and New York tops Spurs for title |
{game_preview} | Pregame preview blurb. Empty once a game is final (use {game_recap} then) | base, .next, .last | Toronto Blue Jays (35-38) vs. Boston Red Sox |
{game_event_note} | Marquee/playoff designation. Empty for ordinary regular-season games | base, .next, .last | NBA Finals - Game 5 |
{series_summary} | Playoff/season-series state. Empty when there’s no series context | base, .next, .last | Series tied 1-1 |
{home_last_five} | Home team’s W-L over its last five games (populates days ahead) | base, .next, .last | 4-1 |
{away_last_five} | Away team’s W-L over its last five games | base, .next, .last | 2-3 |
{last_five_summary} | Recent-form prose for both teams; empty without data — pair with has_structured_preview | base, .next, .last | The Rays have won 2 of their last five; the Red Sox have won 4 of their last five. |
Because these populate only for some games, pair them with other content or a static fallback so a template never renders blank. In main descriptions, gate them with condition rows (has_preview, has_recap, …); in filler registers, use filler condition rows — the starter set’s postgame has_recap → {game_recap.last} row is the canonical example. {game_recap} and {game_event_note} come free from the scoreboard; {game_preview} and {series_summary} come from the per-event summary fetch that EPG generation already makes (no extra API calls).
Rankings
College rankings (NCAAF, NCAAM, NCAAW).
| Variable | Description | Suffixes | Sample |
|---|---|---|---|
{team_rank} | Team’s ranking (e.g., ‘5’ for #5, empty if unranked) | base | `` |
{team_rank_display} | Team’s ranking with # prefix (e.g., ‘#5’) | base | `` |
{is_ranked} | ‘true’ if team is ranked, empty otherwise | base | `` |
{opponent_rank} | Opponent’s ranking | base, .next, .last | `` |
{opponent_rank_display} | Opponent’s ranking with # prefix | base, .next, .last | `` |
{opponent_is_ranked} | ‘true’ if opponent is ranked, empty otherwise | base, .next, .last | `` |
{is_ranked_matchup} | ‘true’ if both teams are ranked | base, .next, .last | `` |
{home_team_rank} | Home team’s ranking for this game | base, .next, .last | `` |
{away_team_rank} | Away team’s ranking for this game | base, .next, .last | `` |
{home_team_rank_display} | Home team’s rank in Gracenote prose form (‘No. 20’), empty when unranked | base, .next, .last | No. 20 |
{away_team_rank_display} | Away team’s rank in Gracenote prose form (‘No. 15’), empty when unranked | base, .next, .last | No. 15 |
Conference
Conference and division information.
Pro Leagues
| Variable | Description | Suffixes | Sample |
|---|---|---|---|
{pro_conference} | Team’s pro conference (e.g., ‘NFC’, ‘Eastern’) | base | NFC |
{pro_conference_abbrev} | Team’s pro conference abbreviation | base | NFC |
{pro_division} | Team’s pro division (e.g., ‘NFC North’) | base | NFC North |
{opponent_pro_conference} | Opponent’s pro conference | base, .next, .last | NFC |
{opponent_pro_conference_abbrev} | Opponent’s pro conference abbreviation | base, .next, .last | NFC |
{opponent_pro_division} | Opponent’s pro division | base, .next, .last | NFC North |
{home_team_pro_conference} | Home team’s pro conference | base, .next, .last | NFC |
{home_team_pro_conference_abbrev} | Home team’s pro conference abbreviation | base, .next, .last | NFC |
{home_team_pro_division} | Home team’s pro division | base, .next, .last | NFC North |
{away_team_pro_conference} | Away team’s pro conference | base, .next, .last | NFC |
{away_team_pro_conference_abbrev} | Away team’s pro conference abbreviation | base, .next, .last | NFC |
{away_team_pro_division} | Away team’s pro division | base, .next, .last | NFC North |
College Leagues
| Variable | Description | Suffixes | Sample |
|---|---|---|---|
{college_conference} | Team’s college conference name | base | `` |
{college_conference_abbrev} | Team’s college conference abbreviation | base | `` |
{opponent_college_conference} | Opponent’s college conference | base, .next, .last | `` |
{opponent_college_conference_abbrev} | Opponent’s college conference abbreviation | base, .next, .last | `` |
{home_team_college_conference} | Home team’s college conference | base, .next, .last | `` |
{home_team_college_conference_abbrev} | Home team’s college conference abbreviation | base, .next, .last | `` |
{away_team_college_conference} | Away team’s college conference | base, .next, .last | `` |
{away_team_college_conference_abbrev} | Away team’s college conference abbreviation | base, .next, .last | `` |
Soccer
Soccer-specific variables for teams that play in multiple competitions.
| Variable | Description | Suffixes | Sample |
|---|---|---|---|
{soccer_primary_league} | Team’s home league name (e.g., ‘Premier League’) | base | `` |
{soccer_primary_league_id} | Team’s home league ID (e.g., ‘eng.1’) | base | `` |
{soccer_match_league} | League for THIS game (may differ from primary) | base, .next, .last | `` |
{soccer_match_league_id} | League ID for THIS game (e.g., ‘uefa.champions’) | base, .next, .last | `` |
{soccer_match_league_logo} | Logo URL for THIS game’s league | base, .next, .last | `` |
{soccer_match_note} | Provider’s competition note for the match, untouched — competition name plus group/stage where present | base, .next, .last | FIFA World Cup, Group J |
Unlike {soccer_match_league_name} (which Teamarr builds from its league cache), {soccer_match_note} is the provider’s raw value and carries group-level detail. It’s soccer-only and empty otherwise.
Soccer teams often play in multiple competitions (domestic league, cups, Champions League). The soccer_match_league variables tell you which competition a specific game is in, while soccer_primary_league is the team’s home league.
Combat Sports
UFC and MMA-specific variables for event templates. These are event-only (no .next/.last suffixes) since each UFC event is independent.
Fighters & Matchup
| Variable | Description | Sample |
|---|---|---|
{fighter1} | First fighter name (headline bout) | Alex Volkanovski |
{fighter2} | Second fighter name (headline bout) | Diego Lopes |
{fighter1_last} | First fighter surname | Volkanovski |
{fighter2_last} | Second fighter surname | Lopes |
{matchup_combat} | Fight matchup — headline fighter first with ‘vs’ | Alex Volkanovski vs Diego Lopes |
{event_number} | UFC event number (e.g., ‘314’ from ‘UFC 314’) | 314 |
{event_title} | Full event title | UFC 314: Volkanovski vs Lopes |
Card Segments
| Variable | Description | Sample |
|---|---|---|
{card_segment} | Segment code for this channel | main_card |
{card_segment_display} | Human-readable segment name | Main Card |
{main_card_time} | Main card start time | 10:00 PM EST |
{prelims_time} | Prelims start time | 8:00 PM EST |
{early_prelims_time} | Early prelims start time | 6:00 PM EST |
Fight Card
| Variable | Description | Sample |
|---|---|---|
{bout_count} | Total number of bouts on the card | 14 |
{fight_card} | All bouts (newline-separated) | Alex Volkanovski vs Diego LopesMerab Dvalishvili vs Umar Nurmagomedov |
{main_card_bouts} | Main card bouts only | Alex Volkanovski vs Diego LopesMerab Dvalishvili vs Umar Nurmagomedov |
{prelims_bouts} | Prelims bouts only | Sean Brady vs Kelvin GastelumChris Weidman vs Eryk Anders |
{early_prelims_bouts} | Early prelims bouts only | Mauricio Ruffy vs Jamie Mullarkey |
UFC events are split into segments (Early Prelims, Prelims, Main Card). When using segment-based channel routing, each channel gets a {card_segment} value indicating which segment it covers. The {fighter1} and {fighter2} variables always refer to the headline (main event) bout. Use {matchup_combat} for the fight-conventional “Volkanovski vs Lopes” form — the generic {matchup} renders {away} @ {home} (“Lopes @ Volkanovski”) for every sport, combat included.
Motorsports
F1, NASCAR, IndyCar, and MotoGP-specific variables for event templates. These are event-only (no .next/.last suffixes) since each race weekend is independent.
Event & Circuit
| Variable | Description | Sample |
|---|---|---|
{race_name} | Race weekend / Grand Prix name | Monaco Grand Prix |
{circuit_name} | Circuit/track name | Circuit de Monaco |
Sessions
| Variable | Description | Sample |
|---|---|---|
{session_name} | This channel’s session display name | Practice 1, Qualifying, Race |
{session_type} | This channel’s session code | fp1, qualifying, race |
{next_session_name} | Display name of the next session | Qualifying |
{next_session_time} | Start time of the next session | 9:00 AM |
Race Format
NASCAR-style scheduled race format (lap counts and stages). Empty for series whose provider doesn’t supply them (e.g. F1).
| Variable | Description | Sample |
|---|---|---|
{race_laps} | Scheduled lap count | 200 |
{race_distance} | Scheduled distance in miles | 500 |
{stage_1_laps} | Cumulative lap where stage 1 ends | 60 |
{stage_2_laps} | Cumulative lap where stage 2 ends | 125 |
{stage_3_laps} | Cumulative lap where stage 3 ends | 200 |
{stage_summary} | All stage endpoints joined | 60/125/200 |
Grid & Qualifying
| Variable | Description | Sample |
|---|---|---|
{pole_position} | Driver who took pole position | Max Verstappen |
{pole_team} | Team/constructor of the pole sitter | Red Bull Racing |
{grid} | Full starting grid order (newline-separated) | 1. Max Verstappen (Red Bull Racing)2. Charles Leclerc (Ferrari) |
Results
| Variable | Description | Sample |
|---|---|---|
{race_winner} | Race winner’s name | Max Verstappen |
{podium_2} | 2nd place finisher | Charles Leclerc |
{podium_3} | 3rd place finisher | Lewis Hamilton |
{podium} | Top 3 finishers, combined | 1. Max Verstappen, 2. Charles Leclerc, 3. Lewis Hamilton |
{results} | Full finishing order (newline-separated) | 1. Max Verstappen (Red Bull Racing)2. Charles Leclerc (Ferrari) |
{fastest_lap_driver} | Driver awarded fastest lap | Lando Norris |
Race weekends are split into per-session channels (Practice 1/2/3, Qualifying, Sprint, Race). Each channel gets a {session_type}/{session_name} value indicating which session it covers. Grid and results variables read from the qualifying and race sessions respectively, and are empty until those sessions have data.
Tennis
ATP/WTA-specific variables for event templates. Tennis is matched per match — one channel per match with the players filling the standard home/away variables ({home_team} = full name, {home_team_abbrev} = surname). These variables add the tournament context and are event-only.
| Variable | Description | Sample |
|---|---|---|
{player1} | First player/pair in the matchup (no home player in tennis) | Flavio Cobolli |
{player2} | Second player/pair in the matchup | Alex de Minaur |
{player1_last} | First player’s surname (multi-word preserved) | Cobolli |
{player2_last} | Second player’s surname | de Minaur |
{tournament_name} | Tournament name | Wimbledon |
{tournament_name_the} | Tournament name with its natural article | the US Open, Wimbledon |
{tennis_round} | Round within the draw | Round 4, Quarterfinals |
{tennis_court} | Assigned court | Centre Court, No. 1 Court |
{tennis_draw} | Draw type | Men's Singles, Mixed Doubles |
{tennis_result} | Prose match result once final (empty before) | Zverev defeats Fery 6-3, 6-4, 7-6(5) |
Example: {tournament_name} {tennis_draw}: {player1_last} vs {player2_last} renders as Wimbledon Men's Singles: Cobolli vs de Minaur. Like combat’s {fighter1}/{fighter2}, the player variables are the idiomatic choice — the underlying home/away team variables also resolve, but tennis has no real home player.
Usage Examples
Team Template (Detroit Lions channel)
Title: {team_name} {vs_at} {opponent}
→ "Detroit Lions vs Chicago Bears"
Description: The {team_name} ({team_record}) host the {opponent} ({opponent_record}) at {venue}. {today_tonight_title}'s game airs on {broadcast_network}.
→ "The Detroit Lions (10-4) host the Chicago Bears (8-6) at Ford Field. Today's game airs on FOX."
Event Template (game-specific channel)
Title: {away_team} @ {home_team}
→ "Chicago Bears @ Detroit Lions"
Description: {away_team} ({away_team_record}) at {home_team} ({home_team_record}). {home_team} is a {odds_spread} favorite.
→ "Chicago Bears (8-6) at Detroit Lions (10-4). Detroit Lions is a -3.0 favorite."
Postgame Filler (team template)
Title: {team_name} Postgame
Description: The {team_name} {result_text.last} the {opponent.last} {final_score.last} {overtime_text.last}.
→ "The Detroit Lions defeated the Minnesota Vikings 28-21."
UFC Event Template
Title: {event_title} - {card_segment_display}
→ "UFC 314: Volkanovski vs Lopes - Main Card"
Description: {matchup}. Main card at {main_card_time}. {bout_count} total bouts.
→ "Alex Volkanovski vs Diego Lopes. Main card at 10:00 PM EST. 14 total bouts."