StatChat

StatChat — feeds in vMix

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.

This is the vMix detail. For what ON AIR means, how to set it, and the ready-made screen overlays, see Broadcasting (ON AIR) in the main guide.
Use XML, not JSON. vMix’s JSON data source expects the file to be an array — each element in the array becomes a row. A StatChat feed is an object with the rows nested inside it under 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.

1. Get the address

One address per graphic, already built for you with your school’s key in it. Do not type one by hand.

  1. On the dashboard, open the ⋮ menu on the game’s row and choose Broadcast setup.
  2. Set the format toggle to XML. Every address in the feed table rewrites itself to &format=xml.
  3. Use the Copy button on the row you want.
https://www.statchat.co/api/feed?view=rushing&format=xml&key=20ceaabf28a1…
Treat the address like a password. The 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.
Mark a game ON AIR first. Every feed reads whichever game is flagged; with nothing flagged it returns onAir="false" and no rows. That is the most common reason a graphic looks broken.

2. Add it as a data source

  1. Click the menu icon in the bottom right corner of the main vMix window and choose Data Sources Manager.
  2. Click the add button. A settings window opens.
  3. Fill it in:
    Name
    Something you will recognise on the mapping screen later — SC Rushing, SC Score.
    Type
    XML
    Data Location
    Paste the address. Do not browse for a file.
    XPath
    The step people miss. It tells vMix which element is a row — see the table below. For rushing it is /feed/player.
    Update interval
    1–2 seconds. A source that fetches once looks exactly like a frozen feed: right in rehearsal, wrong all night.
  4. Click OK. The Data Sources Manager shows the rows in a table. Check them before building anything on it — if that table is empty, go to section 5 rather than starting to map a title.

The XPath for each feed

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.

ViewXPathRows you get
score/feed/gameOne
drive/feed/driveOne — the drive in progress
lastplay/feed/playOne
teamstats/feed/teamTwo, one per team
rushing/feed/playerOne per player, most yards first
passing/feed/playerOne per player, most yards first
receiving/feed/playerOne per player, most yards first
defense/feed/playerOne per player, most tackles first
kicking/feed/playerOne per player who attempted a kick
kickoffs/feed/playerOne per player who kicked off
punting/feed/playerOne per player who punted
starters/feed/starterOne 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.

You should not have to look this up. The Broadcast setup page inside StatChat now prints the address and the XPath together on every feed row, each with its own Copy button. This table is here for reference and for anyone working from an emailed list.

What vMix is actually reading

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.

3. Put it in a graphic

vMix binds one title field at a time, so this is done once per piece of text on the graphic.

  1. Right-click the Title input and choose Title Editor.
  2. Select a field in the left-hand column — the text objects in your title.
  3. Click Data Source in the top menu bar.
  4. Set the four options:
    Table
    The data source you named in section 2.
    Column
    The attribute — player, yds, td. Left on Auto it matches on the column name, so a title field actually named yds finds it by itself.
    Row
    Left on Selected it follows whichever row is selected in the Data Sources Manager. A fixed number pins the field instead.
    Format
    Optional wrapper text. {0} YDS renders 142 YDS.
  5. Repeat for every field — name, team, yards, touchdowns.

Choosing which player is on screen

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.

A top-three board does not need any of that. Pin the fields instead: the first player’s name to Row 1, the second to Row 2, the third to Row 3. The feed is already sorted, so the board re-orders itself as the game goes on.

4. Every field, by feed

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.

ViewColumns
scorehomeTeam 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
driveteam plays yards startedAt
lastplaytext quarter team
teamstatsteam 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
rushingplayer team att yds long td fum
passingplayer team att comp yds long td intThrown sacked
receivingplayer team rec tgt yds long td fum
defenseplayer team tackles tfl sacks int fumRec
kickingplayer team fgMade fgAtt fgLong fgBlocked patMade patAtt patBlocked
kickoffsplayer team kickoffs touchbacks
puntingplayer team punts puntYds puntsWithYards puntLong blocked
wrapperview onAir game gameDate status resolvedBy updated — only with the XPath set to /feed

5. When a graphic stops updating

In the order worth checking.

  1. Open the address in a browser. Current numbers mean the feed is fine and the problem is inside vMix — work down this list. Nothing at all means the problem is upstream; carry on.
  2. Is the update interval set? This is usually it. A data source with no interval fetches once and then shows the same numbers for the rest of the night.
  3. Does it say onAir="false"? Nobody has marked a game ON AIR, or somebody took it off.
  4. Is the XPath right for that view? A source with no rows and no error is nearly always /feed/player against a score feed, or the other way round.
  5. Is the format XML? An address ending &format=json will connect and produce nothing usable.
  6. Did the key come through whole? The address is long and copies badly by hand. Use the Copy button rather than retyping it.
vMix menu names and dialog labels here are vMix’s own, for version 29, and may sit in a slightly different place in another version. The field names and the XML structure are StatChat’s and do not change.

@statchatfball @statchatfootball Facebook YouTube