CurlOps
Broadcast integration

Your schedule,
on the air automatically.

CurlOps publishes a read-only schedule feed that Curling Stadium Manager (CSM) polls every hour. CSM launches OBS for the right sheet, opens a YouTube broadcast, and ends the stream when the game finishes — no club-staff intervention.

One URL · One API key · Polled hourly · TLS required

schedule source URL
GET /api/v1/integrations/csm/facilities/{slug}/games
# CSM appends the date window itself
  ?from=2026-06-15&to=2026-07-15
# authenticate with one per-facility key
X-API-Key: 4f8b3c9e…b0d3f6a
How it works

From draw sheet to YouTube, untouched.

CurlOps is the schedule source. CSM does the broadcasting. The contract between them is a single JSON endpoint.

1

CSM polls hourly

CSM requests a 30-day forward window from your facility's feed — plus an on-demand sync whenever an operator clicks "Sync".

2

CurlOps returns games

A clean array of scheduled games with sheet, start/end in ISO-8601, teams, event name, and a stable id for dedupe.

3

OBS + YouTube fire

~60 seconds before start, CSM launches OBS for that sheet, opens a YouTube broadcast, and applies the overlay.

4

Archive at the buzzer

At the game's end time the stream stops and the recording lands in your YouTube archive. Fully unattended.

The contract

One request in. One JSON payload out.

This is a real response from a CurlOps facility feed. Two top-level keys: facility metadata and the games array. Empty windows return "games": [] with 200 OK.

Request

curl
# Curling Stadium Manager polling a facility
curl "https://app.curlops.com/api/v1/integrations/\
csm/facilities/dumfries-ice-bowl/games\
?from=2026-06-15&to=2026-07-15" \
  -H "X-API-Key: 4f8b3c9e…b0d3f6a" \
  -H "Accept: application/json"

Status & auth

200success · body is the JSON at right
401api key missing or invalid
404facility slug doesn't exist
429rate-limited · honors Retry-After

Response · 200 OK

application/json; charset=utf-8
{
  "facility": {
    "slug": "dumfries-ice-bowl",
    "name": "Dumfries Ice Bowl",
    "timezone": "Europe/London"
  },
  "games": [
    {
      "id": "g_2026_06_20_A_1",
      "sheet": "A",
      "start": "2026-06-20T19:00:00+01:00",
      "end":   "2026-06-20T21:00:00+01:00",
      "event_name": "Tuesday Mixed — Draw 5",
      "team1": "Smith Rink",
      "team2": "Jones Rink",
      "notes": null,
      "status": "scheduled"
    },
    {
      "id": "g_2026_06_21_C_1",
      "sheet": "C",
      "start": "2026-06-21T10:00:00+01:00",
      "end":   "2026-06-21T12:00:00+01:00",
      "event_name": "Saturday Senior — Draw 5",
      "team1": "MacLeod Rink",
      "team2": "Anderson Rink",
      "notes": "Quarter-final",
      "status": "scheduled"
    }
  ]
}
Field reference

Every field, explained.

All datetimes carry a timezone offset — never naive local times. The id is stable across polls so a reschedule is the same game with new times.

facility

FieldTypeNotes
slugstringURL-safe facility identifier.
namestringHuman-readable; shown in CSM logs.
timezonestringIANA zone for sanity-checking, e.g. Europe/London.

games[]

FieldTypeNotes
idstringStable & unique. Same on reschedule.
sheetstringSheet label, e.g. "A" or "1". Case-sensitive.
startstringISO-8601 with offset.
endstringISO-8601 with offset.
event_namestringLeague / event for the broadcast title.
team1 · team2string?Rink names; null for a placeholder.
notesstring?Free text; admin display only.
statusenumSee mapping below.

Status mapping

CSM only broadcasts scheduled games. Everything else is skipped on import or deactivated on the next poll. CurlOps maps its internal game states onto the CSM vocabulary:

scheduledscheduled in_progressin_progress finalcompleted forfeitcancelled cancelledcancelled

Turning it on takes two fields.

A CurlOps admin issues a per-facility key; the CSM operator pastes the schedule URL and key into the facility. From then on, your league streams itself.

# CurlOps side — issue the key
php artisan csm:issue-key dumfries-ice-bowl
→ Schedule URL + X-API-Key for the CSM operator

Broadcast every draw. Touch nothing.

If your club runs CurlOps and Curling Stadium Manager, your schedule is already broadcast-ready.

Start your league →