{"openapi":"3.1.0","info":{"title":"DisplayHub API","version":"1.0.0"},"paths":{"/auth/request-code":{"post":{"tags":["auth"],"summary":"Request Code","operationId":"request_code_auth_request_code_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RequestCodePayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/verify-code":{"post":{"tags":["auth"],"summary":"Verify Code","operationId":"verify_code_auth_verify_code_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyCodePayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/login-password":{"post":{"tags":["auth"],"summary":"Login Password","operationId":"login_password_auth_login_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordLoginPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/me":{"get":{"tags":["auth"],"summary":"Me","operationId":"me_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/auth/logout":{"post":{"tags":["auth"],"summary":"Logout","operationId":"logout_auth_logout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/":{"get":{"summary":"Health","operationId":"health__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/healthz":{"get":{"summary":"Health Check","operationId":"health_check_healthz_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health":{"get":{"summary":"Health Check","operationId":"health_check_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/screen-config/{device_id}":{"get":{"summary":"Read Screen Config","operationId":"read_screen_config_screen_config__device_id__get","parameters":[{"name":"device_id","in":"path","required":true,"schema":{"type":"string","title":"Device Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/device/{device_id}/config":{"get":{"summary":"Read Device Config","operationId":"read_device_config_device__device_id__config_get","parameters":[{"name":"device_id","in":"path","required":true,"schema":{"type":"string","title":"Device Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Update Device Config","operationId":"update_device_config_device__device_id__config_post","parameters":[{"name":"device_id","in":"path","required":true,"schema":{"type":"string","title":"Device Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceConfigPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/device/{device_id}/heartbeat":{"post":{"summary":"Device Heartbeat","operationId":"device_heartbeat_device__device_id__heartbeat_post","parameters":[{"name":"device_id","in":"path","required":true,"schema":{"type":"string","title":"Device Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/DeviceHeartbeatPayload"},{"type":"null"}],"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/devices":{"get":{"summary":"List Admin Devices","operationId":"list_admin_devices_admin_devices_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Create Admin Device","operationId":"create_admin_device_admin_devices_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceCreatePayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/devices/{device_id}/token":{"post":{"summary":"Rotate Admin Device Token","operationId":"rotate_admin_device_token_admin_devices__device_id__token_post","parameters":[{"name":"device_id","in":"path","required":true,"schema":{"type":"string","title":"Device Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/devices/{device_id}/meta":{"put":{"summary":"Update Admin Device Meta","operationId":"update_admin_device_meta_admin_devices__device_id__meta_put","parameters":[{"name":"device_id","in":"path","required":true,"schema":{"type":"string","title":"Device Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceMetaPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/devices/{device_id}/config":{"get":{"summary":"Get Admin Device Config","operationId":"get_admin_device_config_admin_devices__device_id__config_get","parameters":[{"name":"device_id","in":"path","required":true,"schema":{"type":"string","title":"Device Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Save Admin Device Config","operationId":"save_admin_device_config_admin_devices__device_id__config_put","parameters":[{"name":"device_id","in":"path","required":true,"schema":{"type":"string","title":"Device Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceConfigPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/devices/{device_id}/refresh":{"post":{"summary":"Refresh Admin Device","operationId":"refresh_admin_device_admin_devices__device_id__refresh_post","parameters":[{"name":"device_id","in":"path","required":true,"schema":{"type":"string","title":"Device Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/devices/{device_id}/block":{"post":{"summary":"Block Admin Device","operationId":"block_admin_device_admin_devices__device_id__block_post","parameters":[{"name":"device_id","in":"path","required":true,"schema":{"type":"string","title":"Device Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceBlockPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/media":{"get":{"summary":"List Admin Media","operationId":"list_admin_media_admin_media_get","parameters":[{"name":"restaurant_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Restaurant Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Upload Admin Media","operationId":"upload_admin_media_admin_media_post","requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_admin_media_admin_media_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/media/{asset_id}":{"delete":{"summary":"Delete Admin Media","operationId":"delete_admin_media_admin_media__asset_id__delete","parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"integer","title":"Asset Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/.well-known/api-catalog":{"get":{"summary":"Api Catalog","operationId":"api_catalog__well_known_api_catalog_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/docs":{"get":{"summary":"Api Docs","operationId":"api_docs_docs_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}}},"components":{"schemas":{"Body_upload_admin_media_admin_media_post":{"properties":{"restaurant_code":{"type":"string","title":"Restaurant Code"},"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["restaurant_code","file"],"title":"Body_upload_admin_media_admin_media_post"},"DeviceBlockPayload":{"properties":{"blocked":{"type":"boolean","title":"Blocked","default":true},"reason":{"type":"string","title":"Reason","default":"Screen blocked"}},"type":"object","title":"DeviceBlockPayload"},"DeviceConfigPayload":{"properties":{"type":{"type":"string","const":"screen","title":"Type","default":"screen"},"version":{"type":"integer","title":"Version","default":1},"device_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Device Id"},"meta":{"additionalProperties":true,"type":"object","title":"Meta"},"autoplay_ms":{"type":"integer","maximum":120000.0,"minimum":0.0,"title":"Autoplay Ms","default":10000},"advance_step":{"type":"integer","maximum":20.0,"minimum":1.0,"title":"Advance Step","default":1},"background":{"type":"string","title":"Background","default":"#000000"},"playlists":{"additionalProperties":{"items":{"$ref":"#/components/schemas/MediaItem"},"type":"array"},"type":"object","title":"Playlists"},"zones":{"items":{"$ref":"#/components/schemas/ScreenZone"},"type":"array","minItems":1,"title":"Zones"}},"type":"object","required":["zones"],"title":"DeviceConfigPayload"},"DeviceCreatePayload":{"properties":{"device_id":{"type":"string","minLength":1,"title":"Device Id","examples":["pf00001"]},"restaurant_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Restaurant Code","examples":["pf"]},"restaurant_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Restaurant Name","examples":["Pizzeria Fettuccine"]},"screen_name":{"type":"string","title":"Screen Name","default":"main","examples":["main"]}},"type":"object","required":["device_id"],"title":"DeviceCreatePayload"},"DeviceHeartbeatPayload":{"properties":{"status":{"additionalProperties":true,"type":"object","title":"Status"}},"type":"object","title":"DeviceHeartbeatPayload"},"DeviceMetaPayload":{"properties":{"restaurant_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Restaurant Name"},"screen_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Screen Name"}},"type":"object","title":"DeviceMetaPayload"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"MediaItem":{"properties":{"type":{"type":"string","enum":["image","video"],"title":"Type"},"src":{"type":"string","title":"Src"}},"type":"object","required":["type","src"],"title":"MediaItem"},"PasswordLoginPayload":{"properties":{"email":{"type":"string","maxLength":254,"minLength":5,"title":"Email"},"password":{"type":"string","maxLength":256,"minLength":1,"title":"Password"}},"type":"object","required":["email","password"],"title":"PasswordLoginPayload"},"RequestCodePayload":{"properties":{"email":{"type":"string","maxLength":254,"minLength":5,"title":"Email"},"phone":{"type":"string","maxLength":32,"minLength":7,"title":"Phone"},"invite_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Invite Code"}},"type":"object","required":["email","phone"],"title":"RequestCodePayload"},"ScreenZone":{"properties":{"id":{"type":"string","title":"Id"},"kind":{"type":"string","enum":["image","video","playlist"],"title":"Kind"},"layout":{"type":"string","enum":["single","split"],"title":"Layout","default":"single"},"style":{"$ref":"#/components/schemas/ZoneStyle"},"src":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Src"},"playlist":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Playlist"},"items":{"items":{"$ref":"#/components/schemas/MediaItem"},"type":"array","title":"Items"},"index_offset":{"type":"integer","title":"Index Offset","default":0},"loop":{"type":"boolean","title":"Loop","default":true},"muted":{"type":"boolean","title":"Muted","default":true},"advance_on":{"type":"string","enum":["timer","media_end","none"],"title":"Advance On","default":"timer"}},"type":"object","required":["id","kind"],"title":"ScreenZone"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VerifyCodePayload":{"properties":{"challenge_id":{"type":"string","title":"Challenge Id"},"code":{"type":"string","maxLength":12,"minLength":4,"title":"Code"}},"type":"object","required":["challenge_id","code"],"title":"VerifyCodePayload"},"ZoneStyle":{"properties":{"left":{"type":"string","title":"Left","default":"0"},"top":{"type":"string","title":"Top","default":"0"},"width":{"type":"string","title":"Width","default":"100%"},"height":{"type":"string","title":"Height","default":"100%"},"fit":{"type":"string","enum":["cover","contain","fill"],"title":"Fit","default":"cover"},"z_index":{"type":"integer","title":"Z Index","default":1}},"type":"object","title":"ZoneStyle"}}}}