{"openapi":"3.0.0","paths":{"/api/partner/v1/organization":{"get":{"operationId":"partnerV1_organization","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/PartnerOrganizationDto"}}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerErrorEnvelopeDto"}}}},"401":{"description":"Missing or invalid Partner credential","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerErrorEnvelopeDto"}}}},"403":{"description":"Credential is missing the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerErrorEnvelopeDto"}}}},"404":{"description":"Resource not found in the credential organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerErrorEnvelopeDto"}}}},"426":{"description":"HTTPS is required in production","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerErrorEnvelopeDto"}}}},"429":{"description":"Credential or organization quota exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerErrorEnvelopeDto"}}}}},"security":[{"partnerBearer":[]}],"summary":"Get the credential organization","tags":["Partner API v1"],"x-required-scopes":[]}},"/api/partner/v1/screens":{"get":{"operationId":"partnerV1_screens","parameters":[{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"allOf":[{"$ref":"#/components/schemas/Object"}]}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"maximum":100,"default":20,"allOf":[{"$ref":"#/components/schemas/Object"}]}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","required":["data","pagination"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/PartnerScreenDto"}},"pagination":{"$ref":"#/components/schemas/PartnerPaginationDto"}}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerErrorEnvelopeDto"}}}},"401":{"description":"Missing or invalid Partner credential","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerErrorEnvelopeDto"}}}},"403":{"description":"Credential is missing the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerErrorEnvelopeDto"}}}},"404":{"description":"Resource not found in the credential organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerErrorEnvelopeDto"}}}},"426":{"description":"HTTPS is required in production","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerErrorEnvelopeDto"}}}},"429":{"description":"Credential or organization quota exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerErrorEnvelopeDto"}}}}},"security":[{"partnerBearer":[]}],"summary":"List screens","tags":["Partner API v1"],"x-required-scopes":["screens:read"]}},"/api/partner/v1/screens/{screenId}":{"get":{"operationId":"partnerV1_screen","parameters":[{"name":"screenId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/PartnerScreenDto"}}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerErrorEnvelopeDto"}}}},"401":{"description":"Missing or invalid Partner credential","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerErrorEnvelopeDto"}}}},"403":{"description":"Credential is missing the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerErrorEnvelopeDto"}}}},"404":{"description":"Resource not found in the credential organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerErrorEnvelopeDto"}}}},"426":{"description":"HTTPS is required in production","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerErrorEnvelopeDto"}}}},"429":{"description":"Credential or organization quota exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerErrorEnvelopeDto"}}}}},"security":[{"partnerBearer":[]}],"summary":"Get a screen","tags":["Partner API v1"],"x-required-scopes":["screens:read"]}},"/api/partner/v1/screens/{screenId}/configuration":{"get":{"operationId":"partnerV1_screenConfiguration","parameters":[{"name":"screenId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/PartnerConfigurationDto"}}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerErrorEnvelopeDto"}}}},"401":{"description":"Missing or invalid Partner credential","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerErrorEnvelopeDto"}}}},"403":{"description":"Credential is missing the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerErrorEnvelopeDto"}}}},"404":{"description":"Resource not found in the credential organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerErrorEnvelopeDto"}}}},"426":{"description":"HTTPS is required in production","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerErrorEnvelopeDto"}}}},"429":{"description":"Credential or organization quota exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerErrorEnvelopeDto"}}}}},"security":[{"partnerBearer":[]}],"summary":"Get effective, allowlisted playback configuration","tags":["Partner API v1"],"x-required-scopes":["playback:read"]}},"/api/partner/v1/playlists":{"get":{"operationId":"partnerV1_playlists","parameters":[{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"allOf":[{"$ref":"#/components/schemas/Object"}]}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"maximum":100,"default":20,"allOf":[{"$ref":"#/components/schemas/Object"}]}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","required":["data","pagination"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/PartnerPlaylistDto"}},"pagination":{"$ref":"#/components/schemas/PartnerPaginationDto"}}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerErrorEnvelopeDto"}}}},"401":{"description":"Missing or invalid Partner credential","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerErrorEnvelopeDto"}}}},"403":{"description":"Credential is missing the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerErrorEnvelopeDto"}}}},"404":{"description":"Resource not found in the credential organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerErrorEnvelopeDto"}}}},"426":{"description":"HTTPS is required in production","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerErrorEnvelopeDto"}}}},"429":{"description":"Credential or organization quota exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerErrorEnvelopeDto"}}}}},"security":[{"partnerBearer":[]}],"summary":"List playlists","tags":["Partner API v1"],"x-required-scopes":["playlists:read"]}},"/api/partner/v1/playlists/{playlistId}":{"get":{"operationId":"partnerV1_playlist","parameters":[{"name":"playlistId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/PartnerPlaylistDto"}}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerErrorEnvelopeDto"}}}},"401":{"description":"Missing or invalid Partner credential","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerErrorEnvelopeDto"}}}},"403":{"description":"Credential is missing the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerErrorEnvelopeDto"}}}},"404":{"description":"Resource not found in the credential organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerErrorEnvelopeDto"}}}},"426":{"description":"HTTPS is required in production","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerErrorEnvelopeDto"}}}},"429":{"description":"Credential or organization quota exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerErrorEnvelopeDto"}}}}},"security":[{"partnerBearer":[]}],"summary":"Get a playlist","tags":["Partner API v1"],"x-required-scopes":["playlists:read"]}},"/api/partner/v1/playlists/{playlistId}/items":{"get":{"operationId":"partnerV1_playlistItems","parameters":[{"name":"playlistId","required":true,"in":"path","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"allOf":[{"$ref":"#/components/schemas/Object"}]}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"maximum":100,"default":20,"allOf":[{"$ref":"#/components/schemas/Object"}]}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","required":["data","pagination"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/PartnerPlaylistItemDto"}},"pagination":{"$ref":"#/components/schemas/PartnerPaginationDto"}}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerErrorEnvelopeDto"}}}},"401":{"description":"Missing or invalid Partner credential","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerErrorEnvelopeDto"}}}},"403":{"description":"Credential is missing the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerErrorEnvelopeDto"}}}},"404":{"description":"Resource not found in the credential organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerErrorEnvelopeDto"}}}},"426":{"description":"HTTPS is required in production","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerErrorEnvelopeDto"}}}},"429":{"description":"Credential or organization quota exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerErrorEnvelopeDto"}}}}},"security":[{"partnerBearer":[]}],"summary":"List ordered playlist items","tags":["Partner API v1"],"x-required-scopes":["playlists:read"]}},"/api/partner/v1/media":{"get":{"operationId":"partnerV1_media","parameters":[{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"allOf":[{"$ref":"#/components/schemas/Object"}]}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"maximum":100,"default":20,"allOf":[{"$ref":"#/components/schemas/Object"}]}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","required":["data","pagination"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/PartnerMediaDto"}},"pagination":{"$ref":"#/components/schemas/PartnerPaginationDto"}}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerErrorEnvelopeDto"}}}},"401":{"description":"Missing or invalid Partner credential","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerErrorEnvelopeDto"}}}},"403":{"description":"Credential is missing the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerErrorEnvelopeDto"}}}},"404":{"description":"Resource not found in the credential organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerErrorEnvelopeDto"}}}},"426":{"description":"HTTPS is required in production","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerErrorEnvelopeDto"}}}},"429":{"description":"Credential or organization quota exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerErrorEnvelopeDto"}}}}},"security":[{"partnerBearer":[]}],"summary":"List media files","tags":["Partner API v1"],"x-required-scopes":["media:read"]}},"/api/partner/v1/media/{mediaId}":{"get":{"operationId":"partnerV1_mediaItem","parameters":[{"name":"mediaId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/PartnerMediaDto"}}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerErrorEnvelopeDto"}}}},"401":{"description":"Missing or invalid Partner credential","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerErrorEnvelopeDto"}}}},"403":{"description":"Credential is missing the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerErrorEnvelopeDto"}}}},"404":{"description":"Resource not found in the credential organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerErrorEnvelopeDto"}}}},"426":{"description":"HTTPS is required in production","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerErrorEnvelopeDto"}}}},"429":{"description":"Credential or organization quota exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerErrorEnvelopeDto"}}}}},"security":[{"partnerBearer":[]}],"summary":"Get a media file","tags":["Partner API v1"],"x-required-scopes":["media:read"]}}},"info":{"title":"SignageWall Partner API","description":"Stable read-only API for server-to-server SignageWall integrations. Success responses use `{ data }`; collections also include `pagination`. Media URLs are opaque locations and must not be parsed for storage details.","version":"1.0.0","contact":{}},"tags":[],"servers":[],"components":{"securitySchemes":{"partnerBearer":{"scheme":"bearer","bearerFormat":"Partner credential","type":"http","description":"Use the Partner credential returned once by the CMS."}},"schemas":{"PartnerOrganizationDto":{"type":"object","properties":{"id":{"type":"string","example":"64c13f98e55f819b2c09f001"},"name":{"type":"string","example":"Example Organization"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","name","createdAt","updatedAt"]},"PartnerErrorBodyDto":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string"},"details":{"type":"object"}},"required":["code","message","requestId"]},"PartnerErrorEnvelopeDto":{"type":"object","properties":{"error":{"$ref":"#/components/schemas/PartnerErrorBodyDto"}},"required":["error"]},"PartnerViewportDto":{"type":"object","properties":{"width":{"type":"number","minimum":1},"height":{"type":"number","minimum":1}},"required":["width","height"]},"PartnerWeeklyWindowDto":{"type":"object","properties":{"day":{"type":"string","enum":["monday","tuesday","wednesday","thursday","friday","saturday","sunday"]},"start":{"type":"string","example":"09:00"},"end":{"type":"string","example":"17:00"}},"required":["day","start","end"]},"PartnerSpecialWindowDto":{"type":"object","properties":{"startDate":{"type":"string","example":"2026-09-01"},"endDate":{"type":"string","example":"2026-09-07"},"start":{"type":"string","example":"09:00"},"end":{"type":"string","example":"17:00"}},"required":["startDate","endDate","start","end"]},"PartnerAvailabilityDto":{"type":"object","properties":{"mode":{"enum":["always","weekly","special"],"type":"string"},"timezone":{"type":"string","example":"Europe/Belgrade"},"isOnNow":{"type":"boolean","description":"Effective state at the response resolvedAt time."},"weekly":{"type":"array","items":{"$ref":"#/components/schemas/PartnerWeeklyWindowDto"}},"special":{"$ref":"#/components/schemas/PartnerSpecialWindowDto"}},"required":["mode","timezone","isOnNow"]},"PartnerScreenDto":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"status":{"enum":["online","offline","unpaired"],"type":"string"},"orientation":{"type":"string","enum":["landscape","landscape-flipped","portrait","portrait-flipped"]},"viewport":{"$ref":"#/components/schemas/PartnerViewportDto"},"availability":{"$ref":"#/components/schemas/PartnerAvailabilityDto"},"itemCount":{"type":"number"},"totalDurationSeconds":{"type":"number","description":"Total enabled content duration in seconds."},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","name","status","availability","itemCount","totalDurationSeconds","createdAt","updatedAt"]},"PartnerPaginationDto":{"type":"object","properties":{"page":{"type":"number"},"limit":{"type":"number"},"total":{"type":"number"},"totalPages":{"type":"number"}},"required":["page","limit","total","totalPages"]},"Object":{"type":"object","properties":{}},"PartnerPlaybackScreenDto":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"status":{"enum":["online","offline","unpaired"],"type":"string"},"orientation":{"type":"string"},"viewport":{"$ref":"#/components/schemas/PartnerViewportDto"}},"required":["id","name","status"]},"PartnerZonesPresentationDto":{"type":"object","properties":{"mediaFit":{"enum":["cover","contain"],"type":"string"},"backgroundColor":{"type":"string","example":"#000000"},"gapViewportHeightRatio":{"type":"number","minimum":0,"maximum":1},"paddingViewportHeightRatio":{"type":"number","minimum":0,"maximum":1},"cornerRadiusViewportHeightRatio":{"type":"number","minimum":0,"maximum":1}},"required":["mediaFit","backgroundColor","gapViewportHeightRatio","paddingViewportHeightRatio","cornerRadiusViewportHeightRatio"]},"PartnerZonesPanelDto":{"type":"object","properties":{"id":{"type":"string"},"x":{"type":"number","minimum":0,"maximum":1},"y":{"type":"number","minimum":0,"maximum":1},"width":{"type":"number","minimum":0,"maximum":1},"height":{"type":"number","minimum":0,"maximum":1},"items":{"type":"array","items":{"$ref":"#/components/schemas/PartnerPlaybackItemDto"}}},"required":["id","x","y","width","height","items"]},"PartnerZonesLayoutDto":{"type":"object","properties":{"presentation":{"$ref":"#/components/schemas/PartnerZonesPresentationDto"},"panels":{"type":"array","items":{"$ref":"#/components/schemas/PartnerZonesPanelDto"}}},"required":["presentation","panels"]},"PartnerPlaybackItemDto":{"type":"object","properties":{"slotId":{"type":"string"},"type":{"enum":["image","video","app"],"type":"string"},"durationSeconds":{"type":"number"},"mediaId":{"type":"string"},"url":{"type":"string","format":"uri","description":"Opaque playback location."},"mimeType":{"type":"string"},"width":{"type":"number"},"height":{"type":"number"},"appInstanceId":{"type":"string"},"slug":{"type":"string"},"renderingMode":{"enum":["standard","zones","overlay","takeover"],"type":"string"},"layout":{"$ref":"#/components/schemas/PartnerZonesLayoutDto"}},"required":["slotId","type","durationSeconds"]},"PartnerConfigurationDto":{"type":"object","properties":{"resolvedAt":{"type":"string","format":"date-time"},"revision":{"type":"string","description":"Opaque revision of the effective playback state."},"screen":{"$ref":"#/components/schemas/PartnerPlaybackScreenDto"},"availability":{"$ref":"#/components/schemas/PartnerAvailabilityDto"},"items":{"type":"array","items":{"$ref":"#/components/schemas/PartnerPlaybackItemDto"}},"overlays":{"type":"array","items":{"$ref":"#/components/schemas/PartnerPlaybackItemDto"}}},"required":["resolvedAt","revision","screen","availability","items","overlays"]},"PartnerPlaylistDto":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"itemCount":{"type":"number"},"totalDurationSeconds":{"type":"number"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","name","itemCount","totalDurationSeconds","createdAt","updatedAt"]},"PartnerPlaylistItemDto":{"type":"object","properties":{"slotId":{"type":"string"},"type":{"enum":["media","app"],"type":"string"},"position":{"type":"number"},"durationSeconds":{"type":"number"},"enabled":{"type":"boolean"},"mediaId":{"type":"string"},"appInstanceId":{"type":"string"}},"required":["slotId","type","position","durationSeconds","enabled"]},"PartnerMediaDto":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"type":{"enum":["image","video"],"type":"string"},"status":{"enum":["processing","ready","failed"],"type":"string"},"mimeType":{"type":"string"},"sizeBytes":{"type":"number"},"width":{"type":"number"},"height":{"type":"number"},"defaultDurationSeconds":{"type":"number"},"url":{"type":"string","format":"uri","description":"Opaque playback location. Do not infer its storage provider or long-term host."},"thumbnailUrl":{"type":"string","format":"uri","description":"Opaque preview location."},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","name","type","status","createdAt","updatedAt"]}}},"externalDocs":{"description":"Partner API documentation","url":"/api/partner/docs"}}