{"openapi":"3.1.0","info":{"title":"dsigns API","version":"1.0.0","description":"Customer-scoped signage automation. Customer credentials are limited to their own customer. Master credentials must select a customer explicitly. Write outcomes are retained in Activity; reuse the same Idempotency-Key after a transport failure. Pending outcomes require reconciliation rather than a new key."},"servers":[{"url":"https://dsigns.bitprecision.com/api/v1"}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"API key from Settings → Integrations → MCP & API. Permissions: players:read, content:read, media:write, playlists:write, schedules:write, publish, control, control:advanced, players:write, players:delete, sites:write, groups:write, layouts:write, content:delete, customers:write, workspace:write, integrations:read, integrations:write, social:read, social:write, account:read, account:write, billing:write"}}},"paths":{"/players":{"get":{"description":"List up to 100 customer records. Use limit (default 50) and cursor. nextCursor is null on the last page.","security":[{"bearerAuth":[]}],"x-required-scope":"players:read","parameters":[{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"cursor","in":"query","schema":{"type":"string","pattern":"^[a-zA-Z0-9_-]{1,64}$"}}],"responses":{"200":{"description":"Result. Acceptance does not prove physical playback.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing, expired or revoked credential"},"403":{"description":"Missing scope"},"404":{"description":"Not found in this customer"},"409":{"description":"Conflict, changed draft or pending duplicate"},"429":{"description":"Rate limit: respect Retry-After"},"503":{"description":"Service unavailable; reconcile pending writes before using another key"}}}},"/players/{id}":{"get":{"description":"Read one customer record. Playlist/schedule responses include etag for draft updates.","security":[{"bearerAuth":[]}],"x-required-scope":"players:read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-zA-Z0-9_-]{1,64}$"}}],"responses":{"200":{"description":"Result. Acceptance does not prove physical playback.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing, expired or revoked credential"},"403":{"description":"Missing scope"},"404":{"description":"Not found in this customer"},"409":{"description":"Conflict, changed draft or pending duplicate"},"429":{"description":"Rate limit: respect Retry-After"},"503":{"description":"Service unavailable; reconcile pending writes before using another key"}}}},"/media":{"get":{"description":"List up to 100 customer records. Use limit (default 50) and cursor. nextCursor is null on the last page.","security":[{"bearerAuth":[]}],"x-required-scope":"content:read","parameters":[{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"cursor","in":"query","schema":{"type":"string","pattern":"^[a-zA-Z0-9_-]{1,64}$"}}],"responses":{"200":{"description":"Result. Acceptance does not prove physical playback.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing, expired or revoked credential"},"403":{"description":"Missing scope"},"404":{"description":"Not found in this customer"},"409":{"description":"Conflict, changed draft or pending duplicate"},"429":{"description":"Rate limit: respect Retry-After"},"503":{"description":"Service unavailable; reconcile pending writes before using another key"}}}},"/media/{id}":{"get":{"description":"Read one customer record. Playlist/schedule responses include etag for draft updates.","security":[{"bearerAuth":[]}],"x-required-scope":"content:read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-zA-Z0-9_-]{1,64}$"}}],"responses":{"200":{"description":"Result. Acceptance does not prove physical playback.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing, expired or revoked credential"},"403":{"description":"Missing scope"},"404":{"description":"Not found in this customer"},"409":{"description":"Conflict, changed draft or pending duplicate"},"429":{"description":"Rate limit: respect Retry-After"},"503":{"description":"Service unavailable; reconcile pending writes before using another key"}}}},"/playlists":{"get":{"description":"List up to 100 customer records. Use limit (default 50) and cursor. nextCursor is null on the last page.","security":[{"bearerAuth":[]}],"x-required-scope":"content:read","parameters":[{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"cursor","in":"query","schema":{"type":"string","pattern":"^[a-zA-Z0-9_-]{1,64}$"}}],"responses":{"200":{"description":"Result. Acceptance does not prove physical playback.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing, expired or revoked credential"},"403":{"description":"Missing scope"},"404":{"description":"Not found in this customer"},"409":{"description":"Conflict, changed draft or pending duplicate"},"429":{"description":"Rate limit: respect Retry-After"},"503":{"description":"Service unavailable; reconcile pending writes before using another key"}}},"post":{"description":"Create a draft. items use mediaId/duration; slots use weekday/start/end/startDate/endDate/playlistId. Does not publish.","security":[{"bearerAuth":[]}],"x-required-scope":"playlists:write","parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":1,"maxLength":120}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"expectedETag":{"type":"string"},"shuffle":{"type":"boolean","description":"Play each item once in random order, then reshuffle. Omission preserves an existing setting."},"items":{"type":"array","items":{"type":"object","additionalProperties":true}}},"required":["name","items"],"additionalProperties":false}}}},"responses":{"200":{"description":"Result. Acceptance does not prove physical playback.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing, expired or revoked credential"},"403":{"description":"Missing scope"},"404":{"description":"Not found in this customer"},"409":{"description":"Conflict, changed draft or pending duplicate"},"429":{"description":"Rate limit: respect Retry-After"},"503":{"description":"Service unavailable; reconcile pending writes before using another key"}}}},"/playlists/{id}":{"get":{"description":"Read one customer record. Playlist/schedule responses include etag for draft updates.","security":[{"bearerAuth":[]}],"x-required-scope":"content:read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-zA-Z0-9_-]{1,64}$"}}],"responses":{"200":{"description":"Result. Acceptance does not prove physical playback.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing, expired or revoked credential"},"403":{"description":"Missing scope"},"404":{"description":"Not found in this customer"},"409":{"description":"Conflict, changed draft or pending duplicate"},"429":{"description":"Rate limit: respect Retry-After"},"503":{"description":"Service unavailable; reconcile pending writes before using another key"}}},"put":{"description":"Replace a draft using expectedETag from its latest GET. Also requires content:read.","security":[{"bearerAuth":[]}],"x-required-scope":"playlists:write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-zA-Z0-9_-]{1,64}$"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":1,"maxLength":120}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"expectedETag":{"type":"string"},"shuffle":{"type":"boolean","description":"Play each item once in random order, then reshuffle. Omission preserves an existing setting."},"items":{"type":"array","items":{"type":"object","additionalProperties":true}}},"required":["name","expectedETag","items"],"additionalProperties":false}}}},"responses":{"200":{"description":"Result. Acceptance does not prove physical playback.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing, expired or revoked credential"},"403":{"description":"Missing scope"},"404":{"description":"Not found in this customer"},"409":{"description":"Conflict, changed draft or pending duplicate"},"429":{"description":"Rate limit: respect Retry-After"},"503":{"description":"Service unavailable; reconcile pending writes before using another key"}}}},"/schedules":{"get":{"description":"List up to 100 customer records. Use limit (default 50) and cursor. nextCursor is null on the last page.","security":[{"bearerAuth":[]}],"x-required-scope":"content:read","parameters":[{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"cursor","in":"query","schema":{"type":"string","pattern":"^[a-zA-Z0-9_-]{1,64}$"}}],"responses":{"200":{"description":"Result. Acceptance does not prove physical playback.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing, expired or revoked credential"},"403":{"description":"Missing scope"},"404":{"description":"Not found in this customer"},"409":{"description":"Conflict, changed draft or pending duplicate"},"429":{"description":"Rate limit: respect Retry-After"},"503":{"description":"Service unavailable; reconcile pending writes before using another key"}}},"post":{"description":"Create a draft. items use mediaId/duration; slots use weekday/start/end/startDate/endDate/playlistId. Does not publish.","security":[{"bearerAuth":[]}],"x-required-scope":"schedules:write","parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":1,"maxLength":120}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"expectedETag":{"type":"string"},"slots":{"type":"array","items":{"type":"object","additionalProperties":true}}},"required":["name","slots"],"additionalProperties":false}}}},"responses":{"200":{"description":"Result. Acceptance does not prove physical playback.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing, expired or revoked credential"},"403":{"description":"Missing scope"},"404":{"description":"Not found in this customer"},"409":{"description":"Conflict, changed draft or pending duplicate"},"429":{"description":"Rate limit: respect Retry-After"},"503":{"description":"Service unavailable; reconcile pending writes before using another key"}}}},"/schedules/{id}":{"get":{"description":"Read one customer record. Playlist/schedule responses include etag for draft updates.","security":[{"bearerAuth":[]}],"x-required-scope":"content:read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-zA-Z0-9_-]{1,64}$"}}],"responses":{"200":{"description":"Result. Acceptance does not prove physical playback.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing, expired or revoked credential"},"403":{"description":"Missing scope"},"404":{"description":"Not found in this customer"},"409":{"description":"Conflict, changed draft or pending duplicate"},"429":{"description":"Rate limit: respect Retry-After"},"503":{"description":"Service unavailable; reconcile pending writes before using another key"}}},"put":{"description":"Replace a draft using expectedETag from its latest GET. Also requires content:read.","security":[{"bearerAuth":[]}],"x-required-scope":"schedules:write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-zA-Z0-9_-]{1,64}$"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":1,"maxLength":120}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"expectedETag":{"type":"string"},"slots":{"type":"array","items":{"type":"object","additionalProperties":true}}},"required":["name","expectedETag","slots"],"additionalProperties":false}}}},"responses":{"200":{"description":"Result. Acceptance does not prove physical playback.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing, expired or revoked credential"},"403":{"description":"Missing scope"},"404":{"description":"Not found in this customer"},"409":{"description":"Conflict, changed draft or pending duplicate"},"429":{"description":"Rate limit: respect Retry-After"},"503":{"description":"Service unavailable; reconcile pending writes before using another key"}}}},"/players/{id}/commands":{"post":{"description":"Queue an existing player command. Expires after five minutes.","security":[{"bearerAuth":[]}],"x-required-scope":"control","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-zA-Z0-9_-]{1,64}$"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":1,"maxLength":120}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"action":{"enum":["sync","maintenance","retry_media"]},"minutes":{"type":"number","minimum":0,"maximum":1440},"mediaId":{"type":"string","pattern":"^[a-zA-Z0-9_-]{1,64}$"}},"required":["action"],"additionalProperties":false}}}},"responses":{"200":{"description":"Result. Acceptance does not prove physical playback.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing, expired or revoked credential"},"403":{"description":"Missing scope"},"404":{"description":"Not found in this customer"},"409":{"description":"Conflict, changed draft or pending duplicate"},"429":{"description":"Rate limit: respect Retry-After"},"503":{"description":"Service unavailable; reconcile pending writes before using another key"}}}},"/commands/{id}":{"get":{"description":"Read a queued command and reported result.","security":[{"bearerAuth":[]}],"x-required-scope":"players:read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-zA-Z0-9_-]{1,64}$"}}],"responses":{"200":{"description":"Result. Acceptance does not prove physical playback.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing, expired or revoked credential"},"403":{"description":"Missing scope"},"404":{"description":"Not found in this customer"},"409":{"description":"Conflict, changed draft or pending duplicate"},"429":{"description":"Rate limit: respect Retry-After"},"503":{"description":"Service unavailable; reconcile pending writes before using another key"}}}},"/players/{id}/publication-preview":{"post":{"description":"Return the complete proposed manifest, including ALL assigned drafts, and a ten-minute previewId.","security":[{"bearerAuth":[]}],"x-required-scope":"publish","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-zA-Z0-9_-]{1,64}$"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":1,"maxLength":120}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{},"required":[],"additionalProperties":false}}}},"responses":{"200":{"description":"Result. Acceptance does not prove physical playback.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing, expired or revoked credential"},"403":{"description":"Missing scope"},"404":{"description":"Not found in this customer"},"409":{"description":"Conflict, changed draft or pending duplicate"},"429":{"description":"Rate limit: respect Retry-After"},"503":{"description":"Service unavailable; reconcile pending writes before using another key"}}}},"/players/{id}/publish":{"post":{"description":"Publish the approved preview only if drafts and the existing publication remain unchanged.","security":[{"bearerAuth":[]}],"x-required-scope":"publish","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-zA-Z0-9_-]{1,64}$"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":1,"maxLength":120}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"previewId":{"type":"string","pattern":"^[a-zA-Z0-9_-]{1,64}$"}},"required":["previewId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Result. Acceptance does not prove physical playback.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing, expired or revoked credential"},"403":{"description":"Missing scope"},"404":{"description":"Not found in this customer"},"409":{"description":"Conflict, changed draft or pending duplicate"},"429":{"description":"Rate limit: respect Retry-After"},"503":{"description":"Service unavailable; reconcile pending writes before using another key"}}}},"/brand":{"get":{"description":"Read the selected customer brand, current revision, CSS variables and uploaded font metadata. Master calls require customerId.","security":[{"bearerAuth":[]}],"x-required-scope":"content:read","parameters":[],"responses":{"200":{"description":"Result. Acceptance does not prove physical playback.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing, expired or revoked credential"},"403":{"description":"Missing scope"},"404":{"description":"Not found in this customer"},"409":{"description":"Conflict, changed draft or pending duplicate"},"429":{"description":"Rate limit: respect Retry-After"},"503":{"description":"Service unavailable; reconcile pending writes before using another key"}}},"put":{"description":"Save the customer brand with optimistic revision checking. The issuing user must remain an owner or master. Existing designs are unchanged.","security":[{"bearerAuth":[]}],"x-required-scope":"account:write","parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":1,"maxLength":120}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"profile":{"type":"object","description":"Use the profile schema from save_brand_profile in /mcp-reference.json."},"revision":{"type":"integer","minimum":0}},"required":["profile","revision"],"additionalProperties":false}}}},"responses":{"200":{"description":"Result. Acceptance does not prove physical playback.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing, expired or revoked credential"},"403":{"description":"Missing scope"},"404":{"description":"Not found in this customer"},"409":{"description":"Conflict, changed draft or pending duplicate"},"429":{"description":"Rate limit: respect Retry-After"},"503":{"description":"Service unavailable; reconcile pending writes before using another key"}}}},"/brand/fonts":{"post":{"description":"Upload a licensed WOFF2 source for AI-rendered artwork/video. Maximum 128 KiB; eight files per customer.","security":[{"bearerAuth":[]}],"x-required-scope":"account:write","parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":1,"maxLength":120}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"base64":{"type":"string"},"licensed":{"const":true}},"required":["name","base64","licensed"],"additionalProperties":false}}}},"responses":{"200":{"description":"Result. Acceptance does not prove physical playback.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing, expired or revoked credential"},"403":{"description":"Missing scope"},"404":{"description":"Not found in this customer"},"409":{"description":"Conflict, changed draft or pending duplicate"},"429":{"description":"Rate limit: respect Retry-After"},"503":{"description":"Service unavailable; reconcile pending writes before using another key"}}}},"/brand/fonts/{id}":{"get":{"description":"Read a customer-owned font source as base64 with SHA-256.","security":[{"bearerAuth":[]}],"x-required-scope":"content:read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-zA-Z0-9_-]{1,64}$"}}],"responses":{"200":{"description":"Result. Acceptance does not prove physical playback.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing, expired or revoked credential"},"403":{"description":"Missing scope"},"404":{"description":"Not found in this customer"},"409":{"description":"Conflict, changed draft or pending duplicate"},"429":{"description":"Rate limit: respect Retry-After"},"503":{"description":"Service unavailable; reconcile pending writes before using another key"}}},"delete":{"description":"Remove a customer-owned font source. Rendered media is unchanged.","security":[{"bearerAuth":[]}],"x-required-scope":"account:write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-zA-Z0-9_-]{1,64}$"}}],"responses":{"200":{"description":"Result. Acceptance does not prove physical playback.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing, expired or revoked credential"},"403":{"description":"Missing scope"},"404":{"description":"Not found in this customer"},"409":{"description":"Conflict, changed draft or pending duplicate"},"429":{"description":"Rate limit: respect Retry-After"},"503":{"description":"Service unavailable; reconcile pending writes before using another key"}}}},"/uploads":{"post":{"description":"Initiate an upload; response supplies id, chunkSize and partCount.","security":[{"bearerAuth":[]}],"x-required-scope":"media:write","parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":1,"maxLength":120}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"mime":{"type":"string"},"size":{"type":"integer","minimum":1}},"required":["name","mime","size"],"additionalProperties":false}}}},"responses":{"200":{"description":"Result. Acceptance does not prove physical playback.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing, expired or revoked credential"},"403":{"description":"Missing scope"},"404":{"description":"Not found in this customer"},"409":{"description":"Conflict, changed draft or pending duplicate"},"429":{"description":"Rate limit: respect Retry-After"},"503":{"description":"Service unavailable; reconcile pending writes before using another key"}}}},"/uploads/{id}":{"get":{"description":"Read accepted parts to resume upload.","security":[{"bearerAuth":[]}],"x-required-scope":"media:write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-zA-Z0-9_-]{1,64}$"}}],"responses":{"200":{"description":"Result. Acceptance does not prove physical playback.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing, expired or revoked credential"},"403":{"description":"Missing scope"},"404":{"description":"Not found in this customer"},"409":{"description":"Conflict, changed draft or pending duplicate"},"429":{"description":"Rate limit: respect Retry-After"},"503":{"description":"Service unavailable; reconcile pending writes before using another key"}}}},"/uploads/{id}/parts/{part}":{"put":{"description":"Upload exactly the requested part size. Repeated identical bytes are safe.","security":[{"bearerAuth":[]}],"x-required-scope":"media:write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-zA-Z0-9_-]{1,64}$"}},{"name":"part","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-zA-Z0-9_-]{1,64}$"}}],"requestBody":{"required":true,"content":{"application/octet-stream":{"schema":{"type":"string","format":"binary"}}}},"responses":{"200":{"description":"Result. Acceptance does not prove physical playback.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing, expired or revoked credential"},"403":{"description":"Missing scope"},"404":{"description":"Not found in this customer"},"409":{"description":"Conflict, changed draft or pending duplicate"},"429":{"description":"Rate limit: respect Retry-After"},"503":{"description":"Service unavailable; reconcile pending writes before using another key"}}}},"/uploads/{id}/complete":{"post":{"description":"Validate all parts, inspect the media container and save media. Repeated completion returns the same media ID.","security":[{"bearerAuth":[]}],"x-required-scope":"media:write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-zA-Z0-9_-]{1,64}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{},"required":[],"additionalProperties":false}}}},"responses":{"200":{"description":"Result. Acceptance does not prove physical playback.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing, expired or revoked credential"},"403":{"description":"Missing scope"},"404":{"description":"Not found in this customer"},"409":{"description":"Conflict, changed draft or pending duplicate"},"429":{"description":"Rate limit: respect Retry-After"},"503":{"description":"Service unavailable; reconcile pending writes before using another key"}}}},"/screen-actions":{"get":{"description":"List up to 100 recent temporary actions.","security":[{"bearerAuth":[]}],"x-required-scope":"content:read","parameters":[],"responses":{"200":{"description":"Result. Acceptance does not prove physical playback.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing, expired or revoked credential"},"403":{"description":"Missing scope"},"404":{"description":"Not found in this customer"},"409":{"description":"Conflict, changed draft or pending duplicate"},"429":{"description":"Rate limit: respect Retry-After"},"503":{"description":"Service unavailable; reconcile pending writes before using another key"}}},"post":{"description":"Create and publish a temporary action on one to 20 already published screens.","security":[{"bearerAuth":[]}],"x-required-scope":"publish","parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":1,"maxLength":120}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"mediaId":{"type":"string","pattern":"^[a-zA-Z0-9_-]{1,64}$"},"outputIds":{"type":"array","minItems":1,"maxItems":20,"items":{"type":"string","pattern":"^[a-zA-Z0-9_-]{1,64}$"}},"mode":{"enum":["replace","append"]},"duration":{"type":"number","minimum":1,"maximum":86400},"schedule":{"type":"object","description":"timing: today, duration (minutes 1–1440), or weekly (startDate, endDate, weekdays 0–6, start/end HH:MM). Times use each published screen timezone.","additionalProperties":true}},"required":["mediaId","outputIds","mode","schedule"],"additionalProperties":false}}}},"responses":{"200":{"description":"Result. Acceptance does not prove physical playback.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing, expired or revoked credential"},"403":{"description":"Missing scope"},"404":{"description":"Not found in this customer"},"409":{"description":"Conflict, changed draft or pending duplicate"},"429":{"description":"Rate limit: respect Retry-After"},"503":{"description":"Service unavailable; reconcile pending writes before using another key"}}}},"/screen-actions/{id}/cancel":{"post":{"description":"Cancel a temporary action and publish restoration.","security":[{"bearerAuth":[]}],"x-required-scope":"publish","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-zA-Z0-9_-]{1,64}$"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":1,"maxLength":120}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{},"required":[],"additionalProperties":false}}}},"responses":{"200":{"description":"Result. Acceptance does not prove physical playback.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing, expired or revoked credential"},"403":{"description":"Missing scope"},"404":{"description":"Not found in this customer"},"409":{"description":"Conflict, changed draft or pending duplicate"},"429":{"description":"Rate limit: respect Retry-After"},"503":{"description":"Service unavailable; reconcile pending writes before using another key"}}}}}}