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.
Create a Broadcast Session
- 1aGo to the Live Scoring page and enter the LiveRC subdomain (e.g.
racetime). - 1bClick Listen. This creates a secure broadcast session and generates:
pnb19-a3f8c2e1 used in all endpoint URLs.pk_a3f8c2e1b9d47f2c... that authenticates your requests. Shown once — copy it immediately.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.
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.
https://rcstats.io/api/overlay/{SESSION_ID}/position/2?key={PRODUCER_KEY}Same card format for the racer in second place.
https://rcstats.io/api/overlay/{SESSION_ID}/position/3?key={PRODUCER_KEY}Same card format for the racer in third place.
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.
.../position/10 fetches the racer in 10th place, and .../head-to-head/3/5 compares P3 and P5.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"
}Status Codes
| Code | Meaning | Action |
|---|---|---|
| 200 | Card pushed successfully | Card is now live on the overlay |
| 400 | Invalid position | Check that the position is a positive number |
| 401 | Invalid producer key | Copy the correct key from the Live Scoring page |
| 403 | Session inactive or expired | Create a new session from the Live Scoring page |
| 404 | Session not found / no driver at position / no live data | Verify session ID and that live scoring is active |
| 429 | Rate limited (10 requests/minute) | Wait a few seconds before the next push |
Stream Deck Configuration
The simplest approach uses the built-in "Website" action in the Stream Deck software.
- 5aOpen the Elgato Stream Deck software.
- 5bDrag a Website action onto an empty button.
- 5cPaste 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
- 5dUncheck"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.
- 5eRepeat for P2, P3, and H2H buttons. Label them clearly on your Stream Deck profile.
Card Behavior
Rate Limits & Security
remaining_requests field in the response shows how many you have left.Quick Reference
| Button | Endpoint Path | Card Type |
|---|---|---|
| P1 | /position/1 | Full (leader) |
| P2 | /position/2 | Full |
| P3 | /position/3 | Full |
| H2H | /head-to-head/1/2 | Head-to-Head |
All paths are prefixed with https://rcstats.io/api/overlay/SESSION_ID and require ?key=PRODUCER_KEY.