Report show airings
confirmReport program carriage and dropped breaks.
https://affiliates.radioworkflow.com/api/v1/affiliations/{id}/weeks/{week}/show-airingsCertifies each show day: whether the station carried the show, the hours it aired, and whether the network's spots aired unedited.
carried:startandend(anendbeforestartruns past midnight), and eitherunedited: trueordropped, the breaks the station did not air, each with its break number, counted straight through the show, the hour that holds it and a reason:[{"hour": 5, "breakNumber": 18, "reason": "..."}]. A dropped break must be a network break of that day, not a local one.not_carried: with areason.pending: clears an earlier report, until the week is signed.
A show day can be certified once the station's usual hours for the show are over, or, when the station gave none, once the day has ended in its time zone. aired_date is for a show aired on another day, within 7 days after its date. Send each day's rev, and the week's epoch and version, from get-week unchanged: if the show's breaks were renumbered in a newer version, the report answers 409 stale_version and saves nothing. A saved dropped break that get-week shows as unreadable or unavailable is never sent back: report the day's dropped breaks by their current numbers. The batch rules are those of report-affidavits.
Authentication
Authorization: Bearer rwaff_k_.... A key with the report scope. Keys and scopesPath parameters
idstring1 to 64 charactersrequiredGET /v1/affiliations: one station's relationship with one network.weekdaterequiredYYYY-MM-DD. Any other day answers 400.Request body (JSON)
epochintegerat least 0requiredweek.epoch from get-week, sent back unchanged. It moves when the network reopens the week, so a report built on an older read is refused with 409 epoch_changed.versionintegerat least 1optionalstale_version and saves nothing.all_or_nothingbooleanoptionaldefault falsetrue saves nothing when any item is refused (422 validation_failed). The default false saves the valid items and lists the others in errors.itemsarray of objectsrequiredvehicle_idstring1 to 20 charactersrequiredid.datedaterequiredYYYY-MM-DD.revintegerat least 0requiredrev from get-week.statusenumrequiredcarriednot_carriedpendingstarttimeoptionalHH:MM, in the station's time zone.endtimeoptionalHH:MM, in the station's time zone.aired_datedateoptionaluneditedbooleanoptionaltrue when every network spot aired as delivered.droppedarrayoptional[{"hour": 5, "breakNumber": 18, "reason": "..."}].reasonstring1 to 300 charactersoptionalnot_carried.Idempotency
Idempotency-Key header with every request (8 to 48 letters, digits, dashes or underscores; a UUID is a good choice). To retry a request that timed out, send it again with the same key: if the first attempt saved, the repeat answers its first result instead of recording twice. A reused key records nothing new: here it answers its first result even when the body changed, and after a request to another endpoint it usually fails with 502 upstream_failed. Never reuse one for a new request. How it worksResponse
application/jsonThe show days saved, the items refused and the week's new state.Response schema
weekobjectrequiredweek.state"signed" | "ready_to_sign" | "in_progress" | "published"requiredweek.epochintegerrequiredweek.revintegerrequiredShowAiring12 fields
keystringrequiredshowIdstringrequireddatedaterequiredstatus"pending" | "carried" | "not_carried"requiredstartinteger (0 to 1439)optionalendinteger (0 to 1439)optionaluneditedbooleanoptionaldropped(object or object or object)[]optionalreasonstringoptionalsource"portal" | "log_upload" | "rw_log" | "network" | "api" | "mcp"optionalairedDatedateoptionalrevintegerrequiredItemError6 fields
unit_idstringoptionalvehicle_idstringoptionaldatedateoptionalerror"rev_conflict" | "not_reportable" | "outside_window" | "invalid_time" | "invalid_date" | "reason_required" | "removed" | "not_found" | "break_not_found" | "local_break"requiredmessagestringrequiredAffiliateUnit27 fields
idstringrequireddatedaterequireddaypartstringrequiredwindowStartinteger (0 to 1439)requiredwindowEndinteger (0 to 1439)requiredcreativeIdstringrequiredadvertiserstringrequiredproductstringrequiredtitlestringrequirediscistringrequiredlengthintegerrequiredcartstringrequiredstatus"pending" | "aired" | "outside" | "not_aired"requiredairedAtinteger (0 to 1439)optionalairedDatedateoptionalreasonstringoptionalsource"portal" | "log_upload" | "rw_log" | "network" | "api" | "mcp"optionaladdedInVersionintegerrequiredremovedInVersionintegeroptionalkind"dated" | "weekly"requiredweekStartdaterequiredallowedDaysdate[]optionalrevintegerrequiredcopyStatus"ready" | "to_follow"requiredinstructionsstringoptionalrwState"confirmed" | "not_confirmed"optionalflagsstring[]requiredErrors
Rate limits
portal:authportal:keykey:{prefix}w:{prefix}MCP
report_show_airings, with the same input as one object. The MCP server# A new Idempotency-Key for every new request. Reuse it only to retry this same request.
IDEMPOTENCY_KEY=$(uuidgen)
curl -X POST 'https://affiliates.radioworkflow.com/api/v1/affiliations/srn-ksmt/weeks/2026-09-21/show-airings' \
-H "Authorization: Bearer $AFFILIATE_API_KEY" \
-H 'Content-Type: application/json' \
-H "Idempotency-Key: $IDEMPOTENCY_KEY" \
-d '{
"epoch": 1,
"version": 3,
"items": [
{
"vehicle_id": "show-wd",
"date": "2026-09-23",
"rev": 1,
"status": "carried",
"start": "19:00",
"end": "23:59",
"unedited": true
}
]
}'{
"epoch": 1,
"version": 3,
"items": [
{
"vehicle_id": "show-wd",
"date": "2026-09-23",
"rev": 1,
"status": "carried",
"start": "19:00",
"end": "23:59",
"unedited": true
}
]
}{
"saved": [
{
"key": "srn-ksmt:show-wd:2026-09-23",
"showId": "show-wd",
"date": "2026-09-23",
"status": "carried",
"start": 1140,
"end": 1439,
"unedited": true,
"source": "api",
"airedDate": "2026-09-23",
"rev": 2
}
],
"errors": [],
"week": {
"state": "in_progress",
"epoch": 1,
"rev": 2
}
}