RCStats.io
Stream Deck Producer Guide

Push racer stat cards to the OBS overlay directly from your Stream Deck — no commentator involvement needed.

How It Works

RCStats.io exposes four HTTP GET endpoints that you can program into Stream Deck buttons. When triggered, each endpoint reads the current live scoring data, looks up the racer's historical stats, and pushes a fully-built stat card to the OBS overlay automatically.

Step 1
Stream Deck Button
Producer presses a button mapped to an RCStats.io URL
Step 2
API Endpoint
Server reads live positions, fetches racer history & notable stats
Step 3
Card Push
Builds and pushes the stat card to the overlay store
Step 4
OBS Overlay
Card appears on stream with entry animation, auto-expires after 15 seconds
1

Create a Broadcast Session

  1. 1a
    Go to the Live Scoring page and enter the LiveRC subdomain (e.g. racetime).
  2. 1b
    Click Listen. This creates a secure broadcast session and generates:
ID
Session ID
A non-guessable identifier like pnb19-a3f8c2e1 used in all endpoint URLs.
KEY
Producer API Key
A secret key like pk_a3f8c2e1b9d47f2c... that authenticates your requests. Shown once — copy it immediately.
Key security
The producer key is hashed before storage and cannot be retrieved after you leave the page. If you lose it, use Rotate Key on the Live Scoring page to generate a new one.
2

API Endpoints

All endpoints are simple GETrequests — perfect for Stream Deck's built-in "Website" action or the "API Ninja" plugin. Replace SESSION_ID and PRODUCER_KEY with your actual values.

GETPosition 1 (Leader)
https://rcstats.io/api/overlay/{SESSION_ID}/position/1?key={PRODUCER_KEY}

Pushes a full stat card for the current race leader — name, position, lap count, fastest lap, PNB history table, and AI-generated notable stat.

GETPosition 2
https://rcstats.io/api/overlay/{SESSION_ID}/position/2?key={PRODUCER_KEY}

Same card format for the racer in second place.

GETPosition 3
https://rcstats.io/api/overlay/{SESSION_ID}/position/3?key={PRODUCER_KEY}

Same card format for the racer in third place.

GETHead-to-Head (P1 vs P2)
https://rcstats.io/api/overlay/{SESSION_ID}/head-to-head/1/2?key={PRODUCER_KEY}

Pushes a side-by-side comparison card for the racers at positions 1 and 2 — each with their own position badge, lap count, and notable stat.

Any position works
While P1–P3 and H2H 1v2 are the most common, you can target any position number. For example, .../position/10 fetches the racer in 10th place, and .../head-to-head/3/5 compares P3 and P5.
3

Response Format

Every endpoint returns JSON. A successful push looks like:

{
  "success": true,
  "racer": "Tyler Hooks",
  "pushed_at": "2025-07-15T22:14:33.456Z",
  "remaining_requests": 8
}

Head-to-head responses include both racer names:

{
  "success": true,
  "racer": "Tyler Hooks vs Ryan Lutz",
  "pushed_at": "2025-07-15T22:14:33.456Z",
  "remaining_requests": 7
}

Error responses include a reason:

{
  "success": false,
  "error": "No driver at position 12"
}
4

Status Codes

CodeMeaningAction
200Card pushed successfullyCard is now live on the overlay
400Invalid positionCheck that the position is a positive number
401Invalid producer keyCopy the correct key from the Live Scoring page
403Session inactive or expiredCreate a new session from the Live Scoring page
404Session not found / no driver at position / no live dataVerify session ID and that live scoring is active
429Rate limited (10 requests/minute)Wait a few seconds before the next push
5

Stream Deck Configuration

The simplest approach uses the built-in "Website" action in the Stream Deck software.

  1. 5a
    Open the Elgato Stream Deck software.
  2. 5b
    Drag a Website action onto an empty button.
  3. 5c
    Paste the full endpoint URL (copied from the Live Scoring page) into the URL field. For example:
    https://rcstats.io/api/overlay/pnb19-a3f8c2e1/position/1?key=pk_a3f8c2e1b9d47f2c8e3a1b4d5e6f7a8b
  4. 5d
    Uncheck"Access in background" if you want the browser to open briefly as confirmation. Or check it for a silent, no-popup fire-and-forget push.
  5. 5e
    Repeat for P2, P3, and H2H buttons. Label them clearly on your Stream Deck profile.
API Ninja plugin
For a cleaner experience without browser popups, install the API Ninja Stream Deck plugin. It makes HTTP requests silently and can display the response (racer name) on the button itself.
6

Card Behavior

Display duration
Producer-pushed cards display for 15 secondswith a slide-in animation, then auto-expire with a fade-out. This matches the commentator's default card duration.
Card layout
Position endpoints push full layout cards (history table + appearances + notable stat). Head-to-head endpoints push the head-to-head layout with side-by-side comparison.
Overlapping pushes
Pushing a new card while one is already live replaces it immediately. There is no queue — the most recent push always wins.
Unknown racers
If a racer at the requested position has no match in the RCStats.io database, the card still displays with their live name and position but without historical data.
7

Rate Limits & Security

Rate limiting
Each session is limited to 10 requests per minute across all endpoints combined. The remaining_requests field in the response shows how many you have left.
Session expiration
Sessions expire 24 hours after creation. Start a new session from the Live Scoring page for each broadcast day.
Key rotation
If your producer key is compromised, click Rotate Keyon the Live Scoring page. The old key is invalidated immediately and a new one is generated. You'll need to update all Stream Deck buttons with the new URL.
Logging
All push attempts (success and failure) are logged server-side with timestamp, IP address, position, and racer name for audit purposes.

Quick Reference

ButtonEndpoint PathCard Type
P1/position/1Full (leader)
P2/position/2Full
P3/position/3Full
H2H/head-to-head/1/2Head-to-Head

All paths are prefixed with https://rcstats.io/api/overlay/SESSION_ID and require ?key=PRODUCER_KEY.