Set up once and never touched again. The addresses follow whichever game is marked ON AIR, so there is nothing to edit on game day.
rows, alongside the game’s details, so vMix has nothing to
bind to. The JSON format is there for other software. In vMix, always
&format=xml.
One address per graphic, already built for you with your school’s key in it. Do not type one by hand.
&format=xml.https://www.statchat.co/api/feed?view=rushing&format=xml&key=20ceaabf28a1…
key is your school’s, and anyone holding it can read your
live scoreboard. Email to the crew on the Broadcast
setup page is the safest way to hand them over.onAir="false" and no rows. That is the most common reason a
graphic looks broken.SC Rushing, SC Score./feed/player.Every feed is wrapped in <feed> and each record gets its own
element. The element name changes with the view, which is why one XPath does
not work for all of them.
| View | XPath | Rows you get |
|---|---|---|
score | /feed/game | One |
drive | /feed/drive | One — the drive in progress |
lastplay | /feed/play | One |
teamstats | /feed/team | Two, one per team |
rushing | /feed/player | One per player, most yards first |
passing | /feed/player | One per player, most yards first |
receiving | /feed/player | One per player, most yards first |
defense | /feed/player | One per player, most tackles first |
kicking | /feed/player | One per player who attempted a kick |
kickoffs | /feed/player | One per player who kicked off |
punting | /feed/player | One per player who punted |
starters | /feed/starter | One per position on the lineup card |
Adding &scope=season to a leader feed does not change its
XPath — it is the same view over a wider range, so the element name is
the same.
The starters feed serves one unit at a time, chosen with
&unit=: offense, defense or
special. All three use /feed/starter.
Add &team=opp for the opponent's lineup instead of yours.
The XPath does not change — it is the same view over the other team,
and the team attribute on each row names whose lineup it is.
Leaving the parameter off returns your own starters, exactly as it always
has, so an address already saved in vMix needs no edit.
A real rushing feed. Each attribute on <player> becomes a
column you can bind to.
<?xml version="1.0" encoding="UTF-8"?>
<feed view="rushing" onAir="true" game="Neville vs Ruston"
gameDate="2026-08-28" status="in_progress"
updated="2026-08-31T02:14:07.921Z">
<player player="D. Ancelet" team="Neville" att="18" yds="142"
long="38" td="2" fum="0" />
<player player="T. Guidry" team="Neville" att="9" yds="63"
long="21" td="0" fum="0" />
</feed>
onAir and updated are on the
wrapper, not on the rows. With the XPath set to
/feed/player your columns are the player’s, so you cannot
also bind onAir from that same source. A graphic that greys itself
out when nothing is on air needs a second data source on the same
address with the XPath /feed.vMix binds one title field at a time, so this is done once per piece of text on the graphic.
player,
yds, td. Left on Auto it
matches on the column name, so a title field actually named
yds finds it by itself.{0} YDS renders
142 YDS.For any field left on Selected, the row comes from the Data Sources Manager: click a row and every title bound to that source updates at once.
DataSourceNextRow, DataSourcePreviousRow and
DataSourceSelectRow.Column names as they appear in vMix. Nothing is named after a switcher — the feed describes football, and each suite maps it its own way.
Team colors. homeColor and awayColor are the
schools’ own primaries as #rrggbb. homeDisplayColor and
awayDisplayColor are what the StatChat overlays would actually put on screen
for this matchup, and homeTextColor / awayTextColor are the
readable text to go on top of the display colors.
The two usually match. They differ when both schools wear something close — two navy
programmes, say. The overlays never move our own color, so they shift the opponent to their
secondary instead, or to a neutral grey if that is also too close. Bind graphics to
the display pair unless you specifically want the school’s true color; that
way an outside graphic and a StatChat overlay on the same broadcast cannot disagree. Note
the opponent is the home side in about half of all games, so it is
homeDisplayColor that moves on those nights.
lastPlayWasPenalty on the score feed is
true or false, with penaltyTeam,
penaltyType and penaltyYards beside it — all three blank
when there is no flag. Bind a FLAG lower-third to the four together.
It turns on when the penalty is saved and off when the next play is saved, so it
stays up through the officials’ conference and the walk-off. It is not a timer: this
feed is cached for a few seconds at the edge, so anything counting down has to live in your
overlay, not here. penaltyType is blank when the scorer did not name the foul
— naming it is optional, so a signal with no entry in the list still reaches the log.
penaltyYards is the penalty’s own yardage, unsigned.
Note this reads the most recent row in the log, which is not the same thing as
lastplay: that view shows the last play from scrimmage and does not
change when a flag is thrown.
redZone on the score feed is true or
false — the same two values homeHasBall uses, so a
condition written for one works for the other. It is true when the team with the ball
is inside the opponent’s 20, and false whenever there is no ball spotted, so it
is never blank and a badge bound to it never has to handle an empty string. Use it
rather than working the red zone out from the spot yourself: situation
prints a bare yard number, so “on the 20” reads the same on your own 20
as on theirs and only one of those is the red zone. (ballOn does name
the side — “own 20” against “opp 20” — so it is
safe to test, just more work than reading this field.)
situation on the score feed is down, distance and spot
already written out as one string — 2nd & 4 on the 25
— for a lower third that wants a single box instead of three.
It carries the bare yard number, so it does not say which half of the field the
ball is on; bind ballOn beside it, or instead of it, when that
matters. Like downAndDistance it is empty between drives, when
there is no down and no spot to report.
| View | Columns |
|---|---|
score | homeTeam homeScore awayTeam awayScore quarter quarterNumber quarterOrdinal overtimeRound down downOrdinal distance downAndDistance ballOn situation redZone lastPlayWasPenalty penaltyYards penaltyTeam penaltyType homeColor awayColor homeDisplayColor awayDisplayColor homeTextColor awayTextColor possession homeHasBall awayHasBall homeTimeouts awayTimeouts |
drive | team plays yards startedAt |
lastplay | text quarter team |
teamstats | team score rushYards passYards totalYards rushAtt passComp passAtt totalPlays firstDowns thirdDownConv thirdDownAtt thirdDownPct fourthDownConv fourthDownAtt explosive sacks interceptions fumbleRec turnovers possessions timeOfPossession timeouts penaltyCount penaltyYards penalties |
rushing | player team att yds long td fum |
passing | player team att comp yds long td intThrown sacked |
receiving | player team rec tgt yds long td fum |
defense | player team tackles tfl sacks int fumRec |
kicking | player team fgMade fgAtt fgLong fgBlocked patMade patAtt patBlocked |
kickoffs | player team kickoffs touchbacks |
punting | player team punts puntYds puntsWithYards puntLong blocked |
| wrapper | view onAir game gameDate status resolvedBy updated
— only with the XPath set to /feed |
In the order worth checking.
onAir="false"? Nobody has marked
a game ON AIR, or somebody took it off./feed/player against a
score feed, or the other way round.&format=json will connect and produce nothing usable.© 2026 StatChat. All rights reserved. Unauthorized copying, modification or distribution of this software or its documentation is prohibited.