{"openapi":"3.1.0","info":{"title":"PictureFlow API","version":"2026-11-01","description":"Connect PictureFlow Tracker shows and budgets to your own pipeline. Webhooks are POSTed as JSON with a PictureFlow-Signature header: t=<unix seconds>,v1=<hex HMAC-SHA256 of \"t.body\" with your signing secret>. Permissions: `tracker:read` (Shows, episodes, shots, tasks, notes, people and activity.); `budgets:read` (Projects, versions, topsheets and VFX shot bids.); `finance:read` (Day rates, vendor costs and contract value, for people who already see Finance.); `tracker:write` (Add and update shots, tasks, notes and episodes, log hours, and link them to ShotGrid or in-house ids. Needs edit access to the show.); `webhooks:manage` (Add, change and test webhooks, and read the change feed.)"},"servers":[{"url":"https://crew.pictureflow.pro/api/v1"}],"security":[{"bearer":[]}],"paths":{"/me":{"get":{"operationId":"me","tags":["Account"],"summary":"Check a key","description":"Who the key belongs to, its permissions and limits. Any key can call it.","parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"object":"key_owner","user":{"id":"cm3user01","name":"Sam Lee","email":"sam@example.com","company":"Northbound Pictures"},"plan":{"state":"subscribed"},"key":{"id":"cm3key01","name":"ShotGrid sync","prefix":"pf_live_Ab3dE9xK","scopes":["tracker:read"],"show_ids":[],"project_ids":[]},"api_version":"2026-11-01","rate_limit_per_minute":600}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/shows":{"get":{"operationId":"list-shows","tags":["Tracker"],"summary":"List shows","description":"Tracker shows the key's owner runs or was invited to. Add archived=true to include archived shows.\n\nNeeds the `tracker:read` permission.","parameters":[{"name":"archived","in":"query","required":false,"description":"true to include archived shows.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"object":"list","data":[{"object":"show","id":"cm3show0001","name":"Northbound","code":"NB","client":"Harbor Light","status":"active","archived":false,"start_date":"2026-11-01","delivery_date":"2027-03-12","hours_per_day":10,"currency":"USD","your_role":"owner","steps":[{"id":"comp","name":"Compositing","short":"CP","group":"2d","color":"#5e5ce6"}],"source_bid":null,"url":"https://tracker.pictureflow.pro/shows/cm3show0001"}],"has_more":false,"next_cursor":null}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/shows/{showId}":{"get":{"operationId":"get-show","tags":["Tracker"],"summary":"Get a show","description":"One show with its pipeline steps. Day rates and contract value are included only when the key has finance:read and its owner sees Finance.\n\nNeeds the `tracker:read` permission.","parameters":[{"name":"showId","in":"path","required":true,"description":"The show's id, from GET /shows.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"object":"show","id":"cm3show0001","name":"Northbound","code":"NB","…":"…"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/shows/{showId}/episodes":{"get":{"operationId":"list-episodes","tags":["Tracker"],"summary":"List episodes","description":"Needs the `tracker:read` permission.","parameters":[{"name":"showId","in":"path","required":true,"description":"The show's id, from GET /shows.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"object":"list","data":[{"object":"episode","id":"cm3ep0001","code":"NB101","name":"Pilot","turnover":"2026-11-03","temp_date":null,"picture_final":"2027-01-15","final_delivery":"2027-02-01","air_date":null,"sort":0}],"has_more":false,"next_cursor":null}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"create-episode","tags":["Changing shows"],"summary":"Add an episode","description":"Team only. Dates are YYYY-MM-DD.\n\nNeeds the `tracker:write` permission.","requestBody":{"required":true,"content":{"application/json":{"example":{"code":"NB102","name":"The Crossing","turnover":"2026-12-01","final_delivery":"2027-02-20","external_ids":{"shotgrid":"89"}}}}},"parameters":[{"name":"showId","in":"path","required":true,"description":"The show's id, from GET /shows.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"object":"episode","id":"cm3ep0002","code":"NB102","name":"The Crossing","…":"…"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/shows/{showId}/shots":{"get":{"operationId":"list-shots","tags":["Tracker"],"summary":"List shots and assets","description":"Sorted oldest change first, so a sync can page through and keep the last updated_at for next time. Clients see client-facing shots only, without people or hours; vendors see their own shots.\n\nNeeds the `tracker:read` permission.","parameters":[{"name":"showId","in":"path","required":true,"description":"The show's id, from GET /shows.","schema":{"type":"string"}},{"name":"status","in":"query","required":false,"description":"One or more status codes, comma separated.","schema":{"type":"string","enum":["wtg","ip","int","crv","fin","dlv","hld","omt"]}},{"name":"kind","in":"query","required":false,"description":"shot or asset.","schema":{"type":"string","enum":["shot","asset"]}},{"name":"episode_id","in":"query","required":false,"description":"Only this episode.","schema":{"type":"string"}},{"name":"code","in":"query","required":false,"description":"One or more shot codes, comma separated.","schema":{"type":"string"}},{"name":"vendor","in":"query","required":false,"description":"Only shots awarded to this vendor.","schema":{"type":"string"}},{"name":"external_source","in":"query","required":false,"description":"With external_id: find items by their id in another system, like shotgrid.","schema":{"type":"string"}},{"name":"external_id","in":"query","required":false,"description":"One or more outside ids, comma separated.","schema":{"type":"string"}},{"name":"updated_since","in":"query","required":false,"description":"Only items changed at or after this ISO timestamp. Use it for incremental syncs.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Items per page, 1–500. Default 100.","schema":{"type":"string"}},{"name":"cursor","in":"query","required":false,"description":"next_cursor from the previous page.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"object":"list","data":[{"object":"shot","id":"cm3shot0001","show_id":"cm3show0001","kind":"shot","code":"NB101_010","sequence":"NB101_010","episode_id":"cm3ep0001","episode_code":"NB101","description":"Sky replacement through the windshield, add snow","status":"ip","complexity":"medium","frames":96,"tags":["sky"],"due_date":"2026-12-04","delivered_at":null,"thumbnail_url":"https://www.pictureflow.pro/api/v1/shots/cm3shot0001/thumbnail","open_notes":1,"cut_from_bid":false,"sort":1,"assumptions":"Clean plate provided","lead":"Alex Rivera","vendor":null,"bid_hours":62,"logged_hours":18.5,"external_ids":{"shotgrid":"1234"},"url":"https://tracker.pictureflow.pro/shows/cm3show0001/shots?shot=cm3shot0001","created_at":"2026-11-02T17:04:11.000Z","updated_at":"2026-11-05T09:12:40.000Z"}],"has_more":false,"next_cursor":null}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"create-shot","tags":["Changing shows"],"summary":"Add a shot","description":"Adds a shot or asset with its first tasks (by step_id from GET /shows/{showId}; without steps it gets a Compositing task). Any shot field can be set at the same time, and external_ids links it to your system. Needs to be on the show's team with edit access. Send an Idempotency-Key header so a retry can't add it twice.\n\nNeeds the `tracker:write` permission.","requestBody":{"required":true,"content":{"application/json":{"example":{"code":"NB101_020","episode_code":"NB101","description":"Wide of the harbor, add fog","status":"wtg","frames":120,"due_date":"2026-12-11","steps":[{"step_id":"roto","bid_hours":8},{"step_id":"comp","bid_hours":24}],"external_ids":{"shotgrid":"1240"}}}}},"parameters":[{"name":"showId","in":"path","required":true,"description":"The show's id, from GET /shows.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"object":"shot","id":"cm3shot0002","show_id":"cm3show0001","kind":"shot","code":"NB101_020","sequence":"NB101_010","episode_id":"cm3ep0001","episode_code":"NB101","description":"Sky replacement through the windshield, add snow","status":"wtg","complexity":"medium","frames":96,"tags":["sky"],"due_date":"2026-12-04","delivered_at":null,"thumbnail_url":"https://www.pictureflow.pro/api/v1/shots/cm3shot0001/thumbnail","open_notes":1,"cut_from_bid":false,"sort":1,"assumptions":"Clean plate provided","lead":"Alex Rivera","vendor":null,"bid_hours":62,"logged_hours":18.5,"external_ids":{"shotgrid":"1240"},"url":"https://tracker.pictureflow.pro/shows/cm3show0001/shots?shot=cm3shot0001","created_at":"2026-11-02T17:04:11.000Z","updated_at":"2026-11-05T09:12:40.000Z"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/shots/{shotId}":{"get":{"operationId":"get-shot","tags":["Tracker"],"summary":"Get a shot","description":"Needs the `tracker:read` permission.","parameters":[{"name":"shotId","in":"path","required":true,"description":"The shot's id.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"object":"shot","id":"cm3shot0001","show_id":"cm3show0001","kind":"shot","code":"NB101_010","sequence":"NB101_010","episode_id":"cm3ep0001","episode_code":"NB101","description":"Sky replacement through the windshield, add snow","status":"ip","complexity":"medium","frames":96,"tags":["sky"],"due_date":"2026-12-04","delivered_at":null,"thumbnail_url":"https://www.pictureflow.pro/api/v1/shots/cm3shot0001/thumbnail","open_notes":1,"cut_from_bid":false,"sort":1,"assumptions":"Clean plate provided","lead":"Alex Rivera","vendor":null,"bid_hours":62,"logged_hours":18.5,"external_ids":{"shotgrid":"1234"},"url":"https://tracker.pictureflow.pro/shows/cm3show0001/shots?shot=cm3shot0001","created_at":"2026-11-02T17:04:11.000Z","updated_at":"2026-11-05T09:12:40.000Z"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"update-shot","tags":["Changing shows"],"summary":"Change a shot","description":"Send only the fields that change. A status change runs the show's status rules and sends change alerts, the same as on the website. vendor_cost needs finance:read and a producer. Vendors can change status, due date, lead and description on their own shots.\n\nNeeds the `tracker:write` permission.","requestBody":{"required":true,"content":{"application/json":{"example":{"status":"ip","lead":"Alex Rivera","due_date":"2026-12-04"}}}},"parameters":[{"name":"shotId","in":"path","required":true,"description":"The shot's id.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"object":"shot","id":"cm3shot0001","show_id":"cm3show0001","kind":"shot","code":"NB101_010","sequence":"NB101_010","episode_id":"cm3ep0001","episode_code":"NB101","description":"Sky replacement through the windshield, add snow","status":"ip","complexity":"medium","frames":96,"tags":["sky"],"due_date":"2026-12-04","delivered_at":null,"thumbnail_url":"https://www.pictureflow.pro/api/v1/shots/cm3shot0001/thumbnail","open_notes":1,"cut_from_bid":false,"sort":1,"assumptions":"Clean plate provided","lead":"Alex Rivera","vendor":null,"bid_hours":62,"logged_hours":18.5,"external_ids":{"shotgrid":"1234"},"url":"https://tracker.pictureflow.pro/shows/cm3show0001/shots?shot=cm3shot0001","created_at":"2026-11-02T17:04:11.000Z","updated_at":"2026-11-05T09:12:40.000Z"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/shots/{shotId}/thumbnail":{"get":{"operationId":"shot-thumbnail","tags":["Tracker"],"summary":"Download a shot's thumbnail","description":"Returns the image itself (JPEG, PNG or WebP), or redirects to it.\n\nNeeds the `tracker:read` permission.","parameters":[{"name":"shotId","in":"path","required":true,"description":"The shot's id.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"image/*":{}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/shows/{showId}/tasks":{"get":{"operationId":"list-tasks","tags":["Tracker"],"summary":"List tasks","description":"One task per shot and pipeline step. step_id matches the show's steps.\n\nNeeds the `tracker:read` permission.","parameters":[{"name":"showId","in":"path","required":true,"description":"The show's id, from GET /shows.","schema":{"type":"string"}},{"name":"status","in":"query","required":false,"description":"One or more status codes, comma separated.","schema":{"type":"string","enum":["wtg","ip","int","crv","fin","dlv","hld","omt"]}},{"name":"shot_id","in":"query","required":false,"description":"Only this shot's tasks.","schema":{"type":"string"}},{"name":"step_id","in":"query","required":false,"description":"Only this pipeline step.","schema":{"type":"string"}},{"name":"assignee","in":"query","required":false,"description":"Only tasks assigned to this name.","schema":{"type":"string"}},{"name":"external_source","in":"query","required":false,"description":"With external_id: find items by their id in another system, like shotgrid.","schema":{"type":"string"}},{"name":"external_id","in":"query","required":false,"description":"One or more outside ids, comma separated.","schema":{"type":"string"}},{"name":"updated_since","in":"query","required":false,"description":"Only items changed at or after this ISO timestamp. Use it for incremental syncs.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Items per page, 1–500. Default 100.","schema":{"type":"string"}},{"name":"cursor","in":"query","required":false,"description":"next_cursor from the previous page.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"object":"list","data":[{"object":"task","id":"cm3task0001","show_id":"cm3show0001","shot_id":"cm3shot0001","shot_code":"NB101_010","step_id":"comp","step_name":"Compositing","status":"ip","start_date":"2026-11-10","due_date":"2026-11-21","assignee":"Alex Rivera","bid_hours":30,"logged_hours":12,"external_ids":{},"updated_at":"2026-11-05T09:12:40.000Z"}],"has_more":false,"next_cursor":null}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/tasks/{taskId}":{"get":{"operationId":"get-task","tags":["Tracker"],"summary":"Get a task","description":"Needs the `tracker:read` permission.","parameters":[{"name":"taskId","in":"path","required":true,"description":"The task's id.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"object":"task","id":"cm3task0001","…":"…"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"update-task","tags":["Changing shows"],"summary":"Change a task or log hours","description":"Status, assignee, dates and hours. add_hours adds to the hours already logged, for time tracking tools that send each session (use logged_hours to set the total instead). A new assignee is told, and status changes run the show's status rules.\n\nNeeds the `tracker:write` permission.","requestBody":{"required":true,"content":{"application/json":{"example":{"status":"int","add_hours":2.5}}}},"parameters":[{"name":"taskId","in":"path","required":true,"description":"The task's id.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"object":"task","id":"cm3task0001","status":"int","logged_hours":14.5,"…":"…"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/shows/{showId}/notes":{"get":{"operationId":"list-notes","tags":["Tracker"],"summary":"List notes","description":"Oldest first. Clients only see client notes.\n\nNeeds the `tracker:read` permission.","parameters":[{"name":"showId","in":"path","required":true,"description":"The show's id, from GET /shows.","schema":{"type":"string"}},{"name":"shot_id","in":"query","required":false,"description":"Only this shot's notes.","schema":{"type":"string"}},{"name":"kind","in":"query","required":false,"description":"client or internal.","schema":{"type":"string","enum":["client","internal"]}},{"name":"status","in":"query","required":false,"description":"open or addressed.","schema":{"type":"string","enum":["open","addressed"]}},{"name":"created_since","in":"query","required":false,"description":"Only items created at or after this ISO timestamp.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Items per page, 1–500. Default 100.","schema":{"type":"string"}},{"name":"cursor","in":"query","required":false,"description":"next_cursor from the previous page.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"object":"list","data":[{"object":"note","id":"cm3note0001","show_id":"cm3show0001","shot_id":"cm3shot0001","shot_code":"NB101_010","author_name":"Jordan Park","kind":"client","body":"Warm the sky slightly on the last 20 frames.","status":"open","created_at":"2026-11-06T18:30:00.000Z","resolved_at":null}],"has_more":false,"next_cursor":null}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"create-note","tags":["Changing shows"],"summary":"Leave a note","description":"An internal or client note on a shot (by shot_id or shot_code), or a reply with parent_id. @mentions and the show's people are told, the same as on the website. Notes from a key show the key's name, like \"Sam Lee via Review tool\".\n\nNeeds the `tracker:write` permission.","requestBody":{"required":true,"content":{"application/json":{"example":{"shot_code":"NB101_010","kind":"internal","body":"v012 is up for review. @Jordan Park can you take a look?","external_ids":{"shotgrid":"77120"}}}}},"parameters":[{"name":"showId","in":"path","required":true,"description":"The show's id, from GET /shows.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"object":"note","id":"cm3note0002","shot_code":"NB101_010","author_name":"Sam Lee via Review tool","kind":"internal","status":"open","…":"…"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/shows/{showId}/members":{"get":{"operationId":"list-members","tags":["Tracker"],"summary":"List the team","description":"People on the show and their roles. Not available to client or vendor keys. Day rates need finance:read.\n\nNeeds the `tracker:read` permission.","parameters":[{"name":"showId","in":"path","required":true,"description":"The show's id, from GET /shows.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"object":"list","data":[{"object":"member","id":"cm3mem0001","name":"Alex Rivera","email":"alex@example.com","role":"artist","access":"edit","step_id":"comp","signed_in":true}],"has_more":false,"next_cursor":null}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/shows/{showId}/activity":{"get":{"operationId":"list-activity","tags":["Tracker"],"summary":"List activity","description":"What changed on the show, oldest first. Not available to client or vendor keys.\n\nNeeds the `tracker:read` permission.","parameters":[{"name":"showId","in":"path","required":true,"description":"The show's id, from GET /shows.","schema":{"type":"string"}},{"name":"shot_id","in":"query","required":false,"description":"Only this shot's history.","schema":{"type":"string"}},{"name":"created_since","in":"query","required":false,"description":"Only items created at or after this ISO timestamp.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Items per page, 1–500. Default 100.","schema":{"type":"string"}},{"name":"cursor","in":"query","required":false,"description":"next_cursor from the previous page.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"object":"list","data":[{"object":"activity","id":"cm3act0001","show_id":"cm3show0001","shot_id":"cm3shot0001","user_name":"Sam Lee","text":"NB101_010 status → In progress","created_at":"2026-11-05T09:12:40.000Z"}],"has_more":false,"next_cursor":null}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/shows/{showId}/shots/batch":{"post":{"operationId":"batch-shots","tags":["Changing shows"],"summary":"Send many shots at once","description":"Up to 500 shots per request. Each is matched first by external_id (with source), then by code. Matched shots are updated, and a different code renames them; the rest are added, unless create_missing is false. Each shot's result is reported separately, so one bad shot doesn't stop the others. Fields are the same as Add a shot. Updates are quick; adding hundreds of new shots takes longer, so a first import is smoothest in requests of 100 to 200.\n\nNeeds the `tracker:write` permission.","requestBody":{"required":true,"content":{"application/json":{"example":{"source":"shotgrid","shots":[{"external_id":1234,"code":"NB101_010","status":"ip","frames":96},{"external_id":1240,"code":"NB101_020","episode_code":"NB101","description":"Wide of the harbor, add fog"}]}}}},"parameters":[{"name":"showId","in":"path","required":true,"description":"The show's id, from GET /shows.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"object":"batch_result","created":1,"updated":1,"failed":0,"data":[{"index":0,"ok":true,"action":"updated","id":"cm3shot0001","code":"NB101_010"},{"index":1,"ok":true,"action":"created","id":"cm3shot0002","code":"NB101_020"}]}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/shots/{shotId}/tasks":{"post":{"operationId":"create-task","tags":["Changing shows"],"summary":"Add a task","description":"Adds the task for one pipeline step, or updates it if the shot already has one (then the answer is 200, not 201). Takes the same fields as Change a task.\n\nNeeds the `tracker:write` permission.","requestBody":{"required":true,"content":{"application/json":{"example":{"step_id":"fx","assignee":"Morgan Diaz","bid_hours":16,"due_date":"2026-12-01"}}}},"parameters":[{"name":"shotId","in":"path","required":true,"description":"The shot's id.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"object":"task","id":"cm3task0002","shot_id":"cm3shot0001","step_id":"fx","step_name":"FX","status":"wtg","assignee":"Morgan Diaz","bid_hours":16,"logged_hours":0,"…":"…"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/notes/{noteId}":{"get":{"operationId":"get-note","tags":["Tracker"],"summary":"Get a note","description":"Needs the `tracker:read` permission.","parameters":[{"name":"noteId","in":"path","required":true,"description":"The note's id.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"object":"note","id":"cm3note0001","…":"…"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"update-note","tags":["Changing shows"],"summary":"Change a note","description":"Mark it addressed or open again, or change its text. The team can change any note; others only their own.\n\nNeeds the `tracker:write` permission.","requestBody":{"required":true,"content":{"application/json":{"example":{"status":"addressed"}}}},"parameters":[{"name":"noteId","in":"path","required":true,"description":"The note's id.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"object":"note","id":"cm3note0001","status":"addressed","…":"…"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/episodes/{episodeId}":{"get":{"operationId":"get-episode","tags":["Tracker"],"summary":"Get an episode","description":"Needs the `tracker:read` permission.","parameters":[{"name":"episodeId","in":"path","required":true,"description":"The episode's id.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"object":"episode","id":"cm3ep0001","…":"…"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"update-episode","tags":["Changing shows"],"summary":"Change an episode","description":"Needs the `tracker:write` permission.","requestBody":{"required":true,"content":{"application/json":{"example":{"picture_final":"2027-01-22"}}}},"parameters":[{"name":"episodeId","in":"path","required":true,"description":"The episode's id.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"object":"episode","id":"cm3ep0001","picture_final":"2027-01-22","…":"…"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/shows/{showId}/uploads":{"post":{"operationId":"create-upload","tags":["Versions"],"summary":"Upload a review copy or thumbnail","description":"Step one of hosting a file. Say what you're sending; you get back an upload id and an address. PUT the file's bytes to upload.url with exactly the headers in upload.headers (no API key), then pass the id as review_upload_id or thumbnail_upload_id when you send the version. Review copies (MP4, MOV, WebM or an image) count against the account's render storage, are cleared after 30 days unless approved or kept, and can be up to 250 MB; thumbnails (JPEG, PNG, WebP) up to 10 MB. If the show's owner connected their own storage in Tracker Settings, the address points at their bucket instead: files up to 5 GB, nothing counted against our storage. The address works for an hour. Too big, or no storage left: 413 with code file_too_large or storage_full; send a source_url instead.\n\nNeeds the `tracker:write` permission.","requestBody":{"required":true,"content":{"application/json":{"example":{"kind":"review","content_type":"video/mp4","size":18432000,"filename":"NB101_010_v012.mp4"}}}},"parameters":[{"name":"showId","in":"path","required":true,"description":"The show's id, from GET /shows.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"object":"upload","id":"up_eyJzIjoi…","kind":"review","content_type":"video/mp4","size":18432000,"expires_at":"2026-11-06T18:02:11.000Z","upload":{"url":"https://blob.vercel-storage.com/?pathname=…","method":"PUT","headers":{"authorization":"Bearer vercel_blob_client_…","x-api-version":"9","x-content-type":"video/mp4","x-add-random-suffix":"0"}}}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/shots/{shotId}/versions":{"post":{"operationId":"create-version","tags":["Versions"],"summary":"Send a version for review","description":"Adds the shot's next version (v001, v002…) to the Review page and tells the shot's lead, the same as sending one on the website. Point source_url at the original on your own storage (free, shown as \"Watch\"), add a hosted review copy and thumbnail from POST /shows/{showId}/uploads, or both. Pick the task with task_id or step_id. Vendors can send versions on their own shots. keep (hold the review copy past 30 days) is for the show's team.\n\nNeeds the `tracker:write` permission.","requestBody":{"required":true,"content":{"application/json":{"example":{"step_id":"comp","source_url":"https://media.northbound.example/NB101_010/comp/v012/NB101_010_comp_v012.mov","review_upload_id":"up_eyJzIjoi…","thumbnail_upload_id":"up_eyJrIjoi…","comment":"Sky warmed on the last 20 frames","external_ids":{"shotgrid":"45210"}}}}},"parameters":[{"name":"shotId","in":"path","required":true,"description":"The shot's id.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"object":"shot_version","id":"cm3sv0012","show_id":"cm3show0001","shot_id":"cm3shot0001","shot_code":"NB101_010","task_id":"cm3task0001","number":12,"name":"v012","status":"pending","comment":"Sky warmed on the last 20 frames","source_url":"https://media.northbound.example/NB101_010/comp/v012/NB101_010_comp_v012.mov","review":{"url":"https://abc123.public.blob.vercel-storage.com/tracker/cm3show0001/api/NB101_010_v012.mp4","content_type":"video/mp4","size":18432000,"removed_at":null},"thumbnail_url":"https://abc123.public.blob.vercel-storage.com/tracker/cm3show0001/api/NB101_010_v012.jpg","keep":false,"submitted_by":"Sam Lee via Publish tool","external_ids":{"shotgrid":"45210"},"url":"https://tracker.pictureflow.pro/shows/cm3show0001/shots?shot=cm3shot0001","created_at":"2026-11-06T17:02:11.000Z","reviewed_at":null}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"get":{"operationId":"list-shot-versions","tags":["Versions"],"summary":"List a shot's versions","description":"Newest first. Not available to client keys: clients review through review links.\n\nNeeds the `tracker:read` permission.","parameters":[{"name":"shotId","in":"path","required":true,"description":"The shot's id.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"object":"list","data":[{"object":"shot_version","id":"cm3sv0012","show_id":"cm3show0001","shot_id":"cm3shot0001","shot_code":"NB101_010","task_id":"cm3task0001","number":12,"name":"v012","status":"pending","comment":"Sky warmed on the last 20 frames","source_url":"https://media.northbound.example/NB101_010/comp/v012/NB101_010_comp_v012.mov","review":{"url":"https://abc123.public.blob.vercel-storage.com/tracker/cm3show0001/api/NB101_010_v012.mp4","content_type":"video/mp4","size":18432000,"removed_at":null},"thumbnail_url":"https://abc123.public.blob.vercel-storage.com/tracker/cm3show0001/api/NB101_010_v012.jpg","keep":false,"submitted_by":"Sam Lee via Publish tool","external_ids":{"shotgrid":"45210"},"url":"https://tracker.pictureflow.pro/shows/cm3show0001/shots?shot=cm3shot0001","created_at":"2026-11-06T17:02:11.000Z","reviewed_at":null}],"has_more":false,"next_cursor":null}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/shows/{showId}/versions":{"get":{"operationId":"list-show-versions","tags":["Versions"],"summary":"List a show's versions","description":"Oldest first, paged. Vendors see their own shots' versions.\n\nNeeds the `tracker:read` permission.","parameters":[{"name":"showId","in":"path","required":true,"description":"The show's id, from GET /shows.","schema":{"type":"string"}},{"name":"shot_id","in":"query","required":false,"description":"Only this shot's versions.","schema":{"type":"string"}},{"name":"status","in":"query","required":false,"description":"pending, notes or approved, comma separated.","schema":{"type":"string","enum":["pending","notes","approved"]}},{"name":"created_since","in":"query","required":false,"description":"Only items created at or after this ISO timestamp.","schema":{"type":"string"}},{"name":"external_source","in":"query","required":false,"description":"With external_id: find items by their id in another system, like shotgrid.","schema":{"type":"string"}},{"name":"external_id","in":"query","required":false,"description":"One or more outside ids, comma separated.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Items per page, 1–500. Default 100.","schema":{"type":"string"}},{"name":"cursor","in":"query","required":false,"description":"next_cursor from the previous page.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"object":"list","data":[{"object":"shot_version","id":"cm3sv0012","show_id":"cm3show0001","shot_id":"cm3shot0001","shot_code":"NB101_010","task_id":"cm3task0001","number":12,"name":"v012","status":"pending","comment":"Sky warmed on the last 20 frames","source_url":"https://media.northbound.example/NB101_010/comp/v012/NB101_010_comp_v012.mov","review":{"url":"https://abc123.public.blob.vercel-storage.com/tracker/cm3show0001/api/NB101_010_v012.mp4","content_type":"video/mp4","size":18432000,"removed_at":null},"thumbnail_url":"https://abc123.public.blob.vercel-storage.com/tracker/cm3show0001/api/NB101_010_v012.jpg","keep":false,"submitted_by":"Sam Lee via Publish tool","external_ids":{"shotgrid":"45210"},"url":"https://tracker.pictureflow.pro/shows/cm3show0001/shots?shot=cm3shot0001","created_at":"2026-11-06T17:02:11.000Z","reviewed_at":null}],"has_more":false,"next_cursor":null}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/shot_versions/{versionId}":{"get":{"operationId":"get-version","tags":["Versions"],"summary":"Get a version","description":"Needs the `tracker:read` permission.","parameters":[{"name":"versionId","in":"path","required":true,"description":"The version's id (from a shot_version, not a budget version).","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"object":"shot_version","id":"cm3sv0012","show_id":"cm3show0001","shot_id":"cm3shot0001","shot_code":"NB101_010","task_id":"cm3task0001","number":12,"name":"v012","status":"pending","comment":"Sky warmed on the last 20 frames","source_url":"https://media.northbound.example/NB101_010/comp/v012/NB101_010_comp_v012.mov","review":{"url":"https://abc123.public.blob.vercel-storage.com/tracker/cm3show0001/api/NB101_010_v012.mp4","content_type":"video/mp4","size":18432000,"removed_at":null},"thumbnail_url":"https://abc123.public.blob.vercel-storage.com/tracker/cm3show0001/api/NB101_010_v012.jpg","keep":false,"submitted_by":"Sam Lee via Publish tool","external_ids":{"shotgrid":"45210"},"url":"https://tracker.pictureflow.pro/shows/cm3show0001/shots?shot=cm3shot0001","created_at":"2026-11-06T17:02:11.000Z","reviewed_at":null}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"update-version","tags":["Versions"],"summary":"Review or change a version","description":"status (pending, notes, approved) and keep are for the show's team; approving can finish the task when the show's status rule is on, the same as on the website. Anyone who can work on the shot can change comment and source_url.\n\nNeeds the `tracker:write` permission.","requestBody":{"required":true,"content":{"application/json":{"example":{"status":"approved"}}}},"parameters":[{"name":"versionId","in":"path","required":true,"description":"The version's id (from a shot_version, not a budget version).","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"object":"shot_version","id":"cm3sv0012","show_id":"cm3show0001","shot_id":"cm3shot0001","shot_code":"NB101_010","task_id":"cm3task0001","number":12,"name":"v012","status":"approved","comment":"Sky warmed on the last 20 frames","source_url":"https://media.northbound.example/NB101_010/comp/v012/NB101_010_comp_v012.mov","review":{"url":"https://abc123.public.blob.vercel-storage.com/tracker/cm3show0001/api/NB101_010_v012.mp4","content_type":"video/mp4","size":18432000,"removed_at":null},"thumbnail_url":"https://abc123.public.blob.vercel-storage.com/tracker/cm3show0001/api/NB101_010_v012.jpg","keep":false,"submitted_by":"Sam Lee via Publish tool","external_ids":{"shotgrid":"45210"},"url":"https://tracker.pictureflow.pro/shows/cm3show0001/shots?shot=cm3shot0001","created_at":"2026-11-06T17:02:11.000Z","reviewed_at":"2026-11-07T10:15:00.000Z"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/shot_versions/{versionId}/review":{"get":{"operationId":"version-review-file","tags":["Versions"],"summary":"Download the review copy","description":"Returns the file, or redirects to it.\n\nNeeds the `tracker:read` permission.","parameters":[{"name":"versionId","in":"path","required":true,"description":"The version's id (from a shot_version, not a budget version).","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":"(video or image bytes)"}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/shot_versions/{versionId}/thumbnail":{"get":{"operationId":"version-thumbnail","tags":["Versions"],"summary":"Download the thumbnail","description":"Returns the image, or redirects to it.\n\nNeeds the `tracker:read` permission.","parameters":[{"name":"versionId","in":"path","required":true,"description":"The version's id (from a shot_version, not a budget version).","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":"(image bytes)"}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/projects":{"get":{"operationId":"list-projects","tags":["Budgets and bids"],"summary":"List projects","description":"Budgets and bids from every PictureFlow app that the key's owner owns or was invited to.\n\nNeeds the `budgets:read` permission.","parameters":[{"name":"archived","in":"query","required":false,"description":"true to include archived projects.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"object":"list","data":[{"object":"project","id":"cm3proj01","name":"Northbound VFX bid","client":"Harbor Light","kind":"vfx","type":"shot_bid","app":"vfx","currency":"USD","archived":false,"your_role":"owner","section_limited":false,"url":"https://vfx.pictureflow.pro/app/p/cm3proj01"}],"has_more":false,"next_cursor":null}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/projects/{projectId}":{"get":{"operationId":"get-project","tags":["Budgets and bids"],"summary":"Get a project","description":"The project with its versions and their totals.\n\nNeeds the `budgets:read` permission.","parameters":[{"name":"projectId","in":"path","required":true,"description":"The project's id.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"object":"project","id":"cm3proj01","…":"…","versions":[{"object":"version","id":"cm3ver01","name":"Bid v2","locked":false,"currency":"USD","total":412500}]}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/projects/{projectId}/versions":{"get":{"operationId":"list-versions","tags":["Budgets and bids"],"summary":"List versions","description":"Needs the `budgets:read` permission.","parameters":[{"name":"projectId","in":"path","required":true,"description":"The project's id.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"object":"list","data":[{"object":"version","id":"cm3ver01","name":"Bid v2","locked":false,"currency":"USD","total":412500}],"has_more":false,"next_cursor":null}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/versions/{versionId}/topsheet":{"get":{"operationId":"topsheet","tags":["Budgets and bids"],"summary":"Get a topsheet","description":"Section and account totals, fringes, fees, discounts and actuals, calculated the same way as the app. Includes the locked-in bid beside each total when there is one.\n\nNeeds the `budgets:read` permission.","parameters":[{"name":"versionId","in":"path","required":true,"description":"The version's id.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"object":"topsheet","version_id":"cm3ver01","version_name":"Bid v2","currency":"USD","sections":[{"id":"s1","code":"A","name":"Pre-production","kind":"btl","subtotal":18200,"fringe":3100,"total":21300,"actual":0,"bid":21300,"accounts":[{"id":"a1","code":"1","name":"Producer","total":6500,"actual":0,"bid":6500}]}],"sections_total":371000,"fees":[{"name":"Production fee","percent":10,"base":371000,"amount":37100}],"grand_total":412500,"actual_total":0}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/versions/{versionId}/shots":{"get":{"operationId":"shot-bid","tags":["Budgets and bids"],"summary":"Get a VFX shot bid","description":"Every shot and asset in a VFX bid with days per step and cost. Use it to create shots and tasks in your own tracker.\n\nNeeds the `budgets:read` permission.","parameters":[{"name":"versionId","in":"path","required":true,"description":"The version's id.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"object":"shot_bid","version_id":"cm3ver01","currency":"USD","group_by":"episode","hours_per_day":10,"steps":[{"id":"comp","name":"Compositing","day_rate":650,"days":42,"cost":27300}],"shots":[{"object":"bid_shot","id":"b1","code":"NB101_010","description":"Sky replacement","status":"awarded","complexity":"medium","frames":96,"days":{"comp":3,"roto":2},"total_days":5,"cost":3050}],"assets":[],"counts":{"bid":0,"awarded":10,"omit":0},"total":61200}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/shows/{showId}/external_ids":{"post":{"operationId":"link-ids","tags":["Linking ids"],"summary":"Link items to your ids","description":"Tie shots, tasks, notes and episodes to their ids in ShotGrid, ftrack or your own tools, up to 1,000 at a time. Find each item by our id, by code (shots, episodes), or by shot_code and step_id (tasks). The link then shows in external_ids, and you can look items up with external_source and external_id. Send external_id null to remove a link. Only the links change; the items themselves don't. Needs edit access to the show.\n\nNeeds the `tracker:write` permission.","requestBody":{"required":true,"content":{"application/json":{"example":{"links":[{"entity":"shot","code":"NB101_010","source":"shotgrid","external_id":"1234"},{"entity":"task","shot_code":"NB101_010","step_id":"comp","source":"shotgrid","external_id":"56789"},{"entity":"episode","code":"NB101","source":"shotgrid","external_id":"88"}]}}}},"parameters":[{"name":"showId","in":"path","required":true,"description":"The show's id, from GET /shows.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"object":"list","data":[{"index":0,"ok":true,"entity":"shot","id":"cm3shot0001","source":"shotgrid","external_id":"1234"},{"index":1,"ok":false,"entity":"task","error":"not_found"}],"linked":1,"not_found":1}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/webhooks":{"get":{"operationId":"list-webhooks","tags":["Change alerts"],"summary":"List webhooks","description":"Webhooks belonging to the key's owner.\n\nNeeds the `webhooks:manage` permission.","parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"object":"list","data":[{"object":"webhook","id":"cm3hook01","url":"https://pipeline.example.com/pictureflow","description":"Slack #vfx-status","show_id":null,"events":["shot.status_changed","note.created"],"active":true,"disabled_reason":null}],"has_more":false,"next_cursor":null}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"create-webhook","tags":["Change alerts"],"summary":"Add a webhook","description":"PictureFlow will POST matching events to this https URL. events takes exact types, patterns like shot.* or * for everything. Leave show_id out for every show you're on the team of. The signing secret is only returned here, so store it.\n\nNeeds the `webhooks:manage` permission.","requestBody":{"required":true,"content":{"application/json":{"example":{"url":"https://pipeline.example.com/pictureflow","events":["shot.status_changed","task.status_changed","note.created"],"show_id":"cm3show0001","description":"Slack #vfx-status"}}}},"parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"object":"webhook","id":"cm3hook01","url":"https://pipeline.example.com/pictureflow","description":"Slack #vfx-status","show_id":null,"events":["shot.status_changed","note.created"],"active":true,"disabled_reason":null,"secret":"whsec_…"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/webhooks/{webhookId}":{"get":{"operationId":"get-webhook","tags":["Change alerts"],"summary":"Get a webhook","description":"Needs the `webhooks:manage` permission.","parameters":[{"name":"webhookId","in":"path","required":true,"description":"The webhook's id.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"object":"webhook","id":"cm3hook01","url":"https://pipeline.example.com/pictureflow","description":"Slack #vfx-status","show_id":null,"events":["shot.status_changed","note.created"],"active":true,"disabled_reason":null}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"update-webhook","tags":["Change alerts"],"summary":"Change a webhook","description":"Change its URL, events or description, or turn it off and on. Turning it back on clears a switch-off after repeated failures.\n\nNeeds the `webhooks:manage` permission.","requestBody":{"required":true,"content":{"application/json":{"example":{"events":["*"],"active":true}}}},"parameters":[{"name":"webhookId","in":"path","required":true,"description":"The webhook's id.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"object":"webhook","id":"cm3hook01","url":"https://pipeline.example.com/pictureflow","description":"Slack #vfx-status","show_id":null,"events":["shot.status_changed","note.created"],"active":true,"disabled_reason":null}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"delete-webhook","tags":["Change alerts"],"summary":"Delete a webhook","description":"Needs the `webhooks:manage` permission.","parameters":[{"name":"webhookId","in":"path","required":true,"description":"The webhook's id.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"object":"webhook","id":"cm3hook01","deleted":true}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/webhooks/{webhookId}/rotate_secret":{"post":{"operationId":"rotate-secret","tags":["Change alerts"],"summary":"Get a new signing secret","description":"The old secret stops working straight away.\n\nNeeds the `webhooks:manage` permission.","parameters":[{"name":"webhookId","in":"path","required":true,"description":"The webhook's id.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"object":"webhook","id":"cm3hook01","url":"https://pipeline.example.com/pictureflow","description":"Slack #vfx-status","show_id":null,"events":["shot.status_changed","note.created"],"active":true,"disabled_reason":null,"secret":"whsec_…"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/webhooks/{webhookId}/test":{"post":{"operationId":"test-webhook","tags":["Change alerts"],"summary":"Send a test","description":"Sends a ping event now and tells you what your server answered.\n\nNeeds the `webhooks:manage` permission.","parameters":[{"name":"webhookId","in":"path","required":true,"description":"The webhook's id.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"object":"webhook_delivery","id":"cm3del01","event_type":"ping","status":"ok","attempts":1,"response_status":200,"error":null}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/webhooks/{webhookId}/deliveries":{"get":{"operationId":"list-deliveries","tags":["Change alerts"],"summary":"List deliveries","description":"Recent deliveries, newest first: sent, retrying (with when) or failed.\n\nNeeds the `webhooks:manage` permission.","parameters":[{"name":"webhookId","in":"path","required":true,"description":"The webhook's id.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Items per page, 1–500. Default 100.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"object":"list","data":[{"object":"webhook_delivery","id":"cm3del01","event_id":"cm3evt01","event_type":"shot.status_changed","status":"failed","attempts":2,"response_status":503,"error":"Your server answered 503.","next_attempt_at":"2026-11-05T09:42:00.000Z"}]}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/webhooks/{webhookId}/deliveries/{deliveryId}/retry":{"post":{"operationId":"retry-delivery","tags":["Change alerts"],"summary":"Send a delivery again","description":"Needs the `webhooks:manage` permission.","parameters":[{"name":"webhookId","in":"path","required":true,"description":"The webhook's id.","schema":{"type":"string"}},{"name":"deliveryId","in":"path","required":true,"description":"The delivery's id.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"object":"webhook_delivery","id":"cm3del01","status":"ok"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/events":{"get":{"operationId":"list-events","tags":["Change alerts"],"summary":"Read the change feed","description":"Every event on the shows you're on the team of, oldest first, kept 30 days. For studios that can't receive webhooks through their firewall: poll with after set to the last seq you read.\n\nNeeds the `webhooks:manage` permission.","parameters":[{"name":"after","in":"query","required":false,"description":"The seq of the last event you read.","schema":{"type":"string"}},{"name":"show_id","in":"query","required":false,"description":"Only this show.","schema":{"type":"string"}},{"name":"types","in":"query","required":false,"description":"Only these event types, comma separated.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Items per page, 1–500. Default 100.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"object":"list","data":[{"object":"event","id":"cm3evt01","seq":1042,"type":"shot.status_changed","show_id":"cm3show0001","actor":{"name":"Sam Lee","source":"ui"},"data":{"object":{"object":"shot","code":"NB101_010","status":"crv"},"previous":{"status":"int"}},"created_at":"2026-11-05T09:12:40.000Z"}],"has_more":false,"last_seq":1042}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"An API key from Settings › API keys, starting pf_live_."}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"type":{"type":"string","enum":["invalid_request","authentication","plan_required","permission","not_found","conflict","rate_limited","server_error"]},"code":{"type":"string"},"message":{"type":"string"},"param":{"type":"string"},"request_id":{"type":"string"}}}}}}}}