Upload a log
writeUpload a log in any format; returns proposed matches and saves nothing.
https://affiliates.radioworkflow.com/api/v1/affiliations/{id}/weeks/{week}/log-uploadsSend the as-run log your automation system saves, in whatever format it uses, and get back proposed matches between its lines and the week's units. Nothing is saved as an affidavit: review the matches and apply the ones you accept with apply-log-matches.
The file goes in the multipart field file: CSV, TSV, TXT, LOG, ASC, DAT, XLS, XLSX or PDF, at most 10 MB, one broadcast week per file.
The answer waits up to 60 seconds for the file to be read. A file read in time answers 200 with the matches, and a file that could not be read answers 422 upload_failed. A file still being read answers 202 with its id: poll GET /api/uploads/{upload} with the same station key every few seconds until status is no longer reading. The poll answers {"status": "ready", "result": {...}}, where result is the object a 200 carries in upload, or {"status": "failed", "message": "..."}. Polling uses no upload quota.
Each match has a group: matched lines can be applied as they are, check lines need a look, and missing units found no line. Uploads are limited per affiliation and per key, and are not idempotent: sending the same file again is a new upload.
The key needs the report scope on an affiliation that takes reports. Without it, and for a read-only affiliation, the answer is 403 forbidden before the file is read; read_only comes only from an affiliation that became read-only during the upload.
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.Form fields (multipart/form-data)
filefilerequiredResponse
application/jsonThe upload id while the file is still being read; 200 with the proposed matches when it was read within 60 seconds.Response schema
The body is one of UploadCreated or UploadReady.
UploadCreated3 fields
uploadobjectrequiredupload.idstringrequiredupload.status"reading"requiredUploadReady1 field
UploadResult15 fields
idstringrequiredfileNamestringrequiredlinesReadintegerrequiredlinesIgnoredintegerrequiredcolumnsstring[]requiredmatchesobject[]requiredmatches[].unitIdstringrequiredmatches[].group"matched" | "check" | "missing"requiredmatches[].rowRefstringoptionalmatches[].rawstringoptionalmatches[].status"aired" | "outside"optionalmatches[].airedDatedateoptionalmatches[].airedAtinteger (0 to 1439)optionalmatches[].confidencenumber (0 to 1)requiredmatches[].whystringrequiredErrors
Rate limits
portal:authportal:keykey:{prefix}up:a:{affiliation id}up:p:{prefix}llm:n:{network cloud}MCP
curl -X POST 'https://affiliates.radioworkflow.com/api/v1/affiliations/srn-ksmt/weeks/2026-09-21/log-uploads' \ -H "Authorization: Bearer $AFFILIATE_API_KEY" \ -F 'file=@asrun.csv' \ --max-time 90
{
"upload": {
"id": "u1207_20260921_4f1c2a9e8b7d4c3fa0e1d2c3b4a59687",
"status": "reading"
}
}