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.

ViewColumns
scorehomeTeam homeScore awayTeam awayScore quarter quarterNumber quarterOrdinal overtimeRound down downOrdinal distance downAndDistance ballOn 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