{"openapi":"3.1.0","info":{"title":"Booth.Events API","version":"2026-08-04","x-api-versions":["2026-08-04"],"description":"External customer API for Booth.Events (Pro+). Authenticate with `Authorization: Bearer <api key>` — create keys in the dashboard under Account → Sharing Settings → API Keys. An MCP endpoint for AI agents lives at POST /mcp with the same key. The API is date-versioned: every key is pinned to the version current at its creation, and requests can override with a `Booth-Events-Version` header (see the Versioning section at /v1/docs)."},"servers":[{"url":"https://api.booth.events/v1"}],"security":[{"apiKey":[]}],"paths":{"/events":{"get":{"operationId":"list_events","summary":"List events on the account","description":"Newest first by default. Filter by EXACTLY ONE of: your own idUser key, a name prefix (search), or a date range — combining them returns 400 rather than silently ignoring one. idUser and search results are ordered by that field, not by sort/order. Returns summaries without the settings map — use get_event for the full record.","parameters":[{"name":"limit","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","default":25,"type":"integer","minimum":1,"maximum":100}},{"name":"cursor","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string"}},{"name":"idUser","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","description":"Exact match on your own external key","type":"string","minLength":1},"description":"Exact match on your own external key"},{"name":"search","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","description":"Case-insensitive name prefix","type":"string","minLength":1},"description":"Case-insensitive name prefix"},{"name":"dateFrom","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},{"name":"dateTo","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},{"name":"sort","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","default":"createdDate","type":"string","enum":["createdDate","date"]}},{"name":"order","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","default":"desc","type":"string","enum":["asc","desc"]}}],"x-required-scope":"read","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"date":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO-8601"},"createdDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"modifiedDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"hashtag":{"anyOf":[{"type":"string"},{"type":"null"}]},"notes":{"anyOf":[{"type":"string"},{"type":"null"}]},"idUser":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The customer's own external key for this event"},"colors":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}]},"captureMessage":{"anyOf":[{"type":"string"},{"type":"null"}]},"brandingTextColor":{"anyOf":[{"type":"string"},{"type":"null"}]},"templateIds":{"type":"array","items":{"type":"string"}},"attractScreenId":{"anyOf":[{"type":"string"},{"type":"null"}]},"stickerSetId":{"anyOf":[{"type":"string"},{"type":"null"}]},"paySetId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pay-per-use pricing set; null = pay off"},"galleryId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Gallery id. The gallery's settings (passcode, privacy, sharing) are a separate subresource — get_gallery_settings — deliberately NOT embedded here: they live in a different (regional) database, so embedding would put a cross-database round-trip on the most-called read."}},"required":["id","name","date","createdDate","modifiedDate","hashtag","notes","idUser","colors","captureMessage","brandingTextColor","templateIds","attractScreenId","stickerSetId","paySetId","galleryId"],"additionalProperties":false}},"hasMore":{"type":"boolean"},"nextCursor":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["data","hasMore","nextCursor"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}}},"post":{"operationId":"create_event","summary":"Create an event (also creates its shared gallery)","description":"Consumes plan quota or a purchased event credit, like creating from the dashboard. templateIds must reference templates you own or public ones — use list_templates to find ids. RETRY-SAFE with idUser: set idUser to YOUR system's id for the booking (the CRM correlation key — list_events filters by it); if an event with that idUser already exists, it is returned UNMODIFIED with alreadyExisted:true — other fields sent on the retry are ignored, no duplicate is created, no quota is burned (use update_event to change it). The response can include account-level defaults you did not send (e.g. stickerSetId), matching dashboard creation.","x-required-scope":"read-write","responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"date":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO-8601"},"createdDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"modifiedDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"hashtag":{"anyOf":[{"type":"string"},{"type":"null"}]},"notes":{"anyOf":[{"type":"string"},{"type":"null"}]},"idUser":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The customer's own external key for this event"},"colors":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}]},"captureMessage":{"anyOf":[{"type":"string"},{"type":"null"}]},"brandingTextColor":{"anyOf":[{"type":"string"},{"type":"null"}]},"templateIds":{"type":"array","items":{"type":"string"}},"attractScreenId":{"anyOf":[{"type":"string"},{"type":"null"}]},"stickerSetId":{"anyOf":[{"type":"string"},{"type":"null"}]},"paySetId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pay-per-use pricing set; null = pay off"},"galleryId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Gallery id. The gallery's settings (passcode, privacy, sharing) are a separate subresource — get_gallery_settings — deliberately NOT embedded here: they live in a different (regional) database, so embedding would put a cross-database round-trip on the most-called read."},"settings":{"anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},{"type":"null"}],"description":"The full iOS EventSettings map as stored"},"alreadyExisted":{"type":"boolean","description":"true = an event with this idUser already existed and was returned unchanged"}},"required":["id","name","date","createdDate","modifiedDate","hashtag","notes","idUser","colors","captureMessage","brandingTextColor","templateIds","attractScreenId","stickerSetId","paySetId","galleryId","settings","alreadyExisted"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"date":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"Event date, ISO-8601"},"templateIds":{"minItems":1,"maxItems":50,"type":"array","items":{"type":"string","minLength":1}},"hashtag":{"type":"string","maxLength":100},"notes":{"type":"string","maxLength":5000},"idUser":{"description":"Your own external key for this event","type":"string","maxLength":200},"colors":{"maxItems":10,"type":"array","items":{"type":"string"}},"captureMessage":{"type":"string","maxLength":500},"brandingTextColor":{"type":"string","maxLength":50},"attractScreenId":{"type":"string"},"stickerSetId":{"type":"string"}},"required":["name","date","templateIds"]}}}}}},"/events/{eventId}":{"get":{"operationId":"get_event","summary":"Get one event, including its full settings map","parameters":[{"name":"eventId","in":"path","required":true,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","minLength":1}},{"name":"response_format","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","default":"detailed","description":"'concise' returns settings: null (skip the ~25-key settings map when you only need the summary fields)","type":"string","enum":["detailed","concise"]},"description":"'concise' returns settings: null (skip the ~25-key settings map when you only need the summary fields)"}],"x-required-scope":"read","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"date":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO-8601"},"createdDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"modifiedDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"hashtag":{"anyOf":[{"type":"string"},{"type":"null"}]},"notes":{"anyOf":[{"type":"string"},{"type":"null"}]},"idUser":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The customer's own external key for this event"},"colors":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}]},"captureMessage":{"anyOf":[{"type":"string"},{"type":"null"}]},"brandingTextColor":{"anyOf":[{"type":"string"},{"type":"null"}]},"templateIds":{"type":"array","items":{"type":"string"}},"attractScreenId":{"anyOf":[{"type":"string"},{"type":"null"}]},"stickerSetId":{"anyOf":[{"type":"string"},{"type":"null"}]},"paySetId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pay-per-use pricing set; null = pay off"},"galleryId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Gallery id. The gallery's settings (passcode, privacy, sharing) are a separate subresource — get_gallery_settings — deliberately NOT embedded here: they live in a different (regional) database, so embedding would put a cross-database round-trip on the most-called read."},"settings":{"anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},{"type":"null"}],"description":"The full iOS EventSettings map as stored"}},"required":["id","name","date","createdDate","modifiedDate","hashtag","notes","idUser","colors","captureMessage","brandingTextColor","templateIds","attractScreenId","stickerSetId","paySetId","galleryId","settings"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}}},"patch":{"operationId":"update_event","summary":"Update event fields and/or a partial settings object","description":"Partial update: only the fields you send change. settings merges per key (e.g. {\"settings\":{\"countdownTimer\":5}}); null clears idUser/attractScreenId/stickerSetId/paySetId (a null paySetId turns pay-per-use off).","parameters":[{"name":"eventId","in":"path","required":true,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","minLength":1}}],"x-required-scope":"read-write","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"date":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO-8601"},"createdDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"modifiedDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"hashtag":{"anyOf":[{"type":"string"},{"type":"null"}]},"notes":{"anyOf":[{"type":"string"},{"type":"null"}]},"idUser":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The customer's own external key for this event"},"colors":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}]},"captureMessage":{"anyOf":[{"type":"string"},{"type":"null"}]},"brandingTextColor":{"anyOf":[{"type":"string"},{"type":"null"}]},"templateIds":{"type":"array","items":{"type":"string"}},"attractScreenId":{"anyOf":[{"type":"string"},{"type":"null"}]},"stickerSetId":{"anyOf":[{"type":"string"},{"type":"null"}]},"paySetId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pay-per-use pricing set; null = pay off"},"galleryId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Gallery id. The gallery's settings (passcode, privacy, sharing) are a separate subresource — get_gallery_settings — deliberately NOT embedded here: they live in a different (regional) database, so embedding would put a cross-database round-trip on the most-called read."},"settings":{"anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},{"type":"null"}],"description":"The full iOS EventSettings map as stored"},"warnings":{"description":"Non-blocking: the pay set's currency matches no connected payment rail — charges would be refused at the booth until that changes","type":"array","items":{"type":"string","const":"currencyMismatch"}}},"required":["id","name","date","createdDate","modifiedDate","hashtag","notes","idUser","colors","captureMessage","brandingTextColor","templateIds","attractScreenId","stickerSetId","paySetId","galleryId","settings"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"date":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"templateIds":{"minItems":1,"maxItems":50,"type":"array","items":{"type":"string","minLength":1}},"hashtag":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}]},"notes":{"anyOf":[{"type":"string","maxLength":5000},{"type":"null"}]},"idUser":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}]},"colors":{"maxItems":10,"type":"array","items":{"type":"string"}},"captureMessage":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"brandingTextColor":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}]},"attractScreenId":{"anyOf":[{"type":"string"},{"type":"null"}]},"stickerSetId":{"anyOf":[{"type":"string"},{"type":"null"}]},"paySetId":{"description":"Pay-per-use pricing set for this event; null turns pay off","anyOf":[{"type":"string","minLength":1},{"type":"null"}]},"settings":{"type":"object","properties":{"version":{"description":"Managed by the system; not writable","not":{}},"captureTypes":{"minItems":1,"type":"array","items":{"type":"string","enum":["photo","boomerang","slowmo","video","gif","aiPhoto","aiCustomPrompt"]},"description":"Capture modes offered to guests"},"uploadOriginals":{"type":"boolean"},"countdownTimer":{"type":"integer","minimum":0,"maximum":30,"description":"Seconds before capture"},"soundEnabled":{"type":"boolean"},"takeMoreEnabled":{"type":"boolean"},"soundDuringBoomerangRecord":{"type":"boolean"},"actions":{"minItems":1,"type":"array","items":{"type":"string","enum":["email","sms","qrCode","airdrop"]},"description":"Share actions offered after capture"},"sharedGalleryEnabled":{"type":"boolean"},"attractScreenDelay":{"anyOf":[{"type":"number","minimum":5,"maximum":3600},{"type":"null"}],"description":"Idle seconds before the attract screen; null disables it"},"videoMaxDuration":{"type":"integer","minimum":3,"maximum":300,"description":"Seconds"},"autoGifFromPhotos":{"type":"boolean"},"gifNumberOfFrames":{"type":"integer","minimum":2,"maximum":12},"gifBoomerang":{"type":"boolean"},"gifCountdownTimer":{"type":"integer","minimum":0,"maximum":30},"boomerangRecordDuration":{"type":"number","minimum":0.5,"maximum":10,"description":"Seconds"},"gifPlaybackSpeed":{"type":"string","enum":["slow","medium","fast"]},"dataCollectionPosition":{"type":"string","enum":["beforeCapture","afterCapture"]},"galleryButtonOnHomeScreen":{"type":"string","enum":["none","cameraRoll","cloud"]},"aiRerollCount":{"type":"integer","minimum":0,"maximum":20},"passcodeOnQRScreen":{"type":"boolean"},"menuGalleryButtonsShown":{"type":"boolean"},"attractScreenRoles":{"minItems":1,"type":"array","items":{"type":"string","enum":["allInOne","camera","sharingStation"]}},"cropOriginals":{"type":"string","enum":["none","template"]},"addTemplatedOriginalToAiSessions":{"type":"boolean"},"aiPhotoChildlike":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"templatePreviewDisabled":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"printCountMax":{"anyOf":[{"type":"integer","minimum":0,"maximum":50},{"type":"null"}],"description":"null = no limit"},"captureModesHaveOrder":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"tapToContinue":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"takeMoreLimit":{"anyOf":[{"type":"integer","minimum":0,"maximum":10},{"type":"null"}]}},"additionalProperties":false}}}}}}},"delete":{"operationId":"delete_event","summary":"Delete an event and its gallery (irreversible)","description":"Removes the event, its shared gallery (all guest media), and its per-event communication overrides. There is no undo.","parameters":[{"name":"eventId","in":"path","required":true,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","minLength":1}}],"x-required-scope":"read-write","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"deleted":{"type":"boolean","const":true},"id":{"type":"string"}},"required":["deleted","id"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/events/{eventId}/duplicate":{"post":{"operationId":"duplicate_event","summary":"Duplicate an event (templates shared by reference; new gallery)","description":"The fastest way to create a recurring event: copies configuration, survey, and communication overrides, creates a fresh gallery. Consumes quota/credits like create_event. If the source event has an idUser, the copy's idUser gets a '-duplicated' suffix so it never collides with create_event's retry-safe lookup — set your own key with update_event.","parameters":[{"name":"eventId","in":"path","required":true,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","minLength":1,"description":"Source event id"}}],"x-required-scope":"read-write","responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"date":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO-8601"},"createdDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"modifiedDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"hashtag":{"anyOf":[{"type":"string"},{"type":"null"}]},"notes":{"anyOf":[{"type":"string"},{"type":"null"}]},"idUser":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The customer's own external key for this event"},"colors":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}]},"captureMessage":{"anyOf":[{"type":"string"},{"type":"null"}]},"brandingTextColor":{"anyOf":[{"type":"string"},{"type":"null"}]},"templateIds":{"type":"array","items":{"type":"string"}},"attractScreenId":{"anyOf":[{"type":"string"},{"type":"null"}]},"stickerSetId":{"anyOf":[{"type":"string"},{"type":"null"}]},"paySetId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pay-per-use pricing set; null = pay off"},"galleryId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Gallery id. The gallery's settings (passcode, privacy, sharing) are a separate subresource — get_gallery_settings — deliberately NOT embedded here: they live in a different (regional) database, so embedding would put a cross-database round-trip on the most-called read."},"settings":{"anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},{"type":"null"}],"description":"The full iOS EventSettings map as stored"}},"required":["id","name","date","createdDate","modifiedDate","hashtag","notes","idUser","colors","captureMessage","brandingTextColor","templateIds","attractScreenId","stickerSetId","paySetId","galleryId","settings"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"date":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},"required":["name","date"]}}}}}},"/events/{eventId}/gallery":{"get":{"operationId":"get_gallery_settings","summary":"Get the event gallery's passcode and privacy settings","parameters":[{"name":"eventId","in":"path","required":true,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","minLength":1}},{"name":"include_passcodes","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","default":false,"description":"Return the passcodes themselves, not just hasPasscode/hasSuperPasscode. Off by default because this is an MCP tool too, and cleartext passcodes would otherwise land in a third-party model's context on every call.","type":"boolean"},"description":"Return the passcodes themselves, not just hasPasscode/hasSuperPasscode. Off by default because this is an MCP tool too, and cleartext passcodes would otherwise land in a third-party model's context on every call."}],"x-required-scope":"read","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"galleryId":{"type":"string"},"hasPasscode":{"type":"boolean","description":"Whether a guest access passcode is set"},"hasSuperPasscode":{"type":"boolean","description":"Whether a download-tier passcode is set"},"passcode":{"description":"Only present with include_passcodes=true. Guest access passcode; null = none","anyOf":[{"type":"string"},{"type":"null"}]},"superPasscode":{"description":"Only present with include_passcodes=true. Download-tier passcode; null = none","anyOf":[{"type":"string"},{"type":"null"}]},"passcodeAppliesToSessions":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"downloadGalleryZipRestricted":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"shareHidesPasscode":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"hideTenantHeader":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"hideLoginAction":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"hideEventDate":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"hideEventName":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Hide the event name in the guest gallery (SOL-2769)"},"numberOfDaysTilExpiry":{"anyOf":[{"type":"number"},{"type":"null"}]},"galleryUrlMode":{"anyOf":[{"type":"string","enum":["custom-domain","default","slug-vanity"]},{"type":"null"}],"description":"null = legacy default (custom domain when one is enabled)"},"slugVanity":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The /e/<slug> vanity path; set via set_gallery_url"},"galleryUrl":{"type":"string","description":"The guest-facing gallery URL under the current mode"}},"required":["galleryId","hasPasscode","hasSuperPasscode","passcodeAppliesToSessions","downloadGalleryZipRestricted","shareHidesPasscode","hideTenantHeader","hideLoginAction","hideEventDate","hideEventName","numberOfDaysTilExpiry","galleryUrlMode","slugVanity","galleryUrl"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}}},"patch":{"operationId":"update_gallery_settings","summary":"Set gallery passcode and privacy settings","description":"Partial update. null or an empty string clears passcode/superPasscode — the exact body get_gallery_settings returns can be sent straight back. Use get_gallery_settings to read current values first.","parameters":[{"name":"eventId","in":"path","required":true,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","minLength":1}}],"x-required-scope":"read-write","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"galleryId":{"type":"string"},"hasPasscode":{"type":"boolean","description":"Whether a guest access passcode is set"},"hasSuperPasscode":{"type":"boolean","description":"Whether a download-tier passcode is set"},"passcode":{"description":"Only present with include_passcodes=true. Guest access passcode; null = none","anyOf":[{"type":"string"},{"type":"null"}]},"superPasscode":{"description":"Only present with include_passcodes=true. Download-tier passcode; null = none","anyOf":[{"type":"string"},{"type":"null"}]},"passcodeAppliesToSessions":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"downloadGalleryZipRestricted":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"shareHidesPasscode":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"hideTenantHeader":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"hideLoginAction":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"hideEventDate":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"hideEventName":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Hide the event name in the guest gallery (SOL-2769)"},"numberOfDaysTilExpiry":{"anyOf":[{"type":"number"},{"type":"null"}]},"galleryUrlMode":{"anyOf":[{"type":"string","enum":["custom-domain","default","slug-vanity"]},{"type":"null"}],"description":"null = legacy default (custom domain when one is enabled)"},"slugVanity":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The /e/<slug> vanity path; set via set_gallery_url"},"galleryUrl":{"type":"string","description":"The guest-facing gallery URL under the current mode"}},"required":["galleryId","hasPasscode","hasSuperPasscode","passcodeAppliesToSessions","downloadGalleryZipRestricted","shareHidesPasscode","hideTenantHeader","hideLoginAction","hideEventDate","hideEventName","numberOfDaysTilExpiry","galleryUrlMode","slugVanity","galleryUrl"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"passcode":{"description":"null or '' clears it","anyOf":[{"type":"string","maxLength":100},{"type":"null"}]},"superPasscode":{"description":"null or '' clears it","anyOf":[{"type":"string","maxLength":100},{"type":"null"}]},"passcodeAppliesToSessions":{"type":"boolean"},"downloadGalleryZipRestricted":{"type":"boolean"},"shareHidesPasscode":{"type":"boolean"},"hideTenantHeader":{"type":"boolean"},"hideLoginAction":{"type":"boolean"},"hideEventDate":{"type":"boolean"},"hideEventName":{"type":"boolean"}}}}}}}},"/events/{eventId}/gallery-url":{"patch":{"operationId":"set_gallery_url","summary":"Set the event gallery's URL form (vanity /e/ slug, default, or custom domain)","description":"mode 'slug-vanity' publishes the gallery at /e/<slugVanity> and requires slugVanity: 3-80 lowercase letters, numbers, hyphens or underscores, starting and ending with a letter or number, no consecutive hyphens, and not a reserved word (e, of, m, s, api, login, photos, …). 'default' forces the /of/ form even when the account has a custom domain; 'custom-domain' uses the account's domain when one is enabled. Changing modes releases the old vanity slug. Fails with conflict when the slug is already taken. Note the default /of/ slug is minted from the event name at creation and stays stable across renames (link stability).","parameters":[{"name":"eventId","in":"path","required":true,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","minLength":1}}],"x-required-scope":"read-write","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"galleryId":{"type":"string"},"hasPasscode":{"type":"boolean","description":"Whether a guest access passcode is set"},"hasSuperPasscode":{"type":"boolean","description":"Whether a download-tier passcode is set"},"passcode":{"description":"Only present with include_passcodes=true. Guest access passcode; null = none","anyOf":[{"type":"string"},{"type":"null"}]},"superPasscode":{"description":"Only present with include_passcodes=true. Download-tier passcode; null = none","anyOf":[{"type":"string"},{"type":"null"}]},"passcodeAppliesToSessions":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"downloadGalleryZipRestricted":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"shareHidesPasscode":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"hideTenantHeader":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"hideLoginAction":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"hideEventDate":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"hideEventName":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Hide the event name in the guest gallery (SOL-2769)"},"numberOfDaysTilExpiry":{"anyOf":[{"type":"number"},{"type":"null"}]},"galleryUrlMode":{"anyOf":[{"type":"string","enum":["custom-domain","default","slug-vanity"]},{"type":"null"}],"description":"null = legacy default (custom domain when one is enabled)"},"slugVanity":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The /e/<slug> vanity path; set via set_gallery_url"},"galleryUrl":{"type":"string","description":"The guest-facing gallery URL under the current mode"}},"required":["galleryId","hasPasscode","hasSuperPasscode","passcodeAppliesToSessions","downloadGalleryZipRestricted","shareHidesPasscode","hideTenantHeader","hideLoginAction","hideEventDate","hideEventName","numberOfDaysTilExpiry","galleryUrlMode","slugVanity","galleryUrl"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"mode":{"type":"string","enum":["custom-domain","default","slug-vanity"]},"slugVanity":{"type":"string","minLength":3,"maxLength":80}},"required":["mode"]}}}}}},"/events/{eventId}/templates":{"post":{"operationId":"add_event_template","summary":"Add a template to an event (concurrency-safe)","description":"Transactional arrayUnion-style add — safe against concurrent dashboard/iPad edits, unlike PATCHing the whole templateIds list. Idempotent when the template is already assigned.","parameters":[{"name":"eventId","in":"path","required":true,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","minLength":1,"description":"Event id — use list_events to find one"}}],"x-required-scope":"read-write","responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string"},"templateIds":{"type":"array","items":{"type":"string"},"description":"The full list after the change"}},"required":["id","templateIds"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"templateId":{"type":"string","minLength":1,"description":"Template id — use list_templates to find one"}},"required":["templateId"]}}}}},"delete":{"operationId":"remove_event_template","summary":"Remove a template from an event (concurrency-safe)","description":"Events always keep at least one template — removing the last one is refused (409). Idempotent when the template is not assigned.","parameters":[{"name":"eventId","in":"path","required":true,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","minLength":1,"description":"Event id — use list_events to find one"}},{"name":"templateId","in":"query","required":true,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","minLength":1,"description":"Template id — use list_templates to find one"},"description":"Template id — use list_templates to find one"}],"x-required-scope":"read-write","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string"},"templateIds":{"type":"array","items":{"type":"string"},"description":"The full list after the change"}},"required":["id","templateIds"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/events/{eventId}/media":{"get":{"operationId":"list_media","summary":"List the event gallery's media (newest first)","description":"Read-only. originalUrl/thumbnailUrl are directly servable SIGNED URLs that expire (up to 7 days; always ≥24 h left when served) — re-list to refresh them rather than storing them. Paginate with cursor; do not fetch the whole gallery in one call.","parameters":[{"name":"eventId","in":"path","required":true,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","minLength":1}},{"name":"limit","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","default":50,"type":"integer","minimum":1,"maximum":100}},{"name":"cursor","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string"}}],"x-required-scope":"read","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"createdDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"captureType":{"anyOf":[{"type":"string"},{"type":"null"}]},"contentType":{"anyOf":[{"type":"string"},{"type":"null"}]},"filename":{"anyOf":[{"type":"string"},{"type":"null"}]},"width":{"anyOf":[{"type":"number"},{"type":"null"}]},"height":{"anyOf":[{"type":"number"},{"type":"null"}]},"isCollage":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"templateId":{"anyOf":[{"type":"string"},{"type":"null"}]},"sessionId":{"anyOf":[{"type":"string"},{"type":"null"}]},"kBytes":{"anyOf":[{"type":"number"},{"type":"null"}]},"originalUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The original media file — a signed URL valid up to 7 days. Usually refreshed to ≥24 h when served, but a legacy item with no stored storage path can return an already-expired URL — treat a 403 on the URL as \"re-list\", not as a missing photo. Re-list to refresh; never store long-term."},"thumbnailUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The media thumbnail file — a signed URL valid up to 7 days. Usually refreshed to ≥24 h when served, but a legacy item with no stored storage path can return an already-expired URL — treat a 403 on the URL as \"re-list\", not as a missing photo. Re-list to refresh; never store long-term."}},"required":["id","createdDate","captureType","contentType","filename","width","height","isCollage","templateId","sessionId","kBytes","originalUrl","thumbnailUrl"],"additionalProperties":false}},"hasMore":{"type":"boolean"},"nextCursor":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["data","hasMore","nextCursor"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/events/{eventId}/sessions":{"get":{"operationId":"list_sessions","summary":"List capture sessions incl. guest data-collection responses","description":"Read-only. Each session carries the guest email/phone (when collected) and the raw dataCollectionResponse; use export_survey_responses for flattened CRM-friendly rows. Deleted sessions are excluded (a page may return fewer than limit).","parameters":[{"name":"eventId","in":"path","required":true,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","minLength":1}},{"name":"limit","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","default":50,"type":"integer","minimum":1,"maximum":100}},{"name":"cursor","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string"}}],"x-required-scope":"read","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"createdDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"index":{"anyOf":[{"type":"number"},{"type":"null"}]},"email":{"anyOf":[{"type":"string"},{"type":"null"}]},"phoneNumber":{"anyOf":[{"type":"string"},{"type":"null"}]},"mediaIds":{"type":"array","items":{"type":"string"}},"media":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"createdDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"captureType":{"anyOf":[{"type":"string"},{"type":"null"}]},"contentType":{"anyOf":[{"type":"string"},{"type":"null"}]},"filename":{"anyOf":[{"type":"string"},{"type":"null"}]},"width":{"anyOf":[{"type":"number"},{"type":"null"}]},"height":{"anyOf":[{"type":"number"},{"type":"null"}]},"isCollage":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"templateId":{"anyOf":[{"type":"string"},{"type":"null"}]},"sessionId":{"anyOf":[{"type":"string"},{"type":"null"}]},"kBytes":{"anyOf":[{"type":"number"},{"type":"null"}]},"originalUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The original media file — a signed URL valid up to 7 days. Usually refreshed to ≥24 h when served, but a legacy item with no stored storage path can return an already-expired URL — treat a 403 on the URL as \"re-list\", not as a missing photo. Re-list to refresh; never store long-term."},"thumbnailUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The media thumbnail file — a signed URL valid up to 7 days. Usually refreshed to ≥24 h when served, but a legacy item with no stored storage path can return an already-expired URL — treat a 403 on the URL as \"re-list\", not as a missing photo. Re-list to refresh; never store long-term."}},"required":["id","createdDate","captureType","contentType","filename","width","height","isCollage","templateId","sessionId","kBytes","originalUrl","thumbnailUrl"],"additionalProperties":false},"description":"Denormalized media objects when present"},"dataCollectionResponse":{"anyOf":[{},{"type":"null"}]}},"required":["id","createdDate","index","email","phoneNumber","mediaIds","media","dataCollectionResponse"],"additionalProperties":false}},"hasMore":{"type":"boolean"},"nextCursor":{"anyOf":[{"type":"string"},{"type":"null"}]},"hiddenLegacySessions":{"description":"Present on the first page only, and only when >0: sessions written without a createdDate, which paging by that field cannot return. They are missing from this list.","type":"number"}},"required":["data","hasMore","nextCursor"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/events/{eventId}/survey-responses":{"get":{"operationId":"export_survey_responses","summary":"Flattened survey/data-collection answers, one row per response","description":"CRM-friendly export: each guest answer becomes a row with the session id, guest email/phone (when collected), question text, and answer. Paginates over sessions — keep calling with nextCursor until hasMore is false.","parameters":[{"name":"eventId","in":"path","required":true,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","minLength":1}},{"name":"limit","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","default":50,"type":"integer","minimum":1,"maximum":100}},{"name":"cursor","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string"}}],"x-required-scope":"read","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"sessionId":{"type":"string"},"sessionCreatedDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"email":{"anyOf":[{"type":"string"},{"type":"null"}]},"phoneNumber":{"anyOf":[{"type":"string"},{"type":"null"}]},"stage":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"'preSession' | 'postCapture' when known"},"fieldId":{"anyOf":[{"type":"string"},{"type":"null"}]},"question":{"anyOf":[{"type":"string"},{"type":"null"}]},"answer":{"anyOf":[{},{"type":"null"}]},"capturedAt":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["sessionId","sessionCreatedDate","email","phoneNumber","stage","fieldId","question","answer","capturedAt"],"additionalProperties":false}},"hasMore":{"type":"boolean"},"nextCursor":{"anyOf":[{"type":"string"},{"type":"null"}]},"hiddenLegacySessions":{"description":"Present on the first page only, and only when >0: sessions written without a createdDate cannot be returned by a query ordered on it. Their responses are missing from this export.","type":"number"}},"required":["data","hasMore","nextCursor"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/templates":{"get":{"operationId":"list_templates","summary":"List your templates","parameters":[{"name":"limit","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","default":25,"type":"integer","minimum":1,"maximum":100}},{"name":"cursor","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string"}},{"name":"search","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","description":"Case-insensitive name prefix","type":"string","minLength":1},"description":"Case-insensitive name prefix"},{"name":"includePublic","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","description":"true = also include public library templates (e.g. account defaults reference these)","type":"boolean"},"description":"true = also include public library templates (e.g. account defaults reference these)"}],"x-required-scope":"read","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"createdDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"modifiedDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"isPublic":{"type":"boolean","description":"Public library items are duplicable but not editable"},"sizePixels":{"anyOf":[{"type":"array","items":{"type":"number"}},{"type":"null"}]},"thumbnailUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Stable upload-time URL when available (never expires); otherwise a 7-day signed URL — refresh by re-listing"},"isImporting":{"type":"boolean","description":"true = still importing; sizePixels/layers/thumbnail are placeholders, poll until false"},"photoAreaCount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Media-layer count; AI prompts/portraits attach only when this is exactly 1"},"aiCustomPromptIds":{"type":"array","items":{"type":"string"},"description":"Attached AI prompts (see list_ai_prompts)"},"aiPortraitIds":{"type":"array","items":{"type":"string"},"description":"Attached AI portrait styles (see list_ai_portraits)"},"disabledCaptureTypes":{"type":"array","items":{"type":"string"}},"sceneSelectionForced":{"type":"boolean"},"transparentScene":{"type":"boolean","description":"Offers a \"no scene\" option to guests"},"scenes":{"type":"array","items":{"type":"object","properties":{"storagePath":{"type":"string","description":"Key for update_template_scene / remove_template_scene"},"thumbnailUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"7-day signed URL — re-fetch to refresh"},"width":{"anyOf":[{"type":"number"},{"type":"null"}]},"height":{"anyOf":[{"type":"number"},{"type":"null"}]},"crop":{"anyOf":[{"type":"string","enum":["scene","photo"]},{"type":"null"}]},"compositingMethod":{"anyOf":[{"type":"string","enum":["sourceOver","addition","colorBlend","colorDodgeBlend","differenceBlend","exclusionBlend","lightenBlend","linearDodgeBlend","luminosityBlend","minimumCompositing","overlayBlend","screenBlend","softLightBlend"]},{"type":"null"}]},"uploadedOn":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["storagePath","thumbnailUrl","width","height","crop","compositingMethod","uploadedOn"],"additionalProperties":false},"description":"Green-screen background scenes"}},"required":["id","name","createdDate","modifiedDate","isPublic","sizePixels","thumbnailUrl","isImporting","photoAreaCount","aiCustomPromptIds","aiPortraitIds","disabledCaptureTypes","sceneSelectionForced","transparentScene","scenes"],"additionalProperties":false}},"hasMore":{"type":"boolean"},"nextCursor":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["data","hasMore","nextCursor"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/templates/{id}":{"get":{"operationId":"get_template","summary":"Get one template (yours or a public one)","parameters":[{"name":"id","in":"path","required":true,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","minLength":1}}],"x-required-scope":"read","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"createdDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"modifiedDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"isPublic":{"type":"boolean","description":"Public library items are duplicable but not editable"},"sizePixels":{"anyOf":[{"type":"array","items":{"type":"number"}},{"type":"null"}]},"thumbnailUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Stable upload-time URL when available (never expires); otherwise a 7-day signed URL — refresh by re-listing"},"isImporting":{"type":"boolean","description":"true = still importing; sizePixels/layers/thumbnail are placeholders, poll until false"},"photoAreaCount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Media-layer count; AI prompts/portraits attach only when this is exactly 1"},"aiCustomPromptIds":{"type":"array","items":{"type":"string"},"description":"Attached AI prompts (see list_ai_prompts)"},"aiPortraitIds":{"type":"array","items":{"type":"string"},"description":"Attached AI portrait styles (see list_ai_portraits)"},"disabledCaptureTypes":{"type":"array","items":{"type":"string"}},"sceneSelectionForced":{"type":"boolean"},"transparentScene":{"type":"boolean","description":"Offers a \"no scene\" option to guests"},"scenes":{"type":"array","items":{"type":"object","properties":{"storagePath":{"type":"string","description":"Key for update_template_scene / remove_template_scene"},"thumbnailUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"7-day signed URL — re-fetch to refresh"},"width":{"anyOf":[{"type":"number"},{"type":"null"}]},"height":{"anyOf":[{"type":"number"},{"type":"null"}]},"crop":{"anyOf":[{"type":"string","enum":["scene","photo"]},{"type":"null"}]},"compositingMethod":{"anyOf":[{"type":"string","enum":["sourceOver","addition","colorBlend","colorDodgeBlend","differenceBlend","exclusionBlend","lightenBlend","linearDodgeBlend","luminosityBlend","minimumCompositing","overlayBlend","screenBlend","softLightBlend"]},{"type":"null"}]},"uploadedOn":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["storagePath","thumbnailUrl","width","height","crop","compositingMethod","uploadedOn"],"additionalProperties":false},"description":"Green-screen background scenes"}},"required":["id","name","createdDate","modifiedDate","isPublic","sizePixels","thumbnailUrl","isImporting","photoAreaCount","aiCustomPromptIds","aiPortraitIds","disabledCaptureTypes","sceneSelectionForced","transparentScene","scenes"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}}},"patch":{"operationId":"update_template","summary":"Update template metadata: name, AI prompt/portrait assignment, scene flags","description":"Never touches the design/layers (dashboard-editor-only) — safe against concurrent editing. Assigning aiCustomPromptIds/aiPortraitIds requires the template to have exactly ONE photo area (photoAreaCount) and defines what END customers/guests can pick at the booth; empty arrays detach everything. Detaching a prompt whose dynamic fields are placed on the canvas is refused (409) — remove those in the dashboard first.","parameters":[{"name":"id","in":"path","required":true,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","minLength":1}}],"x-required-scope":"read-write","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"createdDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"modifiedDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"isPublic":{"type":"boolean","description":"Public library items are duplicable but not editable"},"sizePixels":{"anyOf":[{"type":"array","items":{"type":"number"}},{"type":"null"}]},"thumbnailUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Stable upload-time URL when available (never expires); otherwise a 7-day signed URL — refresh by re-listing"},"isImporting":{"type":"boolean","description":"true = still importing; sizePixels/layers/thumbnail are placeholders, poll until false"},"photoAreaCount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Media-layer count; AI prompts/portraits attach only when this is exactly 1"},"aiCustomPromptIds":{"type":"array","items":{"type":"string"},"description":"Attached AI prompts (see list_ai_prompts)"},"aiPortraitIds":{"type":"array","items":{"type":"string"},"description":"Attached AI portrait styles (see list_ai_portraits)"},"disabledCaptureTypes":{"type":"array","items":{"type":"string"}},"sceneSelectionForced":{"type":"boolean"},"transparentScene":{"type":"boolean","description":"Offers a \"no scene\" option to guests"},"scenes":{"type":"array","items":{"type":"object","properties":{"storagePath":{"type":"string","description":"Key for update_template_scene / remove_template_scene"},"thumbnailUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"7-day signed URL — re-fetch to refresh"},"width":{"anyOf":[{"type":"number"},{"type":"null"}]},"height":{"anyOf":[{"type":"number"},{"type":"null"}]},"crop":{"anyOf":[{"type":"string","enum":["scene","photo"]},{"type":"null"}]},"compositingMethod":{"anyOf":[{"type":"string","enum":["sourceOver","addition","colorBlend","colorDodgeBlend","differenceBlend","exclusionBlend","lightenBlend","linearDodgeBlend","luminosityBlend","minimumCompositing","overlayBlend","screenBlend","softLightBlend"]},{"type":"null"}]},"uploadedOn":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["storagePath","thumbnailUrl","width","height","crop","compositingMethod","uploadedOn"],"additionalProperties":false},"description":"Green-screen background scenes"}},"required":["id","name","createdDate","modifiedDate","isPublic","sizePixels","thumbnailUrl","isImporting","photoAreaCount","aiCustomPromptIds","aiPortraitIds","disabledCaptureTypes","sceneSelectionForced","transparentScene","scenes"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"aiCustomPromptIds":{"description":"AI prompt ids — use list_ai_prompts to find them; [] detaches all","maxItems":20,"type":"array","items":{"type":"string","minLength":1}},"aiPortraitIds":{"description":"AI portrait style ids — use list_ai_portraits to find them; [] detaches all","maxItems":20,"type":"array","items":{"type":"string","minLength":1}},"sceneSelectionForced":{"type":"boolean"},"transparentScene":{"type":"boolean"},"disabledCaptureTypes":{"type":"array","items":{"type":"string","enum":["photo","boomerang","slowmo","video","gif","aiPhoto","aiCustomPrompt"]}}}}}}}},"delete":{"operationId":"delete_template","summary":"Delete a template (fails if events still use it)","parameters":[{"name":"id","in":"path","required":true,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","minLength":1}}],"x-required-scope":"read-write","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"deleted":{"type":"boolean","const":true},"id":{"type":"string"}},"required":["deleted","id"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/templates/{id}/duplicate":{"post":{"operationId":"duplicate_template","summary":"Duplicate a template (e.g. to customize a public library design)","description":"Copies the template and all its image assets. Works on your templates and public library ones. To create a template from a design file instead, use create_template_from_pdf or create_template_from_images.","parameters":[{"name":"id","in":"path","required":true,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","minLength":1}}],"x-required-scope":"read-write","responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"createdDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"modifiedDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"isPublic":{"type":"boolean","description":"Public library items are duplicable but not editable"},"sizePixels":{"anyOf":[{"type":"array","items":{"type":"number"}},{"type":"null"}]},"thumbnailUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Stable upload-time URL when available (never expires); otherwise a 7-day signed URL — refresh by re-listing"},"isImporting":{"type":"boolean","description":"true = still importing; sizePixels/layers/thumbnail are placeholders, poll until false"},"photoAreaCount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Media-layer count; AI prompts/portraits attach only when this is exactly 1"},"aiCustomPromptIds":{"type":"array","items":{"type":"string"},"description":"Attached AI prompts (see list_ai_prompts)"},"aiPortraitIds":{"type":"array","items":{"type":"string"},"description":"Attached AI portrait styles (see list_ai_portraits)"},"disabledCaptureTypes":{"type":"array","items":{"type":"string"}},"sceneSelectionForced":{"type":"boolean"},"transparentScene":{"type":"boolean","description":"Offers a \"no scene\" option to guests"},"scenes":{"type":"array","items":{"type":"object","properties":{"storagePath":{"type":"string","description":"Key for update_template_scene / remove_template_scene"},"thumbnailUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"7-day signed URL — re-fetch to refresh"},"width":{"anyOf":[{"type":"number"},{"type":"null"}]},"height":{"anyOf":[{"type":"number"},{"type":"null"}]},"crop":{"anyOf":[{"type":"string","enum":["scene","photo"]},{"type":"null"}]},"compositingMethod":{"anyOf":[{"type":"string","enum":["sourceOver","addition","colorBlend","colorDodgeBlend","differenceBlend","exclusionBlend","lightenBlend","linearDodgeBlend","luminosityBlend","minimumCompositing","overlayBlend","screenBlend","softLightBlend"]},{"type":"null"}]},"uploadedOn":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["storagePath","thumbnailUrl","width","height","crop","compositingMethod","uploadedOn"],"additionalProperties":false},"description":"Green-screen background scenes"}},"required":["id","name","createdDate","modifiedDate","isPublic","sizePixels","thumbnailUrl","isImporting","photoAreaCount","aiCustomPromptIds","aiPortraitIds","disabledCaptureTypes","sceneSelectionForced","transparentScene","scenes"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200}},"required":["name"]}}}}}},"/attract-screens":{"get":{"operationId":"list_attract_screens","summary":"List your attract screens","parameters":[{"name":"limit","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","default":25,"type":"integer","minimum":1,"maximum":100}},{"name":"cursor","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string"}},{"name":"search","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","description":"Case-insensitive name prefix","type":"string","minLength":1},"description":"Case-insensitive name prefix"},{"name":"includePublic","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","description":"true = also include public library attract screens (e.g. account defaults reference these)","type":"boolean"},"description":"true = also include public library attract screens (e.g. account defaults reference these)"}],"x-required-scope":"read","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"createdDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"modifiedDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"isPublic":{"type":"boolean","description":"Public library items are duplicable but not editable"},"sizePixels":{"anyOf":[{"type":"array","items":{"type":"number"}},{"type":"null"}]},"thumbnailUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Stable upload-time URL when available (never expires); otherwise a 7-day signed URL — refresh by re-listing"},"isImporting":{"type":"boolean","description":"true = still importing; sizePixels/layers/thumbnail are placeholders, poll until false"}},"required":["id","name","createdDate","modifiedDate","isPublic","sizePixels","thumbnailUrl","isImporting"],"additionalProperties":false}},"hasMore":{"type":"boolean"},"nextCursor":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["data","hasMore","nextCursor"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/attract-screens/{id}":{"get":{"operationId":"get_attract_screen","summary":"Get one attract screen (yours or a public one)","parameters":[{"name":"id","in":"path","required":true,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","minLength":1}}],"x-required-scope":"read","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"createdDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"modifiedDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"isPublic":{"type":"boolean","description":"Public library items are duplicable but not editable"},"sizePixels":{"anyOf":[{"type":"array","items":{"type":"number"}},{"type":"null"}]},"thumbnailUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Stable upload-time URL when available (never expires); otherwise a 7-day signed URL — refresh by re-listing"},"isImporting":{"type":"boolean","description":"true = still importing; sizePixels/layers/thumbnail are placeholders, poll until false"}},"required":["id","name","createdDate","modifiedDate","isPublic","sizePixels","thumbnailUrl","isImporting"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}}},"patch":{"operationId":"rename_attract_screen","summary":"Rename an attract screen (metadata only)","description":"Only the name changes — the design/layers are editable exclusively in the dashboard editor.","parameters":[{"name":"id","in":"path","required":true,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","minLength":1}}],"x-required-scope":"read-write","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"createdDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"modifiedDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"isPublic":{"type":"boolean","description":"Public library items are duplicable but not editable"},"sizePixels":{"anyOf":[{"type":"array","items":{"type":"number"}},{"type":"null"}]},"thumbnailUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Stable upload-time URL when available (never expires); otherwise a 7-day signed URL — refresh by re-listing"},"isImporting":{"type":"boolean","description":"true = still importing; sizePixels/layers/thumbnail are placeholders, poll until false"}},"required":["id","name","createdDate","modifiedDate","isPublic","sizePixels","thumbnailUrl","isImporting"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200}},"required":["name"]}}}}},"delete":{"operationId":"delete_attract_screen","summary":"Delete an attract screen (fails if events still use it)","parameters":[{"name":"id","in":"path","required":true,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","minLength":1}}],"x-required-scope":"read-write","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"deleted":{"type":"boolean","const":true},"id":{"type":"string"}},"required":["deleted","id"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/attract-screens/{id}/duplicate":{"post":{"operationId":"duplicate_attract_screen","summary":"Duplicate an attract screen (the only way to create one via API)","description":"Copies the item and all its image assets. Works on your items and public library items.","parameters":[{"name":"id","in":"path","required":true,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","minLength":1}}],"x-required-scope":"read-write","responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"createdDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"modifiedDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"isPublic":{"type":"boolean","description":"Public library items are duplicable but not editable"},"sizePixels":{"anyOf":[{"type":"array","items":{"type":"number"}},{"type":"null"}]},"thumbnailUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Stable upload-time URL when available (never expires); otherwise a 7-day signed URL — refresh by re-listing"},"isImporting":{"type":"boolean","description":"true = still importing; sizePixels/layers/thumbnail are placeholders, poll until false"}},"required":["id","name","createdDate","modifiedDate","isPublic","sizePixels","thumbnailUrl","isImporting"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200}},"required":["name"]}}}}}},"/sticker-sets":{"get":{"operationId":"list_sticker_sets","summary":"List your sticker sets","parameters":[{"name":"limit","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","default":25,"type":"integer","minimum":1,"maximum":100}},{"name":"cursor","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string"}},{"name":"search","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","description":"Case-insensitive name prefix","type":"string","minLength":1},"description":"Case-insensitive name prefix"},{"name":"includePublic","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","description":"true = also include public library sticker sets (e.g. account defaults reference these)","type":"boolean"},"description":"true = also include public library sticker sets (e.g. account defaults reference these)"}],"x-required-scope":"read","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"createdDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"modifiedDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"isPublic":{"type":"boolean","description":"Public library items are duplicable but not editable"},"sizePixels":{"anyOf":[{"type":"array","items":{"type":"number"}},{"type":"null"}]},"thumbnailUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Stable upload-time URL when available (never expires); otherwise a 7-day signed URL — refresh by re-listing"},"isImporting":{"type":"boolean","description":"true = still importing; sizePixels/layers/thumbnail are placeholders, poll until false"}},"required":["id","name","createdDate","modifiedDate","isPublic","sizePixels","thumbnailUrl","isImporting"],"additionalProperties":false}},"hasMore":{"type":"boolean"},"nextCursor":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["data","hasMore","nextCursor"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/sticker-sets/{id}":{"get":{"operationId":"get_sticker_set","summary":"Get one sticker set (yours or a public one)","parameters":[{"name":"id","in":"path","required":true,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","minLength":1}}],"x-required-scope":"read","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"createdDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"modifiedDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"isPublic":{"type":"boolean","description":"Public library items are duplicable but not editable"},"sizePixels":{"anyOf":[{"type":"array","items":{"type":"number"}},{"type":"null"}]},"thumbnailUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Stable upload-time URL when available (never expires); otherwise a 7-day signed URL — refresh by re-listing"},"isImporting":{"type":"boolean","description":"true = still importing; sizePixels/layers/thumbnail are placeholders, poll until false"}},"required":["id","name","createdDate","modifiedDate","isPublic","sizePixels","thumbnailUrl","isImporting"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}}},"patch":{"operationId":"rename_sticker_set","summary":"Rename a sticker set (metadata only)","description":"Only the name changes — the design/layers are editable exclusively in the dashboard editor.","parameters":[{"name":"id","in":"path","required":true,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","minLength":1}}],"x-required-scope":"read-write","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"createdDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"modifiedDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"isPublic":{"type":"boolean","description":"Public library items are duplicable but not editable"},"sizePixels":{"anyOf":[{"type":"array","items":{"type":"number"}},{"type":"null"}]},"thumbnailUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Stable upload-time URL when available (never expires); otherwise a 7-day signed URL — refresh by re-listing"},"isImporting":{"type":"boolean","description":"true = still importing; sizePixels/layers/thumbnail are placeholders, poll until false"}},"required":["id","name","createdDate","modifiedDate","isPublic","sizePixels","thumbnailUrl","isImporting"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200}},"required":["name"]}}}}},"delete":{"operationId":"delete_sticker_set","summary":"Delete a sticker set (fails if events still use it)","parameters":[{"name":"id","in":"path","required":true,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","minLength":1}}],"x-required-scope":"read-write","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"deleted":{"type":"boolean","const":true},"id":{"type":"string"}},"required":["deleted","id"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/sticker-sets/{id}/duplicate":{"post":{"operationId":"duplicate_sticker_set","summary":"Duplicate a sticker set (the only way to create one via API)","description":"Copies the item and all its image assets. Works on your items and public library items.","parameters":[{"name":"id","in":"path","required":true,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","minLength":1}}],"x-required-scope":"read-write","responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"createdDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"modifiedDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"isPublic":{"type":"boolean","description":"Public library items are duplicable but not editable"},"sizePixels":{"anyOf":[{"type":"array","items":{"type":"number"}},{"type":"null"}]},"thumbnailUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Stable upload-time URL when available (never expires); otherwise a 7-day signed URL — refresh by re-listing"},"isImporting":{"type":"boolean","description":"true = still importing; sizePixels/layers/thumbnail are placeholders, poll until false"}},"required":["id","name","createdDate","modifiedDate","isPublic","sizePixels","thumbnailUrl","isImporting"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200}},"required":["name"]}}}}}},"/uploads":{"post":{"operationId":"create_upload","summary":"Mint a signed URL for uploading a file (step 1 of 2)","description":"Two-step upload: call this, then HTTP PUT the raw bytes to the returned uploadUrl — sending back the returned headers EXACTLY (they are part of the signature) — within 15 minutes. Then pass storagePath to the consuming operation (e.g. create_template_from_pdf, add_ai_prompt_reference_image, add_template_scene). Alternative: every consuming operation also accepts a public https sourceUrl it fetches server-side — use that when you cannot PUT binaries (AI agents over MCP, assets already hosted on your own storage).","x-required-scope":"read-write","responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"uploadUrl":{"type":"string","description":"PUT the raw bytes here (no auth header needed)"},"storagePath":{"type":"string","description":"Pass this as uploadPath to the consuming operation after the PUT succeeds"},"method":{"type":"string","const":"PUT"},"headers":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"description":"Send these headers EXACTLY on the PUT — they are part of the signature"},"expiresAt":{"type":"string","description":"ISO-8601 expiry of uploadUrl (~15 minutes)"},"maxSizeBytes":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["uploadUrl","storagePath","method","headers","expiresAt","maxSizeBytes"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"purpose":{"type":"string","enum":["template-pdf","template-zip","template-image","scene","ai-reference-image","ai-preview-image"],"description":"What the file is for — decides allowed content types and the size cap"},"filename":{"type":"string","minLength":1,"maxLength":200,"description":"Original filename (sanitized server-side)"},"contentType":{"type":"string","minLength":1,"description":"MIME type of the bytes you will PUT — must match the purpose"}},"required":["purpose","filename","contentType"]}}}}}},"/templates/import-pdf":{"post":{"operationId":"create_template_from_pdf","summary":"Create a template by importing a PDF design (parsed into layers)","description":"Same pipeline as the dashboard \"Upload design\" PDF flow: text and artwork become image layers, transparent/white rectangles become photo areas guests get composited into. Provide the PDF via uploadPath (create_upload + PUT) or a public https sourceUrl. targetWidthPx sets the render width (default: the PDF page width in points, clamped to 1000..5000 — native 72dpi sizes are usually too small for print). Takes up to a few minutes for heavy PDFs. Only page 1 imports (warning \"only_first_page_imported\" for multi-page files); text is rasterized (not editable); transparent page backgrounds become white. thumbnailUrl is null only if preview rendering failed — the dashboard renders one lazily on first view.","x-required-scope":"read-write","responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"createdDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"modifiedDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"isPublic":{"type":"boolean","description":"Public library items are duplicable but not editable"},"sizePixels":{"anyOf":[{"type":"array","items":{"type":"number"}},{"type":"null"}]},"thumbnailUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Stable upload-time URL when available (never expires); otherwise a 7-day signed URL — refresh by re-listing"},"isImporting":{"type":"boolean","description":"true = still importing; sizePixels/layers/thumbnail are placeholders, poll until false"},"photoAreaCount":{"type":"number","description":"Detected photo areas. AI prompt/portrait assignment (update_template) requires exactly 1."},"aiCustomPromptIds":{"type":"array","items":{"type":"string"},"description":"Attached AI prompts (see list_ai_prompts)"},"aiPortraitIds":{"type":"array","items":{"type":"string"},"description":"Attached AI portrait styles (see list_ai_portraits)"},"disabledCaptureTypes":{"type":"array","items":{"type":"string"}},"sceneSelectionForced":{"type":"boolean"},"transparentScene":{"type":"boolean","description":"Offers a \"no scene\" option to guests"},"scenes":{"type":"array","items":{"type":"object","properties":{"storagePath":{"type":"string","description":"Key for update_template_scene / remove_template_scene"},"thumbnailUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"7-day signed URL — re-fetch to refresh"},"width":{"anyOf":[{"type":"number"},{"type":"null"}]},"height":{"anyOf":[{"type":"number"},{"type":"null"}]},"crop":{"anyOf":[{"type":"string","enum":["scene","photo"]},{"type":"null"}]},"compositingMethod":{"anyOf":[{"type":"string","enum":["sourceOver","addition","colorBlend","colorDodgeBlend","differenceBlend","exclusionBlend","lightenBlend","linearDodgeBlend","luminosityBlend","minimumCompositing","overlayBlend","screenBlend","softLightBlend"]},{"type":"null"}]},"uploadedOn":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["storagePath","thumbnailUrl","width","height","crop","compositingMethod","uploadedOn"],"additionalProperties":false},"description":"Green-screen background scenes"},"warnings":{"type":"array","items":{"type":"string"},"description":"Non-fatal notes: 'only_first_page_imported' (multi-page PDFs), 'no_photo_areas_detected' (guests cannot be composited into this template)"}},"required":["id","name","createdDate","modifiedDate","isPublic","sizePixels","thumbnailUrl","isImporting","photoAreaCount","aiCustomPromptIds","aiPortraitIds","disabledCaptureTypes","sceneSelectionForced","transparentScene","scenes","warnings"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120,"description":"Template name"},"uploadPath":{"description":"storagePath from create_upload (after PUTting the bytes)","type":"string"},"sourceUrl":{"description":"Public https URL fetched server-side (must not redirect) — alternative to uploadPath","type":"string"},"targetWidthPx":{"type":"integer","minimum":100,"maximum":5000},"disabledCaptureTypes":{"type":"array","items":{"type":"string","enum":["photo","boomerang","slowmo","video","gif","aiPhoto","aiCustomPrompt"]}}},"required":["name"]}}}}}},"/templates/import-images":{"post":{"operationId":"create_template_from_images","summary":"Create a template from PNG/JPG layer images or a ZIP of them","description":"Same pipeline as the dashboard \"Upload design\" image/ZIP flow: images stack largest-first (the largest sets the template size), and transparent or white rectangles in the composite become photo areas guests get composited into. Provide EITHER images[] (each via uploadPath or sourceUrl) OR one zip (zipUploadPath/zipSourceUrl containing flat .png/.jpg layers, e.g. a Photoshop export). thumbnailUrl is null only if preview rendering failed — the dashboard renders one lazily on first view.","x-required-scope":"read-write","responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"createdDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"modifiedDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"isPublic":{"type":"boolean","description":"Public library items are duplicable but not editable"},"sizePixels":{"anyOf":[{"type":"array","items":{"type":"number"}},{"type":"null"}]},"thumbnailUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Stable upload-time URL when available (never expires); otherwise a 7-day signed URL — refresh by re-listing"},"isImporting":{"type":"boolean","description":"true = still importing; sizePixels/layers/thumbnail are placeholders, poll until false"},"photoAreaCount":{"type":"number","description":"Detected photo areas. AI prompt/portrait assignment (update_template) requires exactly 1."},"aiCustomPromptIds":{"type":"array","items":{"type":"string"},"description":"Attached AI prompts (see list_ai_prompts)"},"aiPortraitIds":{"type":"array","items":{"type":"string"},"description":"Attached AI portrait styles (see list_ai_portraits)"},"disabledCaptureTypes":{"type":"array","items":{"type":"string"}},"sceneSelectionForced":{"type":"boolean"},"transparentScene":{"type":"boolean","description":"Offers a \"no scene\" option to guests"},"scenes":{"type":"array","items":{"type":"object","properties":{"storagePath":{"type":"string","description":"Key for update_template_scene / remove_template_scene"},"thumbnailUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"7-day signed URL — re-fetch to refresh"},"width":{"anyOf":[{"type":"number"},{"type":"null"}]},"height":{"anyOf":[{"type":"number"},{"type":"null"}]},"crop":{"anyOf":[{"type":"string","enum":["scene","photo"]},{"type":"null"}]},"compositingMethod":{"anyOf":[{"type":"string","enum":["sourceOver","addition","colorBlend","colorDodgeBlend","differenceBlend","exclusionBlend","lightenBlend","linearDodgeBlend","luminosityBlend","minimumCompositing","overlayBlend","screenBlend","softLightBlend"]},{"type":"null"}]},"uploadedOn":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["storagePath","thumbnailUrl","width","height","crop","compositingMethod","uploadedOn"],"additionalProperties":false},"description":"Green-screen background scenes"},"warnings":{"type":"array","items":{"type":"string"},"description":"Non-fatal notes: 'only_first_page_imported' (multi-page PDFs), 'no_photo_areas_detected' (guests cannot be composited into this template)"}},"required":["id","name","createdDate","modifiedDate","isPublic","sizePixels","thumbnailUrl","isImporting","photoAreaCount","aiCustomPromptIds","aiPortraitIds","disabledCaptureTypes","sceneSelectionForced","transparentScene","scenes","warnings"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120,"description":"Template name"},"images":{"minItems":1,"maxItems":40,"type":"array","items":{"type":"object","properties":{"uploadPath":{"description":"storagePath from create_upload (after PUTting the bytes)","type":"string"},"sourceUrl":{"description":"Public https URL fetched server-side (must not redirect) — alternative to uploadPath","type":"string"}}}},"zipUploadPath":{"description":"storagePath from create_upload with purpose \"template-zip\" (after PUTting the bytes)","type":"string"},"zipSourceUrl":{"description":"Public https URL of a .zip of flat .png/.jpg layers, fetched server-side (must not redirect)","type":"string"},"disabledCaptureTypes":{"type":"array","items":{"type":"string","enum":["photo","boomerang","slowmo","video","gif","aiPhoto","aiCustomPrompt"]}}},"required":["name"]}}}}}},"/templates/{id}/scenes":{"post":{"operationId":"add_template_scene","summary":"Add a green-screen background scene to a template","description":"Guests captured in front of a green screen get composited onto the scene. Provide the image via uploadPath (create_upload, purpose \"scene\") or a public https sourceUrl. A 400px thumbnail is rendered automatically.","parameters":[{"name":"id","in":"path","required":true,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","minLength":1,"description":"Template id — use list_templates to find one"}}],"x-required-scope":"read-write","responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"createdDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"modifiedDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"isPublic":{"type":"boolean","description":"Public library items are duplicable but not editable"},"sizePixels":{"anyOf":[{"type":"array","items":{"type":"number"}},{"type":"null"}]},"thumbnailUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Stable upload-time URL when available (never expires); otherwise a 7-day signed URL — refresh by re-listing"},"isImporting":{"type":"boolean","description":"true = still importing; sizePixels/layers/thumbnail are placeholders, poll until false"},"photoAreaCount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Media-layer count; AI prompts/portraits attach only when this is exactly 1"},"aiCustomPromptIds":{"type":"array","items":{"type":"string"},"description":"Attached AI prompts (see list_ai_prompts)"},"aiPortraitIds":{"type":"array","items":{"type":"string"},"description":"Attached AI portrait styles (see list_ai_portraits)"},"disabledCaptureTypes":{"type":"array","items":{"type":"string"}},"sceneSelectionForced":{"type":"boolean"},"transparentScene":{"type":"boolean","description":"Offers a \"no scene\" option to guests"},"scenes":{"type":"array","items":{"type":"object","properties":{"storagePath":{"type":"string","description":"Key for update_template_scene / remove_template_scene"},"thumbnailUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"7-day signed URL — re-fetch to refresh"},"width":{"anyOf":[{"type":"number"},{"type":"null"}]},"height":{"anyOf":[{"type":"number"},{"type":"null"}]},"crop":{"anyOf":[{"type":"string","enum":["scene","photo"]},{"type":"null"}]},"compositingMethod":{"anyOf":[{"type":"string","enum":["sourceOver","addition","colorBlend","colorDodgeBlend","differenceBlend","exclusionBlend","lightenBlend","linearDodgeBlend","luminosityBlend","minimumCompositing","overlayBlend","screenBlend","softLightBlend"]},{"type":"null"}]},"uploadedOn":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["storagePath","thumbnailUrl","width","height","crop","compositingMethod","uploadedOn"],"additionalProperties":false},"description":"Green-screen background scenes"}},"required":["id","name","createdDate","modifiedDate","isPublic","sizePixels","thumbnailUrl","isImporting","photoAreaCount","aiCustomPromptIds","aiPortraitIds","disabledCaptureTypes","sceneSelectionForced","transparentScene","scenes"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"uploadPath":{"description":"storagePath from create_upload (after PUTting the bytes)","type":"string"},"sourceUrl":{"description":"Public https URL fetched server-side (must not redirect) — alternative to uploadPath","type":"string"},"crop":{"type":"string","enum":["scene","photo"]},"compositingMethod":{"type":"string","enum":["sourceOver","addition","colorBlend","colorDodgeBlend","differenceBlend","exclusionBlend","lightenBlend","linearDodgeBlend","luminosityBlend","minimumCompositing","overlayBlend","screenBlend","softLightBlend"]}}}}}}},"patch":{"operationId":"update_template_scene","summary":"Update a scene's crop or compositing method","description":"Scenes are keyed by storagePath (from the template DTO scenes[]). compositingMethod: null resets to the default (sourceOver).","parameters":[{"name":"id","in":"path","required":true,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","minLength":1,"description":"Template id — use list_templates to find one"}}],"x-required-scope":"read-write","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"createdDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"modifiedDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"isPublic":{"type":"boolean","description":"Public library items are duplicable but not editable"},"sizePixels":{"anyOf":[{"type":"array","items":{"type":"number"}},{"type":"null"}]},"thumbnailUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Stable upload-time URL when available (never expires); otherwise a 7-day signed URL — refresh by re-listing"},"isImporting":{"type":"boolean","description":"true = still importing; sizePixels/layers/thumbnail are placeholders, poll until false"},"photoAreaCount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Media-layer count; AI prompts/portraits attach only when this is exactly 1"},"aiCustomPromptIds":{"type":"array","items":{"type":"string"},"description":"Attached AI prompts (see list_ai_prompts)"},"aiPortraitIds":{"type":"array","items":{"type":"string"},"description":"Attached AI portrait styles (see list_ai_portraits)"},"disabledCaptureTypes":{"type":"array","items":{"type":"string"}},"sceneSelectionForced":{"type":"boolean"},"transparentScene":{"type":"boolean","description":"Offers a \"no scene\" option to guests"},"scenes":{"type":"array","items":{"type":"object","properties":{"storagePath":{"type":"string","description":"Key for update_template_scene / remove_template_scene"},"thumbnailUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"7-day signed URL — re-fetch to refresh"},"width":{"anyOf":[{"type":"number"},{"type":"null"}]},"height":{"anyOf":[{"type":"number"},{"type":"null"}]},"crop":{"anyOf":[{"type":"string","enum":["scene","photo"]},{"type":"null"}]},"compositingMethod":{"anyOf":[{"type":"string","enum":["sourceOver","addition","colorBlend","colorDodgeBlend","differenceBlend","exclusionBlend","lightenBlend","linearDodgeBlend","luminosityBlend","minimumCompositing","overlayBlend","screenBlend","softLightBlend"]},{"type":"null"}]},"uploadedOn":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["storagePath","thumbnailUrl","width","height","crop","compositingMethod","uploadedOn"],"additionalProperties":false},"description":"Green-screen background scenes"}},"required":["id","name","createdDate","modifiedDate","isPublic","sizePixels","thumbnailUrl","isImporting","photoAreaCount","aiCustomPromptIds","aiPortraitIds","disabledCaptureTypes","sceneSelectionForced","transparentScene","scenes"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"storagePath":{"type":"string","minLength":1,"description":"Scene key from the template's scenes[] (get_template) — not a file path you choose"},"crop":{"type":"string","enum":["scene","photo"]},"compositingMethod":{"anyOf":[{"type":"string","enum":["sourceOver","addition","colorBlend","colorDodgeBlend","differenceBlend","exclusionBlend","lightenBlend","linearDodgeBlend","luminosityBlend","minimumCompositing","overlayBlend","screenBlend","softLightBlend"]},{"type":"null"}]}},"required":["storagePath"]}}}}},"delete":{"operationId":"remove_template_scene","summary":"Remove a scene from a template (deletes its image files)","parameters":[{"name":"id","in":"path","required":true,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","minLength":1,"description":"Template id — use list_templates to find one"}},{"name":"storagePath","in":"query","required":true,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","minLength":1,"description":"From the template DTO scenes[].storagePath"},"description":"From the template DTO scenes[].storagePath"}],"x-required-scope":"read-write","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"createdDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"modifiedDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"isPublic":{"type":"boolean","description":"Public library items are duplicable but not editable"},"sizePixels":{"anyOf":[{"type":"array","items":{"type":"number"}},{"type":"null"}]},"thumbnailUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Stable upload-time URL when available (never expires); otherwise a 7-day signed URL — refresh by re-listing"},"isImporting":{"type":"boolean","description":"true = still importing; sizePixels/layers/thumbnail are placeholders, poll until false"},"photoAreaCount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Media-layer count; AI prompts/portraits attach only when this is exactly 1"},"aiCustomPromptIds":{"type":"array","items":{"type":"string"},"description":"Attached AI prompts (see list_ai_prompts)"},"aiPortraitIds":{"type":"array","items":{"type":"string"},"description":"Attached AI portrait styles (see list_ai_portraits)"},"disabledCaptureTypes":{"type":"array","items":{"type":"string"}},"sceneSelectionForced":{"type":"boolean"},"transparentScene":{"type":"boolean","description":"Offers a \"no scene\" option to guests"},"scenes":{"type":"array","items":{"type":"object","properties":{"storagePath":{"type":"string","description":"Key for update_template_scene / remove_template_scene"},"thumbnailUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"7-day signed URL — re-fetch to refresh"},"width":{"anyOf":[{"type":"number"},{"type":"null"}]},"height":{"anyOf":[{"type":"number"},{"type":"null"}]},"crop":{"anyOf":[{"type":"string","enum":["scene","photo"]},{"type":"null"}]},"compositingMethod":{"anyOf":[{"type":"string","enum":["sourceOver","addition","colorBlend","colorDodgeBlend","differenceBlend","exclusionBlend","lightenBlend","linearDodgeBlend","luminosityBlend","minimumCompositing","overlayBlend","screenBlend","softLightBlend"]},{"type":"null"}]},"uploadedOn":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["storagePath","thumbnailUrl","width","height","crop","compositingMethod","uploadedOn"],"additionalProperties":false},"description":"Green-screen background scenes"}},"required":["id","name","createdDate","modifiedDate","isPublic","sizePixels","thumbnailUrl","isImporting","photoAreaCount","aiCustomPromptIds","aiPortraitIds","disabledCaptureTypes","sceneSelectionForced","transparentScene","scenes"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/ai-prompts":{"get":{"operationId":"list_ai_prompts","summary":"List AI photo prompts (the catalog guests can pick from)","description":"Own prompts plus the public/default catalog, each with a browser-fetchable previewImageUrl (7-day signed — re-list to refresh; never store long-term). Sibling of list_ai_portraits.","parameters":[{"name":"limit","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","default":25,"type":"integer","minimum":1,"maximum":100}},{"name":"cursor","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string"}},{"name":"includePublic","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","description":"false = only prompts private to this account","type":"boolean"},"description":"false = only prompts private to this account"}],"x-required-scope":"read","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"createdDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"modifiedDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"isPublic":{"type":"boolean"},"previewImageUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Browser-fetchable preview thumbnail (7-day signed URL — refresh by re-listing); null = no preview generated yet"},"model":{"anyOf":[{"type":"string"},{"type":"null"}]},"disabled":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"rerollsAllowed":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"Rerolls guests get; null = the iPad device default"},"promptText":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The prompt text (first variant). null when the prompt is managed by the dashboard prompt editor (hasPromptDoc) — its text is not editable via API."},"hasPromptDoc":{"type":"boolean","description":"true = built in the dashboard prompt editor; text/fields are dashboard-managed"},"referenceImages":{"type":"array","items":{"type":"object","properties":{"storagePath":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pass to remove_ai_prompt_reference_image. null on PUBLIC catalog prompts: the path is namespaced by the account that created them, so returning it would disclose another account's uid and our storage layout — and they cannot be edited anyway."},"url":{"type":"string","description":"Browser-fetchable (7-day signed URL — re-fetch to refresh)"}},"required":["storagePath","url"],"additionalProperties":false},"description":"Style reference images sent with every generation"},"hasReferenceImages":{"type":"boolean"}},"required":["id","name","createdDate","modifiedDate","isPublic","previewImageUrl","model","disabled","rerollsAllowed","promptText","hasPromptDoc","referenceImages","hasReferenceImages"],"additionalProperties":false}},"hasMore":{"type":"boolean"},"nextCursor":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["data","hasMore","nextCursor"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}}},"post":{"operationId":"create_ai_prompt","summary":"Create an AI photo prompt","description":"Mirrors the dashboard \"New AI prompt\" flow: a plain-text prompt sent to the image model with each guest photo. Creating costs nothing — generation consumes AI credits (see get_ai_credits). Attach style reference images with add_ai_prompt_reference_image; dynamic elements (guest-filled fields) are dashboard-only.","x-required-scope":"read-write","responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"createdDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"modifiedDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"isPublic":{"type":"boolean"},"previewImageUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Browser-fetchable preview thumbnail (7-day signed URL — refresh by re-listing); null = no preview generated yet"},"model":{"anyOf":[{"type":"string"},{"type":"null"}]},"disabled":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"rerollsAllowed":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"Rerolls guests get; null = the iPad device default"},"promptText":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The prompt text (first variant). null when the prompt is managed by the dashboard prompt editor (hasPromptDoc) — its text is not editable via API."},"hasPromptDoc":{"type":"boolean","description":"true = built in the dashboard prompt editor; text/fields are dashboard-managed"},"referenceImages":{"type":"array","items":{"type":"object","properties":{"storagePath":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pass to remove_ai_prompt_reference_image. null on PUBLIC catalog prompts: the path is namespaced by the account that created them, so returning it would disclose another account's uid and our storage layout — and they cannot be edited anyway."},"url":{"type":"string","description":"Browser-fetchable (7-day signed URL — re-fetch to refresh)"}},"required":["storagePath","url"],"additionalProperties":false},"description":"Style reference images sent with every generation"},"hasReferenceImages":{"type":"boolean"}},"required":["id","name","createdDate","modifiedDate","isPublic","previewImageUrl","model","disabled","rerollsAllowed","promptText","hasPromptDoc","referenceImages","hasReferenceImages"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"promptText":{"type":"string","minLength":1,"maxLength":5000,"description":"Sent to the image model verbatim"},"model":{"description":"Image model; default nano-banana-2-2k","type":"string","enum":["nano-banana","nano-banana-pro-2k","nano-banana-pro-4k","nano-banana-2-2k","nano-banana-2-4k"]},"rerollsAllowed":{"description":"Rerolls guests get; omit for the iPad device default","type":"integer","minimum":0,"maximum":20}},"required":["name","promptText"]}}}}}},"/ai-prompts/{id}":{"get":{"operationId":"get_ai_prompt","summary":"Get one AI prompt (yours or a public one)","parameters":[{"name":"id","in":"path","required":true,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","minLength":1}}],"x-required-scope":"read","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"createdDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"modifiedDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"isPublic":{"type":"boolean"},"previewImageUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Browser-fetchable preview thumbnail (7-day signed URL — refresh by re-listing); null = no preview generated yet"},"model":{"anyOf":[{"type":"string"},{"type":"null"}]},"disabled":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"rerollsAllowed":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"Rerolls guests get; null = the iPad device default"},"promptText":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The prompt text (first variant). null when the prompt is managed by the dashboard prompt editor (hasPromptDoc) — its text is not editable via API."},"hasPromptDoc":{"type":"boolean","description":"true = built in the dashboard prompt editor; text/fields are dashboard-managed"},"referenceImages":{"type":"array","items":{"type":"object","properties":{"storagePath":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pass to remove_ai_prompt_reference_image. null on PUBLIC catalog prompts: the path is namespaced by the account that created them, so returning it would disclose another account's uid and our storage layout — and they cannot be edited anyway."},"url":{"type":"string","description":"Browser-fetchable (7-day signed URL — re-fetch to refresh)"}},"required":["storagePath","url"],"additionalProperties":false},"description":"Style reference images sent with every generation"},"hasReferenceImages":{"type":"boolean"}},"required":["id","name","createdDate","modifiedDate","isPublic","previewImageUrl","model","disabled","rerollsAllowed","promptText","hasPromptDoc","referenceImages","hasReferenceImages"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}}},"patch":{"operationId":"update_ai_prompt","summary":"Update an AI prompt (name, text, model, enabled state, rerolls)","description":"promptText is editable only for plain prompts — prompts built in the dashboard prompt editor (hasPromptDoc) keep their text/fields dashboard-managed. rerollsAllowed: null restores the iPad device default.","parameters":[{"name":"id","in":"path","required":true,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","minLength":1}}],"x-required-scope":"read-write","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"createdDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"modifiedDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"isPublic":{"type":"boolean"},"previewImageUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Browser-fetchable preview thumbnail (7-day signed URL — refresh by re-listing); null = no preview generated yet"},"model":{"anyOf":[{"type":"string"},{"type":"null"}]},"disabled":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"rerollsAllowed":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"Rerolls guests get; null = the iPad device default"},"promptText":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The prompt text (first variant). null when the prompt is managed by the dashboard prompt editor (hasPromptDoc) — its text is not editable via API."},"hasPromptDoc":{"type":"boolean","description":"true = built in the dashboard prompt editor; text/fields are dashboard-managed"},"referenceImages":{"type":"array","items":{"type":"object","properties":{"storagePath":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pass to remove_ai_prompt_reference_image. null on PUBLIC catalog prompts: the path is namespaced by the account that created them, so returning it would disclose another account's uid and our storage layout — and they cannot be edited anyway."},"url":{"type":"string","description":"Browser-fetchable (7-day signed URL — re-fetch to refresh)"}},"required":["storagePath","url"],"additionalProperties":false},"description":"Style reference images sent with every generation"},"hasReferenceImages":{"type":"boolean"}},"required":["id","name","createdDate","modifiedDate","isPublic","previewImageUrl","model","disabled","rerollsAllowed","promptText","hasPromptDoc","referenceImages","hasReferenceImages"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"promptText":{"type":"string","minLength":1,"maxLength":5000},"model":{"type":"string","enum":["nano-banana","nano-banana-pro-2k","nano-banana-pro-4k","nano-banana-2-2k","nano-banana-2-4k"]},"disabled":{"type":"boolean"},"rerollsAllowed":{"anyOf":[{"type":"integer","minimum":0,"maximum":20},{"type":"null"}]}}}}}}},"delete":{"operationId":"delete_ai_prompt","summary":"Delete an AI prompt (removes it from any templates using it)","parameters":[{"name":"id","in":"path","required":true,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","minLength":1}}],"x-required-scope":"read-write","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"deleted":{"type":"boolean","const":true},"id":{"type":"string"}},"required":["deleted","id"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/ai-prompts/{id}/reference-images":{"post":{"operationId":"add_ai_prompt_reference_image","summary":"Attach a style reference image to an AI prompt","description":"Provide the image via uploadPath (create_upload + PUT) or a public https sourceUrl. Stored as uploaded — generation downscales to 1536px as needed. Each model caps how many reference images are used (nano-banana: 2, newer models: 13).","parameters":[{"name":"id","in":"path","required":true,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","minLength":1}}],"x-required-scope":"read-write","responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"createdDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"modifiedDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"isPublic":{"type":"boolean"},"previewImageUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Browser-fetchable preview thumbnail (7-day signed URL — refresh by re-listing); null = no preview generated yet"},"model":{"anyOf":[{"type":"string"},{"type":"null"}]},"disabled":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"rerollsAllowed":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"Rerolls guests get; null = the iPad device default"},"promptText":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The prompt text (first variant). null when the prompt is managed by the dashboard prompt editor (hasPromptDoc) — its text is not editable via API."},"hasPromptDoc":{"type":"boolean","description":"true = built in the dashboard prompt editor; text/fields are dashboard-managed"},"referenceImages":{"type":"array","items":{"type":"object","properties":{"storagePath":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pass to remove_ai_prompt_reference_image. null on PUBLIC catalog prompts: the path is namespaced by the account that created them, so returning it would disclose another account's uid and our storage layout — and they cannot be edited anyway."},"url":{"type":"string","description":"Browser-fetchable (7-day signed URL — re-fetch to refresh)"}},"required":["storagePath","url"],"additionalProperties":false},"description":"Style reference images sent with every generation"},"hasReferenceImages":{"type":"boolean"}},"required":["id","name","createdDate","modifiedDate","isPublic","previewImageUrl","model","disabled","rerollsAllowed","promptText","hasPromptDoc","referenceImages","hasReferenceImages"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"uploadPath":{"description":"storagePath from create_upload (after PUTting the bytes)","type":"string"},"sourceUrl":{"description":"Public https URL fetched server-side (must not redirect) — alternative to uploadPath","type":"string"}}}}}}},"delete":{"operationId":"remove_ai_prompt_reference_image","summary":"Remove a reference image from an AI prompt","parameters":[{"name":"id","in":"path","required":true,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","minLength":1}},{"name":"storagePath","in":"query","required":true,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","minLength":1,"description":"From the prompt DTO referenceImages[].storagePath"},"description":"From the prompt DTO referenceImages[].storagePath"}],"x-required-scope":"read-write","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"createdDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"modifiedDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"isPublic":{"type":"boolean"},"previewImageUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Browser-fetchable preview thumbnail (7-day signed URL — refresh by re-listing); null = no preview generated yet"},"model":{"anyOf":[{"type":"string"},{"type":"null"}]},"disabled":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"rerollsAllowed":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"Rerolls guests get; null = the iPad device default"},"promptText":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The prompt text (first variant). null when the prompt is managed by the dashboard prompt editor (hasPromptDoc) — its text is not editable via API."},"hasPromptDoc":{"type":"boolean","description":"true = built in the dashboard prompt editor; text/fields are dashboard-managed"},"referenceImages":{"type":"array","items":{"type":"object","properties":{"storagePath":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pass to remove_ai_prompt_reference_image. null on PUBLIC catalog prompts: the path is namespaced by the account that created them, so returning it would disclose another account's uid and our storage layout — and they cannot be edited anyway."},"url":{"type":"string","description":"Browser-fetchable (7-day signed URL — re-fetch to refresh)"}},"required":["storagePath","url"],"additionalProperties":false},"description":"Style reference images sent with every generation"},"hasReferenceImages":{"type":"boolean"}},"required":["id","name","createdDate","modifiedDate","isPublic","previewImageUrl","model","disabled","rerollsAllowed","promptText","hasPromptDoc","referenceImages","hasReferenceImages"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/ai-prompts/{id}/preview-image":{"put":{"operationId":"set_ai_prompt_preview_image","summary":"Set an AI prompt's preview thumbnail","description":"The image operator webapps show END customers when they pick a style (previewImageUrl). Provide via uploadPath or sourceUrl.","parameters":[{"name":"id","in":"path","required":true,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","minLength":1}}],"x-required-scope":"read-write","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"createdDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"modifiedDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"isPublic":{"type":"boolean"},"previewImageUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Browser-fetchable preview thumbnail (7-day signed URL — refresh by re-listing); null = no preview generated yet"},"model":{"anyOf":[{"type":"string"},{"type":"null"}]},"disabled":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"rerollsAllowed":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"Rerolls guests get; null = the iPad device default"},"promptText":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The prompt text (first variant). null when the prompt is managed by the dashboard prompt editor (hasPromptDoc) — its text is not editable via API."},"hasPromptDoc":{"type":"boolean","description":"true = built in the dashboard prompt editor; text/fields are dashboard-managed"},"referenceImages":{"type":"array","items":{"type":"object","properties":{"storagePath":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pass to remove_ai_prompt_reference_image. null on PUBLIC catalog prompts: the path is namespaced by the account that created them, so returning it would disclose another account's uid and our storage layout — and they cannot be edited anyway."},"url":{"type":"string","description":"Browser-fetchable (7-day signed URL — re-fetch to refresh)"}},"required":["storagePath","url"],"additionalProperties":false},"description":"Style reference images sent with every generation"},"hasReferenceImages":{"type":"boolean"}},"required":["id","name","createdDate","modifiedDate","isPublic","previewImageUrl","model","disabled","rerollsAllowed","promptText","hasPromptDoc","referenceImages","hasReferenceImages"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"uploadPath":{"description":"storagePath from create_upload (after PUTting the bytes)","type":"string"},"sourceUrl":{"description":"Public https URL fetched server-side (must not redirect) — alternative to uploadPath","type":"string"}}}}}}}},"/ai-prompts/{id}/duplicate":{"post":{"operationId":"duplicate_ai_prompt","summary":"Duplicate an AI prompt (e.g. to customize a public one)","description":"Copies the prompt text, settings, dynamic fields, and reference images. Works on your prompts and public ones — the only way to get a prompt with dynamic fields via API (create_ai_prompt makes plain-text prompts from scratch).","parameters":[{"name":"id","in":"path","required":true,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","minLength":1}}],"x-required-scope":"read-write","responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"createdDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"modifiedDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"isPublic":{"type":"boolean"},"previewImageUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Browser-fetchable preview thumbnail (7-day signed URL — refresh by re-listing); null = no preview generated yet"},"model":{"anyOf":[{"type":"string"},{"type":"null"}]},"disabled":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"rerollsAllowed":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"Rerolls guests get; null = the iPad device default"},"promptText":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The prompt text (first variant). null when the prompt is managed by the dashboard prompt editor (hasPromptDoc) — its text is not editable via API."},"hasPromptDoc":{"type":"boolean","description":"true = built in the dashboard prompt editor; text/fields are dashboard-managed"},"referenceImages":{"type":"array","items":{"type":"object","properties":{"storagePath":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pass to remove_ai_prompt_reference_image. null on PUBLIC catalog prompts: the path is namespaced by the account that created them, so returning it would disclose another account's uid and our storage layout — and they cannot be edited anyway."},"url":{"type":"string","description":"Browser-fetchable (7-day signed URL — re-fetch to refresh)"}},"required":["storagePath","url"],"additionalProperties":false},"description":"Style reference images sent with every generation"},"hasReferenceImages":{"type":"boolean"}},"required":["id","name","createdDate","modifiedDate","isPublic","previewImageUrl","model","disabled","rerollsAllowed","promptText","hasPromptDoc","referenceImages","hasReferenceImages"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/ai-portraits":{"get":{"operationId":"list_ai_portraits","summary":"List AI portrait styles (the catalog guests can pick from)","description":"The default catalog plus any styles private to your account, newest first, each with a browser-fetchable previewImageUrl (public catalog: stable, never expires; account-private: 7-day signed — re-list to refresh). Built for operator webapps that let end customers choose a style. Sibling of list_ai_prompts.","parameters":[{"name":"limit","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","default":25,"type":"integer","minimum":1,"maximum":100}},{"name":"cursor","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string"}},{"name":"includePublic","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","description":"false = only styles private to this account","type":"boolean"},"description":"false = only styles private to this account"}],"x-required-scope":"read","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Upstream style-category label (values like 'public', 'custom', 'aiPortrait') — informational only; availability is governed by isPublic"},"isPublic":{"type":"boolean","description":"true = available to every account (use this, not type, to pick catalog entries); false = private to this account"},"previewImageUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Browser-fetchable thumbnail. Public catalog entries get a stable URL that never expires; account-private ones get a 7-day signed URL — refresh by re-listing."},"createdDate":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","name","type","isPublic","previewImageUrl","createdDate"],"additionalProperties":false}},"hasMore":{"type":"boolean"},"nextCursor":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["data","hasMore","nextCursor"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/ai-portraits/{portraitId}":{"get":{"operationId":"get_ai_portrait","summary":"Get one AI portrait style (yours or a public one)","parameters":[{"name":"portraitId","in":"path","required":true,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","minLength":1}}],"x-required-scope":"read","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Upstream style-category label (values like 'public', 'custom', 'aiPortrait') — informational only; availability is governed by isPublic"},"isPublic":{"type":"boolean","description":"true = available to every account (use this, not type, to pick catalog entries); false = private to this account"},"previewImageUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Browser-fetchable thumbnail. Public catalog entries get a stable URL that never expires; account-private ones get a 7-day signed URL — refresh by re-listing."},"createdDate":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","name","type","isPublic","previewImageUrl","createdDate"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/account/ai-credits":{"get":{"operationId":"get_ai_credits","summary":"The account's AI image credit balance","description":"Each AI generation costs 1-4 credits depending on the model. Balance low before an event? The operator tops up in the dashboard (Account → AI credits).","x-required-scope":"read","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"balance":{"type":"number","description":"Remaining AI image credits"}},"required":["balance"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/events/{eventId}/stats":{"get":{"operationId":"get_event_stats","summary":"Guest-engagement analytics for one event (views, downloads, shares, top media)","description":"Lifetime totals plus a daily time-series for the range (default last 90 days, max 366). Brand-new events return zeroed totals. timeseries/captureTypes are null for legacy galleries that predate fine-grained tracking. topMedia image URLs are ~7-day signed — re-fetch to refresh. Use list_pay_transactions for revenue; this is engagement.","parameters":[{"name":"eventId","in":"path","required":true,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","minLength":1}},{"name":"from","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"YYYY-MM-DD (UTC day) — analytics are day-granular, unlike the full ISO timestamps elsewhere"},"description":"YYYY-MM-DD (UTC day) — analytics are day-granular, unlike the full ISO timestamps elsewhere"},{"name":"to","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"YYYY-MM-DD (UTC day) — analytics are day-granular, unlike the full ISO timestamps elsewhere"},"description":"YYYY-MM-DD (UTC day) — analytics are day-granular, unlike the full ISO timestamps elsewhere"},{"name":"response_format","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","default":"detailed","description":"'concise' returns timeseries: null and topMedia: null (the two largest sections) — totals and leaderboards stay","type":"string","enum":["detailed","concise"]},"description":"'concise' returns timeseries: null and topMedia: null (the two largest sections) — totals and leaderboards stay"}],"x-required-scope":"read","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"eventId":{"type":"string"},"galleryId":{"type":"string"},"totals":{"type":"object","properties":{"views":{"type":"number"},"sessionViews":{"type":"number"},"galleryViews":{"type":"number"},"slideshowViews":{"type":"number"},"mediaViews":{"type":"number"},"downloads":{"type":"number"},"shares":{"type":"object","properties":{"email":{"type":"number"},"sms":{"type":"number"},"web":{"type":"number"},"total":{"type":"number"}},"required":["email","sms","web","total"],"additionalProperties":false,"description":"Rollup: web = shareChannels 'copy-link' + 'web-share' combined"},"sessionCount":{"type":"number"},"mediaCount":{"type":"number"},"uniqueVisitors":{"type":"number"},"uniqueVisitorDays":{"type":"number"},"kBytes":{"description":"Total stored media size (kilobytes)","type":"number"},"aiPortraitCount":{"description":"Prefers the booth.events credits ledger (dashboard parity), SG total as fallback","type":"number"},"aiCustomPromptCount":{"type":"number"}},"required":["views","sessionViews","galleryViews","slideshowViews","mediaViews","downloads","shares","sessionCount","mediaCount","uniqueVisitors"],"additionalProperties":false},"zeroFilledTotals":{"description":"Totals the gallery had no record for, reported as 0. On a brand-new event that means \"nothing yet\"; on a legacy gallery it can mean the metric was never tracked — treat those as unknown rather than as a real zero.","type":"array","items":{"type":"string"}},"timeseries":{"anyOf":[{"type":"object","properties":{"start":{"type":"string"},"end":{"type":"string"},"days":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string"},"views":{"type":"number"},"mediaViews":{"type":"number"},"downloads":{"type":"number"},"shares":{"type":"number"},"uniqueVisitors":{"type":"number"}},"required":["date","views","mediaViews","downloads","shares","uniqueVisitors"],"additionalProperties":false}}},"required":["start","end","days"],"additionalProperties":false},{"type":"null"}],"description":"null = legacy gallery, fine-grained tracking predates it"},"shareChannels":{"type":"array","items":{"type":"object","properties":{"channel":{"type":"string"},"count":{"type":"number"}},"required":["channel","count"],"additionalProperties":false},"description":"Per-channel breakdown ('email', 'sms', 'copy-link', 'web-share') — finer than totals.shares"},"devices":{"anyOf":[{"type":"object","properties":{"mobile":{"type":"number"},"desktop":{"type":"number"}},"required":["mobile","desktop"],"additionalProperties":false},{"type":"null"}]},"captureTypes":{"anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"number"}},{"type":"null"}],"description":"Per-capture-type media counts (photo, video, aiPhoto, …); null = no data yet"},"topAiPrompts":{"anyOf":[{"type":"array","items":{"type":"object","properties":{"promptId":{"type":"string"},"count":{"type":"number"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Resolved server-side; null = prompt since deleted"},"previewImageUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"7-day signed URL — re-fetch to refresh"}},"required":["promptId","count","name","previewImageUrl"],"additionalProperties":false}},{"type":"null"}],"description":"Most-used AI prompts (max 10); null = legacy gallery"},"topAiPortraits":{"anyOf":[{"type":"array","items":{"type":"object","properties":{"portraitId":{"type":"string"},"count":{"type":"number"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"previewImageUrl":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["portraitId","count","name","previewImageUrl"],"additionalProperties":false}},{"type":"null"}]},"topMedia":{"anyOf":[{"type":"array","items":{"type":"object","properties":{"media":{"type":"object","properties":{"id":{"type":"string"},"thumbUrl":{"description":"~7-day signed — re-fetch to refresh","type":"string"},"fullUrl":{"type":"string"},"width":{"type":"number"},"height":{"type":"number"},"contentType":{"type":"string"},"filename":{"type":"string"}},"required":["id"],"additionalProperties":false},"views":{"type":"number"},"downloads":{"type":"number"},"shares":{"type":"number"}},"required":["media","views","downloads","shares"],"additionalProperties":false}},{"type":"null"}]},"aiCreditsUsed":{"description":"AI credits consumed by this event (booth.events credits ledger)","type":"number"},"trackingSince":{"description":"First day with fine-grained data (YYYY-MM-DD)","type":"string"}},"required":["eventId","galleryId","totals","timeseries","shareChannels","devices","captureTypes","topAiPrompts","topAiPortraits","topMedia"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/account/analytics":{"get":{"operationId":"get_account_analytics","summary":"Account-wide analytics: engagement totals, capture types, AI usage, top events","description":"Cross-event rollup incl. hard-deleted history (default range last 365 days, max 750; the range only affects the daily series — totals are lifetime). EXPENSIVE: computed on read across all galleries; cache results rather than polling.","parameters":[{"name":"from","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"YYYY-MM-DD (UTC day) — analytics are day-granular, unlike the full ISO timestamps elsewhere"},"description":"YYYY-MM-DD (UTC day) — analytics are day-granular, unlike the full ISO timestamps elsewhere"},{"name":"to","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"YYYY-MM-DD (UTC day) — analytics are day-granular, unlike the full ISO timestamps elsewhere"},"description":"YYYY-MM-DD (UTC day) — analytics are day-granular, unlike the full ISO timestamps elsewhere"}],"x-required-scope":"read","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"totals":{"type":"object","properties":{"galleryCount":{"type":"number"},"galleriesWithMedia":{"type":"number"},"mediaCountTotal":{"type":"number"},"sessionCountTotal":{"type":"number"},"sentEmailCountTotal":{"type":"number"},"sentSmsCountTotal":{"type":"number"},"engagement":{"type":"object","properties":{"galleryViews":{"type":"number"},"sessionViews":{"type":"number"},"slideshowViews":{"type":"number"},"mediaViews":{"type":"number"},"downloads":{"type":"number"},"shares":{"type":"number"},"uniqueVisitors":{"type":"number"},"devices":{"type":"object","properties":{"mobile":{"type":"number"},"desktop":{"type":"number"}},"required":["mobile","desktop"],"additionalProperties":false}},"required":["galleryViews","sessionViews","slideshowViews","mediaViews","downloads","shares","uniqueVisitors","devices"],"additionalProperties":false},"captureTypes":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"number"}},"ai":{"type":"object","properties":{"promptsGenerated":{"type":"number"},"portraits":{"type":"number"},"creditsUsed":{"type":"number"}},"required":["promptsGenerated","portraits","creditsUsed"],"additionalProperties":false}},"required":["galleryCount","galleriesWithMedia","mediaCountTotal","sessionCountTotal","sentEmailCountTotal","sentSmsCountTotal","engagement","captureTypes","ai"],"additionalProperties":false},"daily":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string"}},"required":["date"],"additionalProperties":false}},"topEvents":{"type":"array","items":{"type":"object","properties":{"galleryId":{"type":"string"},"eventId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Resolved from your events; null = no matching event"},"name":{"type":"string"},"mediaCount":{"type":"number"},"sessionCount":{"type":"number"},"expired":{"type":"boolean"}},"required":["galleryId","eventId","name","mediaCount","sessionCount","expired"],"additionalProperties":false}},"topEventsByAi":{"type":"array","items":{"type":"object","properties":{"galleryId":{"type":"string"},"eventId":{"anyOf":[{"type":"string"},{"type":"null"}]},"name":{"type":"string"},"aiCreationCount":{"type":"number"},"expired":{"type":"boolean"}},"required":["galleryId","eventId","name","aiCreationCount","expired"],"additionalProperties":false}}},"required":["totals","daily","topEvents","topEventsByAi"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/events/{eventId}/report":{"get":{"operationId":"get_event_report","summary":"The client report: config, publish state, and the shareable link","parameters":[{"name":"eventId","in":"path","required":true,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","minLength":1}}],"x-required-scope":"read","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"eventId":{"type":"string"},"published":{"type":"boolean"},"reportUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The shareable client link (stable until regenerated) — null until first publish"},"previewUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Same link with preview=1 — renders even while unpublished"},"config":{"anyOf":[{"type":"object","properties":{"title":{"description":"Default: the event name","type":"string","maxLength":120},"introMessage":{"description":"Personal note to the client","type":"string","maxLength":500},"accentColor":{"description":"#rrggbb","type":"string","maxLength":20},"logoUrl":{"description":"'' = explicitly no logo","type":"string","maxLength":2000},"showHeroBackground":{"type":"boolean"},"sections":{"type":"object","properties":{"trend":{"type":"boolean"},"topPhotos":{"type":"boolean"},"shareChannels":{"type":"boolean"},"devices":{"type":"boolean"}},"additionalProperties":false},"hiddenMetrics":{"type":"array","items":{"type":"string"}},"topPhotosCount":{"anyOf":[{"type":"number","const":4},{"type":"number","const":8},{"type":"number","const":12}]},"range":{"description":"YYYY-MM-DD; absent = all-time","type":"object","properties":{"from":{"type":"string"},"to":{"type":"string"}},"additionalProperties":false},"hideBoothEventsBranding":{"description":"Requires white-labeling entitlement","type":"boolean"}},"additionalProperties":false},{"type":"null"}],"description":"null = never configured (defaults apply)"}},"required":["eventId","published","reportUrl","previewUrl","config"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}}},"patch":{"operationId":"update_event_report","summary":"Update the client report's configuration","description":"REPLACES the whole config (not a merge) — send the complete desired config each time (a null config from get_event_report means never configured: start from {}). Publishing state and the link are controlled by publish_event_report and never appear inside config.","parameters":[{"name":"eventId","in":"path","required":true,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","minLength":1}}],"x-required-scope":"read-write","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"eventId":{"type":"string"},"published":{"type":"boolean"},"reportUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The shareable client link (stable until regenerated) — null until first publish"},"previewUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Same link with preview=1 — renders even while unpublished"},"config":{"anyOf":[{"type":"object","properties":{"title":{"description":"Default: the event name","type":"string","maxLength":120},"introMessage":{"description":"Personal note to the client","type":"string","maxLength":500},"accentColor":{"description":"#rrggbb","type":"string","maxLength":20},"logoUrl":{"description":"'' = explicitly no logo","type":"string","maxLength":2000},"showHeroBackground":{"type":"boolean"},"sections":{"type":"object","properties":{"trend":{"type":"boolean"},"topPhotos":{"type":"boolean"},"shareChannels":{"type":"boolean"},"devices":{"type":"boolean"}},"additionalProperties":false},"hiddenMetrics":{"type":"array","items":{"type":"string"}},"topPhotosCount":{"anyOf":[{"type":"number","const":4},{"type":"number","const":8},{"type":"number","const":12}]},"range":{"description":"YYYY-MM-DD; absent = all-time","type":"object","properties":{"from":{"type":"string"},"to":{"type":"string"}},"additionalProperties":false},"hideBoothEventsBranding":{"description":"Requires white-labeling entitlement","type":"boolean"}},"additionalProperties":false},{"type":"null"}],"description":"null = never configured (defaults apply)"}},"required":["eventId","published","reportUrl","previewUrl","config"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"config":{"type":"object","properties":{"title":{"description":"Default: the event name","type":"string","maxLength":120},"introMessage":{"description":"Personal note to the client","type":"string","maxLength":500},"accentColor":{"description":"#rrggbb","type":"string","maxLength":20},"logoUrl":{"description":"'' = explicitly no logo","type":"string","maxLength":2000},"showHeroBackground":{"type":"boolean"},"sections":{"type":"object","properties":{"trend":{"type":"boolean"},"topPhotos":{"type":"boolean"},"shareChannels":{"type":"boolean"},"devices":{"type":"boolean"}}},"hiddenMetrics":{"type":"array","items":{"type":"string"}},"topPhotosCount":{"anyOf":[{"type":"number","const":4},{"type":"number","const":8},{"type":"number","const":12}]},"range":{"description":"YYYY-MM-DD; absent = all-time","type":"object","properties":{"from":{"type":"string"},"to":{"type":"string"}}},"hideBoothEventsBranding":{"description":"Requires white-labeling entitlement","type":"boolean"}}}},"required":["config"]}}}}}},"/events/{eventId}/report/publish":{"post":{"operationId":"publish_event_report","summary":"Publish (or unpublish) the client report and get the shareable link","description":"First publish mints the capability link; regenerate:true revokes the old link and mints a new one. The returned reportUrl is what you email to the end client — it needs no sign-in. Note: the link may redirect (307) to a region-tagged URL, and a REVOKED link still answers HTTP 200 with an expired page — do not health-check links by status code.","parameters":[{"name":"eventId","in":"path","required":true,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","minLength":1}}],"x-required-scope":"read-write","responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"eventId":{"type":"string"},"published":{"type":"boolean"},"reportUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The shareable client link (stable until regenerated) — null until first publish"},"previewUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Same link with preview=1 — renders even while unpublished"},"config":{"anyOf":[{"type":"object","properties":{"title":{"description":"Default: the event name","type":"string","maxLength":120},"introMessage":{"description":"Personal note to the client","type":"string","maxLength":500},"accentColor":{"description":"#rrggbb","type":"string","maxLength":20},"logoUrl":{"description":"'' = explicitly no logo","type":"string","maxLength":2000},"showHeroBackground":{"type":"boolean"},"sections":{"type":"object","properties":{"trend":{"type":"boolean"},"topPhotos":{"type":"boolean"},"shareChannels":{"type":"boolean"},"devices":{"type":"boolean"}},"additionalProperties":false},"hiddenMetrics":{"type":"array","items":{"type":"string"}},"topPhotosCount":{"anyOf":[{"type":"number","const":4},{"type":"number","const":8},{"type":"number","const":12}]},"range":{"description":"YYYY-MM-DD; absent = all-time","type":"object","properties":{"from":{"type":"string"},"to":{"type":"string"}},"additionalProperties":false},"hideBoothEventsBranding":{"description":"Requires white-labeling entitlement","type":"boolean"}},"additionalProperties":false},{"type":"null"}],"description":"null = never configured (defaults apply)"}},"required":["eventId","published","reportUrl","previewUrl","config"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"published":{"default":true,"type":"boolean"},"regenerate":{"default":false,"description":"Revoke the old link and mint a new one","type":"boolean"}}}}}}}},"/whoami":{"get":{"operationId":"whoami","summary":"The key, scope, account, and API version this request is authenticated as","description":"Call this first when unsure what you are connected to. scope tells you whether write operations will work (read keys never see them); apiVersion is what THIS request resolved to — a header/query override, the key pin, or the genesis version when the key has no pin (pinnedVersion null). Compare apiVersion to currentVersion to see whether the key is behind.","x-required-scope":"read","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"keyPrefix":{"type":"string","description":"Display prefix of the key, e.g. 'be_live_a1b2c3d4'"},"keyName":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Operator-assigned key label"},"scope":{"type":"string","enum":["read","read-write"]},"apiVersion":{"type":"string","description":"The API version this request resolved to"},"pinnedVersion":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The version pinned on the key doc; null = unpinned (resolves to genesis)"},"currentVersion":{"type":"string","description":"The newest API version"},"accountEmail":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Email of the account that owns the key"}},"required":["keyPrefix","keyName","scope","apiVersion","pinnedVersion","currentVersion","accountEmail"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/audit-events":{"get":{"operationId":"list_audit_events","summary":"The account's audit log (who did what, when), newest first","description":"Covers iPad, dashboard, system, and API actions. Filter by action (e.g. event.launch) OR by eventId — not both in one call.","parameters":[{"name":"limit","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","default":50,"type":"integer","minimum":1,"maximum":100}},{"name":"cursor","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string"}},{"name":"action","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","minLength":1}},{"name":"eventId","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","minLength":1}},{"name":"since","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},{"name":"until","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}}],"x-required-scope":"read","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"action":{"type":"string","description":"Dot-namespaced, e.g. 'event.launch', 'media.delete'"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"'ios' | 'web' | 'system' | 'api'"},"trigger":{"anyOf":[{"type":"string"},{"type":"null"}]},"at":{"anyOf":[{"type":"string"},{"type":"null"}]},"impersonatedBy":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Support-agent uid when the action happened during an impersonation session (SOL-2731); server-set, unforgeable"},"actor":{"anyOf":[{"type":"object","properties":{"uid":{"anyOf":[{"type":"string"},{"type":"null"}]},"deviceId":{"anyOf":[{"type":"string"},{"type":"null"}]},"email":{"anyOf":[{"type":"string"},{"type":"null"}]},"appVersion":{"anyOf":[{"type":"string"},{"type":"null"}]},"label":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["uid","deviceId","email","appVersion","label"],"additionalProperties":false},{"type":"null"}]},"location":{"anyOf":[{},{"type":"null"}]},"target":{"anyOf":[{},{"type":"null"}]},"metadata":{"anyOf":[{},{"type":"null"}]}},"required":["id","action","source","trigger","at","impersonatedBy","actor","location","target","metadata"],"additionalProperties":false}},"hasMore":{"type":"boolean"},"nextCursor":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["data","hasMore","nextCursor"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/communication-settings":{"get":{"operationId":"get_communication_settings","summary":"Account-level guest email/SMS settings","x-required-scope":"read","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"email":{"anyOf":[{"type":"object","properties":{"subject":{"anyOf":[{"type":"string"},{"type":"null"}]},"from":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Reply-to address"},"senderName":{"anyOf":[{"type":"string"},{"type":"null"}]},"topFirstLine":{"anyOf":[{"type":"string"},{"type":"null"}]},"topSecondLine":{"anyOf":[{"type":"string"},{"type":"null"}]},"bottomLine":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["subject","from","senderName","topFirstLine","topSecondLine","bottomLine"],"additionalProperties":false},{"type":"null"}]},"emailZip":{"anyOf":[{"type":"object","properties":{"subject":{"anyOf":[{"type":"string"},{"type":"null"}]},"from":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Reply-to address"},"senderName":{"anyOf":[{"type":"string"},{"type":"null"}]},"topFirstLine":{"anyOf":[{"type":"string"},{"type":"null"}]},"topSecondLine":{"anyOf":[{"type":"string"},{"type":"null"}]},"bottomLine":{"anyOf":[{"type":"string"},{"type":"null"}]},"linkText":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["subject","from","senderName","topFirstLine","topSecondLine","bottomLine","linkText"],"additionalProperties":false},{"type":"null"}]},"sms":{"anyOf":[{"type":"object","properties":{"body":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Supports {{link}} and {{passcode}} placeholders"},"disableOptOut":{"anyOf":[{"type":"boolean"},{"type":"null"}]}},"required":["body","disableOptOut"],"additionalProperties":false},{"type":"null"}]},"twilioConnected":{"type":"boolean","description":"Whether a custom Twilio account is connected"}},"required":["email","emailZip","sms","twilioConnected"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}}},"patch":{"operationId":"update_communication_settings","summary":"Update account-level guest email/SMS settings","description":"Partial update per section. SMS bodies keep the {{link}} and {{passcode}} placeholders; an opt-out footer is appended automatically unless disabled or a custom Twilio account is connected.","x-required-scope":"read-write","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"email":{"anyOf":[{"type":"object","properties":{"subject":{"anyOf":[{"type":"string"},{"type":"null"}]},"from":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Reply-to address"},"senderName":{"anyOf":[{"type":"string"},{"type":"null"}]},"topFirstLine":{"anyOf":[{"type":"string"},{"type":"null"}]},"topSecondLine":{"anyOf":[{"type":"string"},{"type":"null"}]},"bottomLine":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["subject","from","senderName","topFirstLine","topSecondLine","bottomLine"],"additionalProperties":false},{"type":"null"}]},"emailZip":{"anyOf":[{"type":"object","properties":{"subject":{"anyOf":[{"type":"string"},{"type":"null"}]},"from":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Reply-to address"},"senderName":{"anyOf":[{"type":"string"},{"type":"null"}]},"topFirstLine":{"anyOf":[{"type":"string"},{"type":"null"}]},"topSecondLine":{"anyOf":[{"type":"string"},{"type":"null"}]},"bottomLine":{"anyOf":[{"type":"string"},{"type":"null"}]},"linkText":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["subject","from","senderName","topFirstLine","topSecondLine","bottomLine","linkText"],"additionalProperties":false},{"type":"null"}]},"sms":{"anyOf":[{"type":"object","properties":{"body":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Supports {{link}} and {{passcode}} placeholders"},"disableOptOut":{"anyOf":[{"type":"boolean"},{"type":"null"}]}},"required":["body","disableOptOut"],"additionalProperties":false},{"type":"null"}]},"twilioConnected":{"type":"boolean","description":"Whether a custom Twilio account is connected"}},"required":["email","emailZip","sms","twilioConnected"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"email":{"type":"object","properties":{"subject":{"type":"string","maxLength":300},"from":{"type":"string","maxLength":300},"senderName":{"type":"string","maxLength":200},"topFirstLine":{"type":"string","maxLength":500},"topSecondLine":{"type":"string","maxLength":500},"bottomLine":{"type":"string","maxLength":500}}},"emailZip":{"type":"object","properties":{"subject":{"type":"string","maxLength":300},"from":{"type":"string","maxLength":300},"senderName":{"type":"string","maxLength":200},"topFirstLine":{"type":"string","maxLength":500},"topSecondLine":{"type":"string","maxLength":500},"bottomLine":{"type":"string","maxLength":500},"linkText":{"type":"string","maxLength":200}}},"sms":{"type":"object","properties":{"body":{"type":"string","maxLength":1000},"disableOptOut":{"type":"boolean"}}}}}}}}}},"/webhooks":{"get":{"operationId":"get_webhooks","summary":"Where outbound webhooks are delivered","x-required-scope":"read","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"mediaWebhookUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Called when a guest uploads media"},"sendWebhookUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Called when a share/send completes"}},"required":["mediaWebhookUrl","sendWebhookUrl"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}}},"put":{"operationId":"set_webhooks","summary":"Set where outbound webhooks are delivered","description":"https URLs only. Send null (or an empty string) to turn a webhook off. Media webhooks fire on guest uploads; send webhooks fire when a share completes — both POST JSON.","x-required-scope":"read-write","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"mediaWebhookUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Called when a guest uploads media"},"sendWebhookUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Called when a share/send completes"}},"required":["mediaWebhookUrl","sendWebhookUrl"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"mediaWebhookUrl":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"sendWebhookUrl":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]}}}}}}}},"/devices":{"get":{"operationId":"list_devices","summary":"List the iPads/iPhones registered to the account","description":"Read-only. Shows each device with its license state and last check-in time. Use get_device for a single device.","x-required-scope":"read","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"licensed":{"type":"boolean"},"lastSeen":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO-8601, when the device last checked in"},"deviceIdiom":{"anyOf":[{"type":"string","enum":["phone","pad"]},{"type":"null"}]},"preferredLocale":{"anyOf":[{"type":"string"},{"type":"null"}]},"payTerminal":{"anyOf":[{"type":"object","properties":{"provider":{"type":"string","description":"'nayax' | 'stripe' — the pairing selects the payment rail"},"terminalId":{"type":"string"},"pairedAt":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["provider","terminalId","pairedAt"],"additionalProperties":false},{"type":"null"}],"description":"Paired card terminal for pay-per-use (SOL-813); null = not paired"}},"required":["id","name","licensed","lastSeen","deviceIdiom","preferredLocale","payTerminal"],"additionalProperties":false}},"hasMore":{"type":"boolean","const":false},"nextCursor":{"type":"null"}},"required":["data","hasMore","nextCursor"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/devices/{deviceId}":{"get":{"operationId":"get_device","summary":"Get one registered device","parameters":[{"name":"deviceId","in":"path","required":true,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","minLength":1,"description":"Device id from list_devices"}}],"x-required-scope":"read","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"licensed":{"type":"boolean"},"lastSeen":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO-8601, when the device last checked in"},"deviceIdiom":{"anyOf":[{"type":"string","enum":["phone","pad"]},{"type":"null"}]},"preferredLocale":{"anyOf":[{"type":"string"},{"type":"null"}]},"payTerminal":{"anyOf":[{"type":"object","properties":{"provider":{"type":"string","description":"'nayax' | 'stripe' — the pairing selects the payment rail"},"terminalId":{"type":"string"},"pairedAt":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["provider","terminalId","pairedAt"],"additionalProperties":false},{"type":"null"}],"description":"Paired card terminal for pay-per-use (SOL-813); null = not paired"}},"required":["id","name","licensed","lastSeen","deviceIdiom","preferredLocale","payTerminal"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/members":{"get":{"operationId":"list_members","summary":"List the account's team members and pending invites","description":"Members are people you granted access to your account. Invites include history — an invite with a null redeemedDate and null revokedDate is still pending (redeemable).","x-required-scope":"read","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"members":{"type":"array","items":{"type":"object","properties":{"memberUid":{"type":"string"},"role":{"type":"string","enum":["admin","viewer","none"],"description":"Account-wide base role; none = per-event overrides only"},"eventOverrides":{"type":"object","propertyNames":{"type":"string","minLength":1,"maxLength":200},"additionalProperties":{"type":"string","enum":["editor","viewer","operator"]},"description":"Per-event grants above the base role, keyed by event id"},"expiresAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO-8601; null = no expiry"},"displayName":{"anyOf":[{"type":"string"},{"type":"null"}]},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The member login's email (anonymous identities: null)"},"createdDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"modifiedDate":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["memberUid","role","eventOverrides","expiresAt","displayName","email","createdDate","modifiedDate"],"additionalProperties":false}},"invites":{"type":"array","items":{"type":"object","properties":{"inviteId":{"type":"string"},"role":{"type":"string","enum":["admin","viewer","none"],"description":"Account-wide base role; none = per-event overrides only"},"eventOverrides":{"type":"object","propertyNames":{"type":"string","minLength":1,"maxLength":200},"additionalProperties":{"type":"string","enum":["editor","viewer","operator"]},"description":"Per-event grants above the base role, keyed by event id"},"expiresAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Membership expiry applied at redemption"},"displayName":{"anyOf":[{"type":"string"},{"type":"null"}]},"tokenPrefix":{"type":"string"},"createdDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"inviteExpiresAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Unredeemed invites die after this"},"redeemedBy":{"anyOf":[{"type":"string"},{"type":"null"}]},"redeemedDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"revokedDate":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["inviteId","role","eventOverrides","expiresAt","displayName","tokenPrefix","createdDate","inviteExpiresAt","redeemedBy","redeemedDate","revokedDate"],"additionalProperties":false}}},"required":["members","invites"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/members/invites":{"post":{"operationId":"create_member_invite","summary":"Create a one-time invite link for a new team member","description":"Returns the invite token and joinUrl ONCE — they are never retrievable again. Send the joinUrl to the person you are inviting; unredeemed invites expire after a few days. Use list_members first to see who already has access.","x-required-scope":"read-write","responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"inviteId":{"type":"string"},"token":{"type":"string","description":"Shown once; never stored or retrievable again"},"tokenPrefix":{"type":"string"},"joinUrl":{"type":"string","description":"Send this to the invitee — the token rides in the URL fragment"}},"required":["inviteId","token","tokenPrefix","joinUrl"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"role":{"type":"string","enum":["admin","viewer","none"],"description":"Account-wide base role; none = per-event overrides only"},"eventOverrides":{"type":"object","propertyNames":{"type":"string","minLength":1,"maxLength":200},"additionalProperties":{"type":"string","enum":["editor","viewer","operator"]},"description":"Per-event grants above the base role, keyed by event id"},"expiresAt":{"description":"Membership auto-expiry applied at redemption; omit or null = no expiry; must be in the future","anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"displayName":{"description":"Label for who this is, e.g. \"Dave — Smith wedding\"","type":"string","maxLength":200}},"required":["role"]}}}}}},"/members/invites/{inviteId}":{"delete":{"operationId":"revoke_member_invite","summary":"Revoke a pending (unredeemed) invite","parameters":[{"name":"inviteId","in":"path","required":true,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","minLength":1}}],"x-required-scope":"read-write","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"deleted":{"type":"boolean","const":true},"id":{"type":"string"}},"required":["deleted","id"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/members/{memberUid}":{"patch":{"operationId":"update_member","summary":"Change a member's role, per-event overrides, or expiry","description":"Partial update. expiresAt: an ISO date moves the expiry, null clears it (no expiry), absent leaves it. eventOverrides replaces the whole map when provided.","parameters":[{"name":"memberUid","in":"path","required":true,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","minLength":1}}],"x-required-scope":"read-write","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"memberUid":{"type":"string"},"role":{"type":"string","enum":["admin","viewer","none"],"description":"Account-wide base role; none = per-event overrides only"},"eventOverrides":{"type":"object","propertyNames":{"type":"string","minLength":1,"maxLength":200},"additionalProperties":{"type":"string","enum":["editor","viewer","operator"]},"description":"Per-event grants above the base role, keyed by event id"},"expiresAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO-8601; null = no expiry"},"displayName":{"anyOf":[{"type":"string"},{"type":"null"}]},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The member login's email (anonymous identities: null)"},"createdDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"modifiedDate":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["memberUid","role","eventOverrides","expiresAt","displayName","email","createdDate","modifiedDate"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"role":{"type":"string","enum":["admin","viewer","none"],"description":"Account-wide base role; none = per-event overrides only"},"eventOverrides":{"type":"object","propertyNames":{"type":"string","minLength":1,"maxLength":200},"additionalProperties":{"type":"string","enum":["editor","viewer","operator"]},"description":"Per-event grants above the base role, keyed by event id"},"expiresAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]}}}}}}},"delete":{"operationId":"remove_member","summary":"Remove a team member","description":"Takes effect immediately: the membership is deleted, the member's access claim is re-minted, and any operator device licenses they were burning are released.","parameters":[{"name":"memberUid","in":"path","required":true,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","minLength":1}}],"x-required-scope":"read-write","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"deleted":{"type":"boolean","const":true},"id":{"type":"string"}},"required":["deleted","id"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/pay-sets":{"get":{"operationId":"list_pay_sets","summary":"List your pay-per-use pricing sets","description":"Newest first. A pay set defines what guests pay at the booth (products, tiers, currency); assign one to an event via update_event paySetId.","parameters":[{"name":"limit","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","default":25,"type":"integer","minimum":1,"maximum":100}},{"name":"cursor","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string"}}],"x-required-scope":"read","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"currency":{"type":"string","description":"Lowercase ISO 4217; must match the paired payment rail account currency"},"products":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","enum":["session","print","captureType","share"],"description":"What the guest pays for at the booth"},"enabled":{"type":"boolean"},"pricing":{"minItems":1,"type":"array","items":{"type":"object","properties":{"quantity":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"1 = single purchase; >1 = bundle option (session/print only)"},"price":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"Integer MINOR units (e.g. cents) — 500 = $5.00"}},"required":["quantity","price"],"additionalProperties":false},"description":"Multiple tiers = single-vs-bundle choice"},"captureTypes":{"description":"captureType products only: e.g. 'photo', 'video', 'aiPhoto'","type":"array","items":{"type":"string","minLength":1}},"payScreen":{"type":"object","properties":{"contentHtml":{"description":"Operator-authored guest screen HTML","type":"string","maxLength":50000},"backgroundColor":{"type":"string","maxLength":50}},"additionalProperties":false}},"required":["type","enabled","pricing"],"additionalProperties":false}},"isPublic":{"type":"boolean"},"createdDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"modifiedDate":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","name","currency","products","isPublic","createdDate","modifiedDate"],"additionalProperties":false}},"hasMore":{"type":"boolean"},"nextCursor":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["data","hasMore","nextCursor"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}}},"post":{"operationId":"create_pay_set","summary":"Create a pay-per-use pricing set","description":"Prices are integer MINOR units (500 = $5.00) and the currency must match the operator's payment-rail account currency or charges will be refused at the booth. Assign the set to an event with update_event paySetId.","x-required-scope":"read-write","responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"currency":{"type":"string","description":"Lowercase ISO 4217; must match the paired payment rail account currency"},"products":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","enum":["session","print","captureType","share"],"description":"What the guest pays for at the booth"},"enabled":{"type":"boolean"},"pricing":{"minItems":1,"type":"array","items":{"type":"object","properties":{"quantity":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"1 = single purchase; >1 = bundle option (session/print only)"},"price":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"Integer MINOR units (e.g. cents) — 500 = $5.00"}},"required":["quantity","price"],"additionalProperties":false},"description":"Multiple tiers = single-vs-bundle choice"},"captureTypes":{"description":"captureType products only: e.g. 'photo', 'video', 'aiPhoto'","type":"array","items":{"type":"string","minLength":1}},"payScreen":{"type":"object","properties":{"contentHtml":{"description":"Operator-authored guest screen HTML","type":"string","maxLength":50000},"backgroundColor":{"type":"string","maxLength":50}},"additionalProperties":false}},"required":["type","enabled","pricing"],"additionalProperties":false}},"isPublic":{"type":"boolean"},"createdDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"modifiedDate":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","name","currency","products","isPublic","createdDate","modifiedDate"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"currency":{"type":"string","pattern":"^[a-z]{3}$","description":"Lowercase ISO 4217, e.g. 'usd' — one currency per pay set"},"products":{"minItems":1,"type":"array","items":{"type":"object","properties":{"type":{"type":"string","enum":["session","print","captureType","share"],"description":"What the guest pays for at the booth"},"enabled":{"type":"boolean"},"pricing":{"minItems":1,"type":"array","items":{"type":"object","properties":{"quantity":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"1 = single purchase; >1 = bundle option (session/print only)"},"price":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"Integer MINOR units (e.g. cents) — 500 = $5.00"}},"required":["quantity","price"]},"description":"Multiple tiers = single-vs-bundle choice"},"captureTypes":{"description":"captureType products only: e.g. 'photo', 'video', 'aiPhoto'","type":"array","items":{"type":"string","minLength":1}},"payScreen":{"type":"object","properties":{"contentHtml":{"description":"Operator-authored guest screen HTML","type":"string","maxLength":50000},"backgroundColor":{"type":"string","maxLength":50}}}},"required":["type","enabled","pricing"]}}},"required":["name","currency","products"]}}}}}},"/pay-sets/{paySetId}":{"get":{"operationId":"get_pay_set","summary":"Get one pay set (yours or a public one)","parameters":[{"name":"paySetId","in":"path","required":true,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","minLength":1}}],"x-required-scope":"read","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"currency":{"type":"string","description":"Lowercase ISO 4217; must match the paired payment rail account currency"},"products":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","enum":["session","print","captureType","share"],"description":"What the guest pays for at the booth"},"enabled":{"type":"boolean"},"pricing":{"minItems":1,"type":"array","items":{"type":"object","properties":{"quantity":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"1 = single purchase; >1 = bundle option (session/print only)"},"price":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"Integer MINOR units (e.g. cents) — 500 = $5.00"}},"required":["quantity","price"],"additionalProperties":false},"description":"Multiple tiers = single-vs-bundle choice"},"captureTypes":{"description":"captureType products only: e.g. 'photo', 'video', 'aiPhoto'","type":"array","items":{"type":"string","minLength":1}},"payScreen":{"type":"object","properties":{"contentHtml":{"description":"Operator-authored guest screen HTML","type":"string","maxLength":50000},"backgroundColor":{"type":"string","maxLength":50}},"additionalProperties":false}},"required":["type","enabled","pricing"],"additionalProperties":false}},"isPublic":{"type":"boolean"},"createdDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"modifiedDate":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","name","currency","products","isPublic","createdDate","modifiedDate"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}}},"patch":{"operationId":"update_pay_set","summary":"Update a pay set (name, currency, and/or the whole products array)","description":"Partial update: only the fields you send change. products replaces the whole array (send the complete list). The merged result is revalidated against the composition rules.","parameters":[{"name":"paySetId","in":"path","required":true,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","minLength":1}}],"x-required-scope":"read-write","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"currency":{"type":"string","description":"Lowercase ISO 4217; must match the paired payment rail account currency"},"products":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","enum":["session","print","captureType","share"],"description":"What the guest pays for at the booth"},"enabled":{"type":"boolean"},"pricing":{"minItems":1,"type":"array","items":{"type":"object","properties":{"quantity":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"1 = single purchase; >1 = bundle option (session/print only)"},"price":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"Integer MINOR units (e.g. cents) — 500 = $5.00"}},"required":["quantity","price"],"additionalProperties":false},"description":"Multiple tiers = single-vs-bundle choice"},"captureTypes":{"description":"captureType products only: e.g. 'photo', 'video', 'aiPhoto'","type":"array","items":{"type":"string","minLength":1}},"payScreen":{"type":"object","properties":{"contentHtml":{"description":"Operator-authored guest screen HTML","type":"string","maxLength":50000},"backgroundColor":{"type":"string","maxLength":50}},"additionalProperties":false}},"required":["type","enabled","pricing"],"additionalProperties":false}},"isPublic":{"type":"boolean"},"createdDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"modifiedDate":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","name","currency","products","isPublic","createdDate","modifiedDate"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"currency":{"type":"string","pattern":"^[a-z]{3}$"},"products":{"minItems":1,"type":"array","items":{"type":"object","properties":{"type":{"type":"string","enum":["session","print","captureType","share"],"description":"What the guest pays for at the booth"},"enabled":{"type":"boolean"},"pricing":{"minItems":1,"type":"array","items":{"type":"object","properties":{"quantity":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"1 = single purchase; >1 = bundle option (session/print only)"},"price":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"Integer MINOR units (e.g. cents) — 500 = $5.00"}},"required":["quantity","price"]},"description":"Multiple tiers = single-vs-bundle choice"},"captureTypes":{"description":"captureType products only: e.g. 'photo', 'video', 'aiPhoto'","type":"array","items":{"type":"string","minLength":1}},"payScreen":{"type":"object","properties":{"contentHtml":{"description":"Operator-authored guest screen HTML","type":"string","maxLength":50000},"backgroundColor":{"type":"string","maxLength":50}}}},"required":["type","enabled","pricing"]}}}}}}}},"delete":{"operationId":"delete_pay_set","summary":"Delete a pay set (refused while events still use it)","parameters":[{"name":"paySetId","in":"path","required":true,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","minLength":1}}],"x-required-scope":"read-write","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"deleted":{"type":"boolean","const":true},"id":{"type":"string"}},"required":["deleted","id"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/pay-transactions":{"get":{"operationId":"list_pay_transactions","summary":"List guest payments taken at your booths, newest first","description":"The pay-per-use revenue log — one row per payment attempt on either rail. Filter by eventId (e.g. \"how much did we take at this event?\") OR by status — not both in one call. Amounts are integer minor units: amount is the TOTAL charged, and subtotalAmount/taxAmount break it out whenever the pay set applied tax (all null when it did not). Only status \"approved\" rows took money.","parameters":[{"name":"limit","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","default":50,"type":"integer","minimum":1,"maximum":100}},{"name":"cursor","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string"}},{"name":"eventId","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","minLength":1}},{"name":"status","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","enum":["pending","approved","declined","timeout"]}},{"name":"createdFrom","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},{"name":"createdTo","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}}],"x-required-scope":"read","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"provider":{"type":"string","description":"'nayax' | 'stripe'"},"eventId":{"anyOf":[{"type":"string"},{"type":"null"}]},"eventName":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Event name as it was at charge time"},"deviceId":{"anyOf":[{"type":"string"},{"type":"null"}]},"deviceName":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Device (iPad) name as it was at charge time"},"terminalId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The card terminal that took the payment"},"paySetId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The pay set that priced this charge; null on test charges"},"paySetName":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pay set name as it was at charge time"},"productType":{"type":"string","description":"session | print | captureType | share, or 'test'"},"quantity":{"type":"number"},"amount":{"type":"number","description":"Integer MINOR units (e.g. cents) — the TOTAL charged (subtotal + tax)"},"subtotalAmount":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Pre-tax amount in minor units; null when the charge carried no tax"},"taxAmount":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Tax portion in minor units; null when untaxed"},"taxRate":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Tax percent applied at charge time (e.g. 13)"},"taxInclusive":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"true when the price already included tax (amount == subtotalAmount + taxAmount either way)"},"taxLabel":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Guest-facing tax label at charge time (e.g. 'HST')"},"taxSource":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"'manual' | 'stripe'"},"currency":{"type":"string"},"status":{"type":"string","enum":["pending","approved","declined","timeout"]},"isTest":{"type":"boolean"},"failureCode":{"anyOf":[{"type":"string"},{"type":"null"}]},"cardLast4":{"anyOf":[{"type":"string"},{"type":"null"}]},"cardBrand":{"anyOf":[{"type":"string"},{"type":"null"}]},"authCode":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Nayax only"},"nayaxRRN":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Nayax only"},"stripePaymentIntentId":{"anyOf":[{"type":"string"},{"type":"null"}]},"stripeChargeId":{"anyOf":[{"type":"string"},{"type":"null"}]},"stripeReaderId":{"anyOf":[{"type":"string"},{"type":"null"}]},"tenantId":{"anyOf":[{"type":"string"},{"type":"null"}]},"galleryId":{"anyOf":[{"type":"string"},{"type":"null"}]},"guestSessionUuid":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The booth-minted session id this charge belongs to. Match it against a gallery session (sessions carry the same value) to find the photos; null on older charges and test charges."},"createdAt":{"anyOf":[{"type":"string"},{"type":"null"}]},"completedAt":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","provider","eventId","eventName","deviceId","deviceName","terminalId","paySetId","paySetName","productType","quantity","amount","subtotalAmount","taxAmount","taxRate","taxInclusive","taxLabel","taxSource","currency","status","isTest","failureCode","cardLast4","cardBrand","authCode","nayaxRRN","stripePaymentIntentId","stripeChargeId","stripeReaderId","tenantId","galleryId","guestSessionUuid","createdAt","completedAt"],"additionalProperties":false}},"hasMore":{"type":"boolean"},"nextCursor":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["data","hasMore","nextCursor"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/pay-transactions/{payTransactionId}":{"get":{"operationId":"get_pay_transaction","summary":"Get one guest payment","parameters":[{"name":"payTransactionId","in":"path","required":true,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","minLength":1}}],"x-required-scope":"read","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string"},"provider":{"type":"string","description":"'nayax' | 'stripe'"},"eventId":{"anyOf":[{"type":"string"},{"type":"null"}]},"eventName":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Event name as it was at charge time"},"deviceId":{"anyOf":[{"type":"string"},{"type":"null"}]},"deviceName":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Device (iPad) name as it was at charge time"},"terminalId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The card terminal that took the payment"},"paySetId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The pay set that priced this charge; null on test charges"},"paySetName":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pay set name as it was at charge time"},"productType":{"type":"string","description":"session | print | captureType | share, or 'test'"},"quantity":{"type":"number"},"amount":{"type":"number","description":"Integer MINOR units (e.g. cents) — the TOTAL charged (subtotal + tax)"},"subtotalAmount":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Pre-tax amount in minor units; null when the charge carried no tax"},"taxAmount":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Tax portion in minor units; null when untaxed"},"taxRate":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Tax percent applied at charge time (e.g. 13)"},"taxInclusive":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"true when the price already included tax (amount == subtotalAmount + taxAmount either way)"},"taxLabel":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Guest-facing tax label at charge time (e.g. 'HST')"},"taxSource":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"'manual' | 'stripe'"},"currency":{"type":"string"},"status":{"type":"string","enum":["pending","approved","declined","timeout"]},"isTest":{"type":"boolean"},"failureCode":{"anyOf":[{"type":"string"},{"type":"null"}]},"cardLast4":{"anyOf":[{"type":"string"},{"type":"null"}]},"cardBrand":{"anyOf":[{"type":"string"},{"type":"null"}]},"authCode":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Nayax only"},"nayaxRRN":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Nayax only"},"stripePaymentIntentId":{"anyOf":[{"type":"string"},{"type":"null"}]},"stripeChargeId":{"anyOf":[{"type":"string"},{"type":"null"}]},"stripeReaderId":{"anyOf":[{"type":"string"},{"type":"null"}]},"tenantId":{"anyOf":[{"type":"string"},{"type":"null"}]},"galleryId":{"anyOf":[{"type":"string"},{"type":"null"}]},"guestSessionUuid":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The booth-minted session id this charge belongs to. Match it against a gallery session (sessions carry the same value) to find the photos; null on older charges and test charges."},"createdAt":{"anyOf":[{"type":"string"},{"type":"null"}]},"completedAt":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","provider","eventId","eventName","deviceId","deviceName","terminalId","paySetId","paySetName","productType","quantity","amount","subtotalAmount","taxAmount","taxRate","taxInclusive","taxLabel","taxSource","currency","status","isTest","failureCode","cardLast4","cardBrand","authCode","nayaxRRN","stripePaymentIntentId","stripeChargeId","stripeReaderId","tenantId","galleryId","guestSessionUuid","createdAt","completedAt"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/payment-account":{"get":{"operationId":"get_payment_account","summary":"Pay-per-use connection status per payment rail (Nayax / Stripe)","description":"A snapshot from our records — no live provider calls, safe to poll. Connecting a rail and pairing terminals happen in the dashboard, not this API.","x-required-scope":"read","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"nayax":{"type":"object","properties":{"state":{"type":"string","description":"not_connected | pending_support (nayax) | connected"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}]},"accountName":{"anyOf":[{"type":"string"},{"type":"null"}]},"operatorId":{"anyOf":[{"type":"string"},{"type":"null"}]},"terminalSerials":{"type":"array","items":{"type":"string"}},"connectedAt":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["state","currency","accountName","operatorId","terminalSerials","connectedAt"],"additionalProperties":false},"stripe":{"type":"object","properties":{"state":{"type":"string","description":"not_connected | pending_support (nayax) | connected"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}]},"accountId":{"anyOf":[{"type":"string"},{"type":"null"}]},"chargesEnabled":{"type":"boolean"},"readerIds":{"type":"array","items":{"type":"string"}},"connectedAt":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["state","currency","accountId","chargesEnabled","readerIds","connectedAt"],"additionalProperties":false}},"required":["nayax","stripe"],"additionalProperties":false}}}},"default":{"$ref":"#/components/responses/Error"}}}}},"components":{"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","description":"Booth.Events API key (be_live_… / be_test_…), shown once at creation."}},"responses":{"Error":{"description":"Error envelope: { error: { code, message, details?, hint?, requestId } }. Codes: invalid_api_key, revoked_api_key, plan_required, insufficient_scope, rate_limited, validation_failed, invalid_cursor, permission_denied, limit_exceeded, not_found, conflict, dependency_unavailable, internal.","content":{"application/json":{"schema":{"type":"object"}}}}}}}