{"openapi":"3.1.0","info":{"title":"Dropl public API","version":"1.0.0","description":"Server-to-server API for client sites, showcases, collections, client feedback, photo and video uploads, embed codes, and usage. Authenticate with `Authorization: Bearer <API key>` (create keys in the dashboard, or sign in a device with `/v1/auth/device`). A key acts as the owner or admin who created it, never beyond its scopes and, if site-restricted, its sites. Each key may make 600 requests per minute. Browsers can't call this API (no CORS)."},"tags":[{"name":"Meta"},{"name":"Device sign-in"},{"name":"Sites"},{"name":"Showcases"},{"name":"Projects"},{"name":"Videos"},{"name":"Uploads"},{"name":"Embeds"},{"name":"Usage"},{"name":"Collections"},{"name":"Collection items"},{"name":"Feedback"}],"paths":{"/v1/auth/device":{"post":{"operationId":"startDeviceAuthorization","summary":"Start device sign-in (RFC 8628)","description":"No authentication.","tags":["Device sign-in"],"security":[],"x-idempotent":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceAuthorizationRequest"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceAuthorizationResponse"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/auth/device/token":{"post":{"operationId":"pollDeviceToken","summary":"Poll for the API key after approval","description":"No authentication.","tags":["Device sign-in"],"security":[],"x-idempotent":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceTokenRequest"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceTokenResponse"}}}},"400":{"description":"Pending, slow down, denied, expired, or invalid (OAuth error shape)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceTokenError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/openapi.json":{"get":{"operationId":"getOpenApiDocument","summary":"This document","description":"No authentication.","tags":["Meta"],"security":[],"x-idempotent":false,"responses":{"200":{"description":"OpenAPI 3.1 document","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/me":{"get":{"operationId":"getMe","summary":"The account, user, and key this request acts as","description":"Any valid API key.","tags":["Meta"],"security":[{"apiKey":[]}],"x-required-scope":null,"x-idempotent":false,"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Me"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"`INVALID_API_KEY`: missing, invalid, expired, or revoked key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"`INSUFFICIENT_SCOPE` (names the missing scope), `SITE_RESTRICTED_KEY`, or a plan limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found, or outside the key's sites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/sites":{"get":{"operationId":"listSites","summary":"List client sites the key can reach","description":"Requires the `sites:read` scope (see your client sites).","tags":["Sites"],"security":[{"apiKey":[]}],"x-required-scope":"sites:read","x-idempotent":false,"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SitesResponse"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"`INVALID_API_KEY`: missing, invalid, expired, or revoked key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"`INSUFFICIENT_SCOPE` (names the missing scope), `SITE_RESTRICTED_KEY`, or a plan limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found, or outside the key's sites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"post":{"operationId":"createSite","summary":"Create a client site (not with site-restricted keys)","description":"Requires the `sites:write` scope (create client sites). Send `Idempotency-Key` to retry safely: a repeat with the same key and body within 24 hours returns the first response.","tags":["Sites"],"security":[{"apiKey":[]}],"x-required-scope":"sites:write","x-idempotent":true,"parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSiteRequest"}}}},"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Site"}}},"headers":{"idempotent-replayed":{"$ref":"#/components/headers/IdempotentReplayed"}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"`INVALID_API_KEY`: missing, invalid, expired, or revoked key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"`INSUFFICIENT_SCOPE` (names the missing scope), `SITE_RESTRICTED_KEY`, or a plan limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found, or outside the key's sites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"`IDEMPOTENCY_KEY_IN_PROGRESS` or a conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"`IDEMPOTENCY_KEY_REUSED`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/sites/{siteId}":{"get":{"operationId":"getSite","summary":"Get a client site","description":"Requires the `sites:read` scope (see your client sites).","tags":["Sites"],"security":[{"apiKey":[]}],"x-required-scope":"sites:read","x-idempotent":false,"parameters":[{"name":"siteId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Site"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"`INVALID_API_KEY`: missing, invalid, expired, or revoked key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"`INSUFFICIENT_SCOPE` (names the missing scope), `SITE_RESTRICTED_KEY`, or a plan limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found, or outside the key's sites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/sites/{siteId}/showcases":{"get":{"operationId":"listShowcases","summary":"List a site's showcases","description":"Requires the `showcases:read` scope (see showcases and their categories).","tags":["Showcases"],"security":[{"apiKey":[]}],"x-required-scope":"showcases:read","x-idempotent":false,"parameters":[{"name":"siteId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"cursor","in":"query","required":false,"schema":{"type":"string","format":"uuid"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100}},{"name":"trashed","in":"query","required":false,"schema":{"type":"string","enum":["true","false"],"default":"false"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShowcaseList"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"`INVALID_API_KEY`: missing, invalid, expired, or revoked key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"`INSUFFICIENT_SCOPE` (names the missing scope), `SITE_RESTRICTED_KEY`, or a plan limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found, or outside the key's sites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"post":{"operationId":"createShowcase","summary":"Create a showcase","description":"Requires the `showcases:write` scope (create and edit showcases, categories, and tags). Send `Idempotency-Key` to retry safely: a repeat with the same key and body within 24 hours returns the first response.","tags":["Showcases"],"security":[{"apiKey":[]}],"x-required-scope":"showcases:write","x-idempotent":true,"parameters":[{"name":"siteId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateShowcaseRequest"}}}},"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShowcaseDetail"}}},"headers":{"idempotent-replayed":{"$ref":"#/components/headers/IdempotentReplayed"}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"`INVALID_API_KEY`: missing, invalid, expired, or revoked key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"`INSUFFICIENT_SCOPE` (names the missing scope), `SITE_RESTRICTED_KEY`, or a plan limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found, or outside the key's sites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"`IDEMPOTENCY_KEY_IN_PROGRESS` or a conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"`IDEMPOTENCY_KEY_REUSED`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/showcases/{showcaseId}":{"get":{"operationId":"getShowcase","summary":"Get a showcase with its categories and items","description":"Requires the `showcases:read` scope (see showcases and their categories).","tags":["Showcases"],"security":[{"apiKey":[]}],"x-required-scope":"showcases:read","x-idempotent":false,"parameters":[{"name":"showcaseId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShowcaseDetail"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"`INVALID_API_KEY`: missing, invalid, expired, or revoked key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"`INSUFFICIENT_SCOPE` (names the missing scope), `SITE_RESTRICTED_KEY`, or a plan limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found, or outside the key's sites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"patch":{"operationId":"updateShowcase","summary":"Change a showcase's title or display settings","description":"Requires the `showcases:write` scope (create and edit showcases, categories, and tags).","tags":["Showcases"],"security":[{"apiKey":[]}],"x-required-scope":"showcases:write","x-idempotent":false,"parameters":[{"name":"showcaseId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateShowcaseRequest"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShowcaseDetail"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"`INVALID_API_KEY`: missing, invalid, expired, or revoked key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"`INSUFFICIENT_SCOPE` (names the missing scope), `SITE_RESTRICTED_KEY`, or a plan limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found, or outside the key's sites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/showcases/{showcaseId}/categories":{"post":{"operationId":"createCategory","summary":"Add a category","description":"Requires the `showcases:write` scope (create and edit showcases, categories, and tags). Send `Idempotency-Key` to retry safely: a repeat with the same key and body within 24 hours returns the first response.","tags":["Showcases"],"security":[{"apiKey":[]}],"x-required-scope":"showcases:write","x-idempotent":true,"parameters":[{"name":"showcaseId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCategoryRequest"}}}},"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Category"}}},"headers":{"idempotent-replayed":{"$ref":"#/components/headers/IdempotentReplayed"}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"`INVALID_API_KEY`: missing, invalid, expired, or revoked key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"`INSUFFICIENT_SCOPE` (names the missing scope), `SITE_RESTRICTED_KEY`, or a plan limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found, or outside the key's sites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"`IDEMPOTENCY_KEY_IN_PROGRESS` or a conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"`IDEMPOTENCY_KEY_REUSED`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/showcases/{showcaseId}/categories/{categoryId}":{"patch":{"operationId":"updateCategory","summary":"Rename a category","description":"Requires the `showcases:write` scope (create and edit showcases, categories, and tags).","tags":["Showcases"],"security":[{"apiKey":[]}],"x-required-scope":"showcases:write","x-idempotent":false,"parameters":[{"name":"showcaseId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"categoryId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCategoryRequest"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Category"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"`INVALID_API_KEY`: missing, invalid, expired, or revoked key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"`INSUFFICIENT_SCOPE` (names the missing scope), `SITE_RESTRICTED_KEY`, or a plan limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found, or outside the key's sites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"delete":{"operationId":"deleteCategory","summary":"Delete a category (items stay)","description":"Requires the `showcases:write` scope (create and edit showcases, categories, and tags).","tags":["Showcases"],"security":[{"apiKey":[]}],"x-required-scope":"showcases:write","x-idempotent":false,"parameters":[{"name":"showcaseId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"categoryId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"Done"},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"`INVALID_API_KEY`: missing, invalid, expired, or revoked key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"`INSUFFICIENT_SCOPE` (names the missing scope), `SITE_RESTRICTED_KEY`, or a plan limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found, or outside the key's sites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/showcases/{showcaseId}/items/categories":{"post":{"operationId":"tagItems","summary":"Add or remove categories on many items","description":"Requires the `showcases:write` scope (create and edit showcases, categories, and tags).","tags":["Showcases"],"security":[{"apiKey":[]}],"x-required-scope":"showcases:write","x-idempotent":false,"parameters":[{"name":"showcaseId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkTagRequest"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShowcaseDetail"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"`INVALID_API_KEY`: missing, invalid, expired, or revoked key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"`INSUFFICIENT_SCOPE` (names the missing scope), `SITE_RESTRICTED_KEY`, or a plan limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found, or outside the key's sites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/showcases/{showcaseId}/items":{"patch":{"operationId":"updateShowcaseItems","summary":"Set alt text and categories on up to 100 items at once","description":"Requires the `showcases:write` scope (create and edit showcases, categories, and tags).","tags":["Showcases"],"security":[{"apiKey":[]}],"x-required-scope":"showcases:write","x-idempotent":false,"parameters":[{"name":"showcaseId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkUpdateShowcaseItemsRequest"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShowcaseItemList"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"`INVALID_API_KEY`: missing, invalid, expired, or revoked key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"`INSUFFICIENT_SCOPE` (names the missing scope), `SITE_RESTRICTED_KEY`, or a plan limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found, or outside the key's sites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/showcases/{showcaseId}/items/{itemId}":{"patch":{"operationId":"updateShowcaseItem","summary":"Set an item's alt text and categories","description":"Requires the `showcases:write` scope (create and edit showcases, categories, and tags).","tags":["Showcases"],"security":[{"apiKey":[]}],"x-required-scope":"showcases:write","x-idempotent":false,"parameters":[{"name":"showcaseId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"itemId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShowcaseItemChange"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShowcaseItem"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"`INVALID_API_KEY`: missing, invalid, expired, or revoked key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"`INSUFFICIENT_SCOPE` (names the missing scope), `SITE_RESTRICTED_KEY`, or a plan limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found, or outside the key's sites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/showcases/{showcaseId}/videos":{"post":{"operationId":"addShowcaseVideos","summary":"Add library videos from the same site","description":"Requires the `showcases:write` scope (create and edit showcases, categories, and tags).","tags":["Showcases"],"security":[{"apiKey":[]}],"x-required-scope":"showcases:write","x-idempotent":false,"parameters":[{"name":"showcaseId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddVideosRequest"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShowcaseDetail"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"`INVALID_API_KEY`: missing, invalid, expired, or revoked key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"`INSUFFICIENT_SCOPE` (names the missing scope), `SITE_RESTRICTED_KEY`, or a plan limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found, or outside the key's sites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/showcases/{showcaseId}/projects":{"get":{"operationId":"listProjects","summary":"List a projects showcase's projects with their items and details","description":"Requires the `showcases:read` scope (see showcases and their categories).","tags":["Projects"],"security":[{"apiKey":[]}],"x-required-scope":"showcases:read","x-idempotent":false,"parameters":[{"name":"showcaseId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectList"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"`INVALID_API_KEY`: missing, invalid, expired, or revoked key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"`INSUFFICIENT_SCOPE` (names the missing scope), `SITE_RESTRICTED_KEY`, or a plan limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found, or outside the key's sites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"post":{"operationId":"createProject","summary":"Add a project (up to 100)","description":"Requires the `showcases:write` scope (create and edit showcases, categories, and tags). Send `Idempotency-Key` to retry safely: a repeat with the same key and body within 24 hours returns the first response.","tags":["Projects"],"security":[{"apiKey":[]}],"x-required-scope":"showcases:write","x-idempotent":true,"parameters":[{"name":"showcaseId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateProjectRequest"}}}},"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Project"}}},"headers":{"idempotent-replayed":{"$ref":"#/components/headers/IdempotentReplayed"}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"`INVALID_API_KEY`: missing, invalid, expired, or revoked key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"`INSUFFICIENT_SCOPE` (names the missing scope), `SITE_RESTRICTED_KEY`, or a plan limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found, or outside the key's sites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"`IDEMPOTENCY_KEY_IN_PROGRESS` or a conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"`IDEMPOTENCY_KEY_REUSED`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/showcases/{showcaseId}/projects/order":{"put":{"operationId":"reorderProjects","summary":"Reorder every project","description":"Requires the `showcases:write` scope (create and edit showcases, categories, and tags).","tags":["Projects"],"security":[{"apiKey":[]}],"x-required-scope":"showcases:write","x-idempotent":false,"parameters":[{"name":"showcaseId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReorderProjectsRequest"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectList"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"`INVALID_API_KEY`: missing, invalid, expired, or revoked key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"`INSUFFICIENT_SCOPE` (names the missing scope), `SITE_RESTRICTED_KEY`, or a plan limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found, or outside the key's sites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/showcases/{showcaseId}/projects/{projectId}":{"patch":{"operationId":"updateProject","summary":"Change a project's text, link name, cover, details, or categories","description":"Requires the `showcases:write` scope (create and edit showcases, categories, and tags).","tags":["Projects"],"security":[{"apiKey":[]}],"x-required-scope":"showcases:write","x-idempotent":false,"parameters":[{"name":"showcaseId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"projectId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateProjectRequest"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Project"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"`INVALID_API_KEY`: missing, invalid, expired, or revoked key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"`INSUFFICIENT_SCOPE` (names the missing scope), `SITE_RESTRICTED_KEY`, or a plan limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found, or outside the key's sites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"delete":{"operationId":"deleteProject","summary":"Delete a project and its items","description":"Requires the `showcases:write` scope (create and edit showcases, categories, and tags).","tags":["Projects"],"security":[{"apiKey":[]}],"x-required-scope":"showcases:write","x-idempotent":false,"parameters":[{"name":"showcaseId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"projectId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"Done"},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"`INVALID_API_KEY`: missing, invalid, expired, or revoked key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"`INSUFFICIENT_SCOPE` (names the missing scope), `SITE_RESTRICTED_KEY`, or a plan limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found, or outside the key's sites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/showcases/{showcaseId}/projects/{projectId}/items/order":{"put":{"operationId":"reorderProjectItems","summary":"Reorder a project's photos and videos","description":"Requires the `showcases:write` scope (create and edit showcases, categories, and tags).","tags":["Projects"],"security":[{"apiKey":[]}],"x-required-scope":"showcases:write","x-idempotent":false,"parameters":[{"name":"showcaseId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"projectId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReorderProjectItemsRequest"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectWithItems"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"`INVALID_API_KEY`: missing, invalid, expired, or revoked key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"`INSUFFICIENT_SCOPE` (names the missing scope), `SITE_RESTRICTED_KEY`, or a plan limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found, or outside the key's sites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/showcases/{showcaseId}/project-details":{"get":{"operationId":"getProjectDetails","summary":"The custom project details and their version","description":"Requires the `showcases:read` scope (see showcases and their categories).","tags":["Projects"],"security":[{"apiKey":[]}],"x-required-scope":"showcases:read","x-idempotent":false,"parameters":[{"name":"showcaseId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectDetailsSchema"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"`INVALID_API_KEY`: missing, invalid, expired, or revoked key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"`INSUFFICIENT_SCOPE` (names the missing scope), `SITE_RESTRICTED_KEY`, or a plan limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found, or outside the key's sites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"put":{"operationId":"updateProjectDetails","summary":"Change the custom project details (dry run, conflict check, destructive confirmation)","description":"Requires the `showcases:write` scope (create and edit showcases, categories, and tags). Send `Idempotency-Key` to retry safely: a repeat with the same key and body within 24 hours returns the first response.","tags":["Projects"],"security":[{"apiKey":[]}],"x-required-scope":"showcases:write","x-idempotent":true,"parameters":[{"name":"showcaseId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateProjectDetailsRequest"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectDetailsChangeResult"}}},"headers":{"idempotent-replayed":{"$ref":"#/components/headers/IdempotentReplayed"}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"`INVALID_API_KEY`: missing, invalid, expired, or revoked key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"`INSUFFICIENT_SCOPE` (names the missing scope), `SITE_RESTRICTED_KEY`, or a plan limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found, or outside the key's sites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"`IDEMPOTENCY_KEY_IN_PROGRESS` or a conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"`IDEMPOTENCY_KEY_REUSED`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/showcases/{showcaseId}/photos/uploads":{"post":{"operationId":"createPhotoUploads","summary":"Get upload URLs for up to 100 photos","description":"Requires the `media:write` scope (upload photos and videos). Send `Idempotency-Key` to retry safely: a repeat with the same key and body within 24 hours returns the first response.","tags":["Uploads"],"security":[{"apiKey":[]}],"x-required-scope":"media:write","x-idempotent":true,"parameters":[{"name":"showcaseId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePhotoUploadsRequest"}}}},"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePhotoUploadsResponse"}}},"headers":{"idempotent-replayed":{"$ref":"#/components/headers/IdempotentReplayed"}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"`INVALID_API_KEY`: missing, invalid, expired, or revoked key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"`INSUFFICIENT_SCOPE` (names the missing scope), `SITE_RESTRICTED_KEY`, or a plan limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found, or outside the key's sites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"`IDEMPOTENCY_KEY_IN_PROGRESS` or a conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"`IDEMPOTENCY_KEY_REUSED`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/showcases/{showcaseId}/photos/uploads/complete":{"post":{"operationId":"completePhotoUploads","summary":"Finish uploaded photos so they process","description":"Requires the `media:write` scope (upload photos and videos). Send `Idempotency-Key` to retry safely: a repeat with the same key and body within 24 hours returns the first response.","tags":["Uploads"],"security":[{"apiKey":[]}],"x-required-scope":"media:write","x-idempotent":true,"parameters":[{"name":"showcaseId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompletePhotoUploadsRequest"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompletePhotoUploadsResponse"}}},"headers":{"idempotent-replayed":{"$ref":"#/components/headers/IdempotentReplayed"}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"`INVALID_API_KEY`: missing, invalid, expired, or revoked key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"`INSUFFICIENT_SCOPE` (names the missing scope), `SITE_RESTRICTED_KEY`, or a plan limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found, or outside the key's sites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"`IDEMPOTENCY_KEY_IN_PROGRESS` or a conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"`IDEMPOTENCY_KEY_REUSED`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/sites/{siteId}/videos":{"get":{"operationId":"listVideos","summary":"List a site's videos","description":"Requires the `videos:read` scope (see videos in your library).","tags":["Videos"],"security":[{"apiKey":[]}],"x-required-scope":"videos:read","x-idempotent":false,"parameters":[{"name":"siteId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"cursor","in":"query","required":false,"schema":{"type":"string","format":"uuid"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100}},{"name":"trashed","in":"query","required":false,"schema":{"type":"string","enum":["true","false"],"default":"false"}},{"name":"folderId","in":"query","required":false,"schema":{"type":"string"}},{"name":"status","in":"query","required":false,"schema":{"type":"string","enum":["uploading","processing","ready","failed"]}},{"name":"q","in":"query","required":false,"schema":{"type":"string","maxLength":255}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoList"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"`INVALID_API_KEY`: missing, invalid, expired, or revoked key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"`INSUFFICIENT_SCOPE` (names the missing scope), `SITE_RESTRICTED_KEY`, or a plan limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found, or outside the key's sites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/videos/{videoId}":{"get":{"operationId":"getVideo","summary":"Get a video","description":"Requires the `videos:read` scope (see videos in your library).","tags":["Videos"],"security":[{"apiKey":[]}],"x-required-scope":"videos:read","x-idempotent":false,"parameters":[{"name":"videoId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoDetail"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"`INVALID_API_KEY`: missing, invalid, expired, or revoked key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"`INSUFFICIENT_SCOPE` (names the missing scope), `SITE_RESTRICTED_KEY`, or a plan limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found, or outside the key's sites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/sites/{siteId}/videos/uploads":{"post":{"operationId":"createVideoUpload","summary":"Start a multipart video upload","description":"Requires the `media:write` scope (upload photos and videos). Send `Idempotency-Key` to retry safely: a repeat with the same key and body within 24 hours returns the first response.","tags":["Uploads"],"security":[{"apiKey":[]}],"x-required-scope":"media:write","x-idempotent":true,"parameters":[{"name":"siteId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateVideoUploadRequest"}}}},"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateVideoUploadResponse"}}},"headers":{"idempotent-replayed":{"$ref":"#/components/headers/IdempotentReplayed"}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"`INVALID_API_KEY`: missing, invalid, expired, or revoked key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"`INSUFFICIENT_SCOPE` (names the missing scope), `SITE_RESTRICTED_KEY`, or a plan limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found, or outside the key's sites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"`IDEMPOTENCY_KEY_IN_PROGRESS` or a conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"`IDEMPOTENCY_KEY_REUSED`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/uploads/{uploadSessionId}":{"get":{"operationId":"getUpload","summary":"Upload progress, for resuming","description":"Requires the `media:write` scope (upload photos and videos).","tags":["Uploads"],"security":[{"apiKey":[]}],"x-required-scope":"media:write","x-idempotent":false,"parameters":[{"name":"uploadSessionId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadSession"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"`INVALID_API_KEY`: missing, invalid, expired, or revoked key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"`INSUFFICIENT_SCOPE` (names the missing scope), `SITE_RESTRICTED_KEY`, or a plan limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found, or outside the key's sites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"delete":{"operationId":"cancelUpload","summary":"Cancel an unfinished upload","description":"Requires the `media:write` scope (upload photos and videos).","tags":["Uploads"],"security":[{"apiKey":[]}],"x-required-scope":"media:write","x-idempotent":false,"parameters":[{"name":"uploadSessionId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"Done"},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"`INVALID_API_KEY`: missing, invalid, expired, or revoked key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"`INSUFFICIENT_SCOPE` (names the missing scope), `SITE_RESTRICTED_KEY`, or a plan limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found, or outside the key's sites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/uploads/{uploadSessionId}/parts":{"post":{"operationId":"presignUploadParts","summary":"Get PUT URLs for up to 100 parts","description":"Requires the `media:write` scope (upload photos and videos).","tags":["Uploads"],"security":[{"apiKey":[]}],"x-required-scope":"media:write","x-idempotent":false,"parameters":[{"name":"uploadSessionId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PresignPartsRequest"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PresignPartsResponse"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"`INVALID_API_KEY`: missing, invalid, expired, or revoked key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"`INSUFFICIENT_SCOPE` (names the missing scope), `SITE_RESTRICTED_KEY`, or a plan limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found, or outside the key's sites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/uploads/{uploadSessionId}/complete":{"post":{"operationId":"completeVideoUpload","summary":"Finish the upload so the video processes","description":"Requires the `media:write` scope (upload photos and videos). Send `Idempotency-Key` to retry safely: a repeat with the same key and body within 24 hours returns the first response.","tags":["Uploads"],"security":[{"apiKey":[]}],"x-required-scope":"media:write","x-idempotent":true,"parameters":[{"name":"uploadSessionId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompleteVideoUploadResponse"}}},"headers":{"idempotent-replayed":{"$ref":"#/components/headers/IdempotentReplayed"}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"`INVALID_API_KEY`: missing, invalid, expired, or revoked key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"`INSUFFICIENT_SCOPE` (names the missing scope), `SITE_RESTRICTED_KEY`, or a plan limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found, or outside the key's sites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"`IDEMPOTENCY_KEY_IN_PROGRESS` or a conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"`IDEMPOTENCY_KEY_REUSED`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/videos/{videoId}/embed":{"get":{"operationId":"getVideoEmbed","summary":"Embed code and watch link for a video","description":"Requires the `embed:read` scope (get embed codes).","tags":["Embeds"],"security":[{"apiKey":[]}],"x-required-scope":"embed:read","x-idempotent":false,"parameters":[{"name":"videoId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoEmbed"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"`INVALID_API_KEY`: missing, invalid, expired, or revoked key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"`INSUFFICIENT_SCOPE` (names the missing scope), `SITE_RESTRICTED_KEY`, or a plan limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found, or outside the key's sites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/showcases/{showcaseId}/embed":{"get":{"operationId":"getShowcaseEmbed","summary":"Embed code for a showcase, each category, and each project","description":"Requires the `embed:read` scope (get embed codes).","tags":["Embeds"],"security":[{"apiKey":[]}],"x-required-scope":"embed:read","x-idempotent":false,"parameters":[{"name":"showcaseId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"projectUrl","in":"query","required":false,"schema":{"type":"string","maxLength":300,"description":"Projects showcases: link index cards to the website's own pages, e.g. /work/{slug}."}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShowcaseEmbed"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"`INVALID_API_KEY`: missing, invalid, expired, or revoked key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"`INSUFFICIENT_SCOPE` (names the missing scope), `SITE_RESTRICTED_KEY`, or a plan limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found, or outside the key's sites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/usage":{"get":{"operationId":"getUsage","summary":"Storage and delivery usage this period","description":"Requires the `usage:read` scope (see storage and delivery usage).","tags":["Usage"],"security":[{"apiKey":[]}],"x-required-scope":"usage:read","x-idempotent":false,"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UsageSummary"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"`INVALID_API_KEY`: missing, invalid, expired, or revoked key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"`INSUFFICIENT_SCOPE` (names the missing scope), `SITE_RESTRICTED_KEY`, or a plan limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found, or outside the key's sites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/sites/{siteId}/collections":{"get":{"operationId":"listCollections","summary":"List a site's collections with plan limits","description":"Requires the `collections:read` scope (see collections, their fields, and items (drafts included)).","tags":["Collections"],"security":[{"apiKey":[]}],"x-required-scope":"collections:read","x-idempotent":false,"parameters":[{"name":"siteId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"trashed","in":"query","required":false,"schema":{"type":"string","enum":["true","false"],"default":"false"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionList"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"`INVALID_API_KEY`: missing, invalid, expired, or revoked key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"`INSUFFICIENT_SCOPE` (names the missing scope), `SITE_RESTRICTED_KEY`, or a plan limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found, or outside the key's sites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"post":{"operationId":"createCollection","summary":"Create a collection from a template, custom fields, or blank","description":"Requires the `collections:schema` scope (create collections and change their fields (structure)). Send `Idempotency-Key` to retry safely: a repeat with the same key and body within 24 hours returns the first response.","tags":["Collections"],"security":[{"apiKey":[]}],"x-required-scope":"collections:schema","x-idempotent":true,"parameters":[{"name":"siteId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCollectionRequest"}}}},"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionDetail"}}},"headers":{"idempotent-replayed":{"$ref":"#/components/headers/IdempotentReplayed"}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"`INVALID_API_KEY`: missing, invalid, expired, or revoked key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"`INSUFFICIENT_SCOPE` (names the missing scope), `SITE_RESTRICTED_KEY`, or a plan limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found, or outside the key's sites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"`IDEMPOTENCY_KEY_IN_PROGRESS` or a conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"`IDEMPOTENCY_KEY_REUSED`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/sites/{siteId}/collections/plan":{"post":{"operationId":"planCollections","summary":"Preview (default) or apply several collections at once, conflict-aware","description":"Requires the `collections:schema` scope (create collections and change their fields (structure)).","tags":["Collections"],"security":[{"apiKey":[]}],"x-required-scope":"collections:schema","x-idempotent":false,"parameters":[{"name":"siteId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionPlanRequest"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionPlanResult"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"`INVALID_API_KEY`: missing, invalid, expired, or revoked key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"`INSUFFICIENT_SCOPE` (names the missing scope), `SITE_RESTRICTED_KEY`, or a plan limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found, or outside the key's sites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/sites/{siteId}/collections/export":{"get":{"operationId":"exportSiteCollections","summary":"Export every collection of a site (handoff)","description":"Requires the `collections:read` scope (see collections, their fields, and items (drafts included)).","tags":["Collections"],"security":[{"apiKey":[]}],"x-required-scope":"collections:read","x-idempotent":false,"parameters":[{"name":"siteId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionSiteExport"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"`INVALID_API_KEY`: missing, invalid, expired, or revoked key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"`INSUFFICIENT_SCOPE` (names the missing scope), `SITE_RESTRICTED_KEY`, or a plan limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found, or outside the key's sites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/collections/{collectionId}":{"get":{"operationId":"getCollection","summary":"Get a collection with its fields","description":"Requires the `collections:read` scope (see collections, their fields, and items (drafts included)).","tags":["Collections"],"security":[{"apiKey":[]}],"x-required-scope":"collections:read","x-idempotent":false,"parameters":[{"name":"collectionId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionDetail"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"`INVALID_API_KEY`: missing, invalid, expired, or revoked key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"`INSUFFICIENT_SCOPE` (names the missing scope), `SITE_RESTRICTED_KEY`, or a plan limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found, or outside the key's sites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"patch":{"operationId":"updateCollection","summary":"Change name, slug, description, visibility, or the site time zone","description":"Requires the `collections:schema` scope (create collections and change their fields (structure)).","tags":["Collections"],"security":[{"apiKey":[]}],"x-required-scope":"collections:schema","x-idempotent":false,"parameters":[{"name":"collectionId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCollectionRequest"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionDetail"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"`INVALID_API_KEY`: missing, invalid, expired, or revoked key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"`INSUFFICIENT_SCOPE` (names the missing scope), `SITE_RESTRICTED_KEY`, or a plan limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found, or outside the key's sites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"delete":{"operationId":"deleteCollection","summary":"Move a collection to the trash (needs confirm=true)","description":"Requires the `collections:schema` scope (create collections and change their fields (structure)).","tags":["Collections"],"security":[{"apiKey":[]}],"x-required-scope":"collections:schema","x-idempotent":false,"parameters":[{"name":"collectionId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"confirm","in":"query","required":false,"schema":{"type":"string","enum":["true","false"]}}],"responses":{"204":{"description":"Done"},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"`INVALID_API_KEY`: missing, invalid, expired, or revoked key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"`INSUFFICIENT_SCOPE` (names the missing scope), `SITE_RESTRICTED_KEY`, or a plan limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found, or outside the key's sites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/collections/{collectionId}/schema":{"get":{"operationId":"getCollectionSchema","summary":"Fields, schemaVersion, and generated TypeScript","description":"Requires the `collections:read` scope (see collections, their fields, and items (drafts included)).","tags":["Collections"],"security":[{"apiKey":[]}],"x-required-scope":"collections:read","x-idempotent":false,"parameters":[{"name":"collectionId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionSchema"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"`INVALID_API_KEY`: missing, invalid, expired, or revoked key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"`INSUFFICIENT_SCOPE` (names the missing scope), `SITE_RESTRICTED_KEY`, or a plan limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found, or outside the key's sites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"put":{"operationId":"updateCollectionSchema","summary":"Change fields (dry run, conflict check, destructive confirmation)","description":"Requires the `collections:schema` scope (create collections and change their fields (structure)).","tags":["Collections"],"security":[{"apiKey":[]}],"x-required-scope":"collections:schema","x-idempotent":false,"parameters":[{"name":"collectionId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCollectionSchemaRequest"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionSchemaChangeResult"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"`INVALID_API_KEY`: missing, invalid, expired, or revoked key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"`INSUFFICIENT_SCOPE` (names the missing scope), `SITE_RESTRICTED_KEY`, or a plan limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found, or outside the key's sites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/collections/{collectionId}/activity":{"get":{"operationId":"listCollectionActivity","summary":"Recent changes and who made them","description":"Requires the `collections:read` scope (see collections, their fields, and items (drafts included)).","tags":["Collections"],"security":[{"apiKey":[]}],"x-required-scope":"collections:read","x-idempotent":false,"parameters":[{"name":"collectionId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionActivity"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"`INVALID_API_KEY`: missing, invalid, expired, or revoked key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"`INSUFFICIENT_SCOPE` (names the missing scope), `SITE_RESTRICTED_KEY`, or a plan limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found, or outside the key's sites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/collections/{collectionId}/activity/{activityId}/undo":{"post":{"operationId":"undoCollectionSchemaChange","summary":"Undo the most recent schema change when it lost no data","description":"Requires the `collections:schema` scope (create collections and change their fields (structure)).","tags":["Collections"],"security":[{"apiKey":[]}],"x-required-scope":"collections:schema","x-idempotent":false,"parameters":[{"name":"collectionId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"activityId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionSchemaChangeResult"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"`INVALID_API_KEY`: missing, invalid, expired, or revoked key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"`INSUFFICIENT_SCOPE` (names the missing scope), `SITE_RESTRICTED_KEY`, or a plan limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found, or outside the key's sites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/collections/{collectionId}/export":{"get":{"operationId":"exportCollection","summary":"Download items as CSV or JSON","description":"Requires the `collections:read` scope (see collections, their fields, and items (drafts included)).","tags":["Collections"],"security":[{"apiKey":[]}],"x-required-scope":"collections:read","x-idempotent":false,"parameters":[{"name":"collectionId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"format","in":"query","required":false,"schema":{"type":"string","enum":["csv","json"],"default":"csv"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionFile"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"`INVALID_API_KEY`: missing, invalid, expired, or revoked key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"`INSUFFICIENT_SCOPE` (names the missing scope), `SITE_RESTRICTED_KEY`, or a plan limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found, or outside the key's sites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/collections/{collectionId}/items":{"get":{"operationId":"listCollectionItems","summary":"List items, drafts included; filter, search, sort, paginate","description":"Requires the `collections:read` scope (see collections, their fields, and items (drafts included)).","tags":["Collection items"],"security":[{"apiKey":[]}],"x-required-scope":"collections:read","x-idempotent":false,"parameters":[{"name":"collectionId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"status","in":"query","required":false,"schema":{"type":"string","enum":["draft","published"]}},{"name":"trashed","in":"query","required":false,"schema":{"type":"string","enum":["true","false"],"default":"false"}},{"name":"q","in":"query","required":false,"schema":{"type":"string","maxLength":200}},{"name":"sort","in":"query","required":false,"schema":{"type":"string","description":"position, createdAt, updatedAt, publishedAt, title, or a field key; prefix - for descending."}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0}},{"name":"filter[fieldKey]","in":"query","required":false,"schema":{"type":"string","description":"Equals any of comma-separated values; also filter[fieldKey][ne|gte|lte|contains]."}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionItemList"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"`INVALID_API_KEY`: missing, invalid, expired, or revoked key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"`INSUFFICIENT_SCOPE` (names the missing scope), `SITE_RESTRICTED_KEY`, or a plan limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found, or outside the key's sites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"post":{"operationId":"createCollectionItem","summary":"Add an item (published unless status is draft)","description":"Requires the `collections:write` scope (add, edit, reorder, and delete collection items). Send `Idempotency-Key` to retry safely: a repeat with the same key and body within 24 hours returns the first response.","tags":["Collection items"],"security":[{"apiKey":[]}],"x-required-scope":"collections:write","x-idempotent":true,"parameters":[{"name":"collectionId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCollectionItemRequest"}}}},"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionItemResult"}}},"headers":{"idempotent-replayed":{"$ref":"#/components/headers/IdempotentReplayed"}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"`INVALID_API_KEY`: missing, invalid, expired, or revoked key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"`INSUFFICIENT_SCOPE` (names the missing scope), `SITE_RESTRICTED_KEY`, or a plan limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found, or outside the key's sites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"`IDEMPOTENCY_KEY_IN_PROGRESS` or a conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"`IDEMPOTENCY_KEY_REUSED`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/collections/{collectionId}/items/bulk":{"post":{"operationId":"bulkCreateCollectionItems","summary":"Add up to 500 items with per-item errors","description":"Requires the `collections:write` scope (add, edit, reorder, and delete collection items). Send `Idempotency-Key` to retry safely: a repeat with the same key and body within 24 hours returns the first response.","tags":["Collection items"],"security":[{"apiKey":[]}],"x-required-scope":"collections:write","x-idempotent":true,"parameters":[{"name":"collectionId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkCreateCollectionItemsRequest"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkCreateCollectionItemsResult"}}},"headers":{"idempotent-replayed":{"$ref":"#/components/headers/IdempotentReplayed"}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"`INVALID_API_KEY`: missing, invalid, expired, or revoked key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"`INSUFFICIENT_SCOPE` (names the missing scope), `SITE_RESTRICTED_KEY`, or a plan limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found, or outside the key's sites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"`IDEMPOTENCY_KEY_IN_PROGRESS` or a conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"`IDEMPOTENCY_KEY_REUSED`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/collections/{collectionId}/items/actions":{"post":{"operationId":"bulkCollectionItemsAction","summary":"Publish, unpublish, trash, or restore many items","description":"Requires the `collections:write` scope (add, edit, reorder, and delete collection items).","tags":["Collection items"],"security":[{"apiKey":[]}],"x-required-scope":"collections:write","x-idempotent":false,"parameters":[{"name":"collectionId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkCollectionItemsActionRequest"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkCollectionItemsActionResult"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"`INVALID_API_KEY`: missing, invalid, expired, or revoked key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"`INSUFFICIENT_SCOPE` (names the missing scope), `SITE_RESTRICTED_KEY`, or a plan limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found, or outside the key's sites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/collections/{collectionId}/items/order":{"put":{"operationId":"reorderCollectionItems","summary":"Set the manual order of every item","description":"Requires the `collections:write` scope (add, edit, reorder, and delete collection items).","tags":["Collection items"],"security":[{"apiKey":[]}],"x-required-scope":"collections:write","x-idempotent":false,"parameters":[{"name":"collectionId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReorderCollectionItemsRequest"}}}},"responses":{"204":{"description":"Done"},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"`INVALID_API_KEY`: missing, invalid, expired, or revoked key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"`INSUFFICIENT_SCOPE` (names the missing scope), `SITE_RESTRICTED_KEY`, or a plan limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found, or outside the key's sites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/collections/{collectionId}/items/{itemId}":{"get":{"operationId":"getCollectionItem","summary":"Get an item by id or slug","description":"Requires the `collections:read` scope (see collections, their fields, and items (drafts included)).","tags":["Collection items"],"security":[{"apiKey":[]}],"x-required-scope":"collections:read","x-idempotent":false,"parameters":[{"name":"collectionId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"itemId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionItemResult"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"`INVALID_API_KEY`: missing, invalid, expired, or revoked key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"`INSUFFICIENT_SCOPE` (names the missing scope), `SITE_RESTRICTED_KEY`, or a plan limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found, or outside the key's sites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"patch":{"operationId":"updateCollectionItem","summary":"Change values, status, or slug (last-write check)","description":"Requires the `collections:write` scope (add, edit, reorder, and delete collection items).","tags":["Collection items"],"security":[{"apiKey":[]}],"x-required-scope":"collections:write","x-idempotent":false,"parameters":[{"name":"collectionId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"itemId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCollectionItemRequest"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionItemResult"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"`INVALID_API_KEY`: missing, invalid, expired, or revoked key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"`INSUFFICIENT_SCOPE` (names the missing scope), `SITE_RESTRICTED_KEY`, or a plan limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found, or outside the key's sites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"delete":{"operationId":"deleteCollectionItem","summary":"Move an item to the trash","description":"Requires the `collections:write` scope (add, edit, reorder, and delete collection items).","tags":["Collection items"],"security":[{"apiKey":[]}],"x-required-scope":"collections:write","x-idempotent":false,"parameters":[{"name":"collectionId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"itemId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"Done"},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"`INVALID_API_KEY`: missing, invalid, expired, or revoked key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"`INSUFFICIENT_SCOPE` (names the missing scope), `SITE_RESTRICTED_KEY`, or a plan limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found, or outside the key's sites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/collections/{collectionId}/items/{itemId}/restore":{"post":{"operationId":"restoreCollectionItem","summary":"Restore an item from the trash","description":"Requires the `collections:write` scope (add, edit, reorder, and delete collection items).","tags":["Collection items"],"security":[{"apiKey":[]}],"x-required-scope":"collections:write","x-idempotent":false,"parameters":[{"name":"collectionId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"itemId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionItemResult"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"`INVALID_API_KEY`: missing, invalid, expired, or revoked key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"`INSUFFICIENT_SCOPE` (names the missing scope), `SITE_RESTRICTED_KEY`, or a plan limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found, or outside the key's sites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/collections/{collectionId}/media/uploads":{"post":{"operationId":"createCollectionPhotoUploads","summary":"Get upload URLs for photos used in image fields","description":"Requires the `collections:write` scope (add, edit, reorder, and delete collection items).","tags":["Collection items"],"security":[{"apiKey":[]}],"x-required-scope":"collections:write","x-idempotent":false,"parameters":[{"name":"collectionId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePhotoUploadsRequest"}}}},"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePhotoUploadsResponse"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"`INVALID_API_KEY`: missing, invalid, expired, or revoked key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"`INSUFFICIENT_SCOPE` (names the missing scope), `SITE_RESTRICTED_KEY`, or a plan limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found, or outside the key's sites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/collections/{collectionId}/media/uploads/complete":{"post":{"operationId":"completeCollectionPhotoUploads","summary":"Finish uploaded photos so they process","description":"Requires the `collections:write` scope (add, edit, reorder, and delete collection items).","tags":["Collection items"],"security":[{"apiKey":[]}],"x-required-scope":"collections:write","x-idempotent":false,"parameters":[{"name":"collectionId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompletePhotoUploadsRequest"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompletePhotoUploadsResponse"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"`INVALID_API_KEY`: missing, invalid, expired, or revoked key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"`INSUFFICIENT_SCOPE` (names the missing scope), `SITE_RESTRICTED_KEY`, or a plan limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found, or outside the key's sites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/sites/{siteId}/feedback":{"get":{"operationId":"listFeedback","summary":"List a site's client feedback (open and in progress by default)","description":"Requires the `feedback:read` scope (see website change requests from clients, with their context and replies).","tags":["Feedback"],"security":[{"apiKey":[]}],"x-required-scope":"feedback:read","x-idempotent":false,"parameters":[{"name":"siteId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"status","in":"query","required":false,"schema":{"type":"string","description":"Comma-separated: open, in_progress, done, wont_do."}},{"name":"type","in":"query","required":false,"schema":{"type":"string","enum":["comment","text_change","general"]}},{"name":"page","in":"query","required":false,"schema":{"type":"string","maxLength":200,"description":"Page path contains."}},{"name":"sort","in":"query","required":false,"schema":{"type":"string","enum":["newest","oldest"],"default":"newest"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackList"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"`INVALID_API_KEY`: missing, invalid, expired, or revoked key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"`INSUFFICIENT_SCOPE` (names the missing scope), `SITE_RESTRICTED_KEY`, or a plan limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found, or outside the key's sites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/feedback/{requestId}":{"get":{"operationId":"getFeedback","summary":"Get a request with page context, attachments, and the thread","description":"Requires the `feedback:read` scope (see website change requests from clients, with their context and replies).","tags":["Feedback"],"security":[{"apiKey":[]}],"x-required-scope":"feedback:read","x-idempotent":false,"parameters":[{"name":"requestId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackRequestDetail"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"`INVALID_API_KEY`: missing, invalid, expired, or revoked key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"`INSUFFICIENT_SCOPE` (names the missing scope), `SITE_RESTRICTED_KEY`, or a plan limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found, or outside the key's sites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"patch":{"operationId":"updateFeedbackStatus","summary":"Change status; done with a note emails the client","description":"Requires the `feedback:write` scope (reply to change requests and update their status).","tags":["Feedback"],"security":[{"apiKey":[]}],"x-required-scope":"feedback:write","x-idempotent":false,"parameters":[{"name":"requestId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateFeedbackRequest"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackRequestDetail"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"`INVALID_API_KEY`: missing, invalid, expired, or revoked key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"`INSUFFICIENT_SCOPE` (names the missing scope), `SITE_RESTRICTED_KEY`, or a plan limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found, or outside the key's sites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/feedback/{requestId}/replies":{"post":{"operationId":"replyToFeedback","summary":"Reply in the thread (the team's replies email the client)","description":"Requires the `feedback:write` scope (reply to change requests and update their status). Send `Idempotency-Key` to retry safely: a repeat with the same key and body within 24 hours returns the first response.","tags":["Feedback"],"security":[{"apiKey":[]}],"x-required-scope":"feedback:write","x-idempotent":true,"parameters":[{"name":"requestId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackReplyRequest"}}}},"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackMessage"}}},"headers":{"idempotent-replayed":{"$ref":"#/components/headers/IdempotentReplayed"}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"`INVALID_API_KEY`: missing, invalid, expired, or revoked key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"`INSUFFICIENT_SCOPE` (names the missing scope), `SITE_RESTRICTED_KEY`, or a plan limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found, or outside the key's sites","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"`IDEMPOTENCY_KEY_IN_PROGRESS` or a conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"`IDEMPOTENCY_KEY_REUSED`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}}},"components":{"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","description":"Scopes: `sites:read` (See your client sites), `sites:write` (Create client sites), `showcases:read` (See showcases and their categories), `showcases:write` (Create and edit showcases, categories, and tags), `videos:read` (See videos in your library), `media:write` (Upload photos and videos), `embed:read` (Get embed codes), `usage:read` (See storage and delivery usage), `collections:read` (See collections, their fields, and items (drafts included)), `collections:write` (Add, edit, reorder, and delete collection items), `collections:schema` (Create collections and change their fields (structure)), `feedback:read` (See website change requests from clients, with their context and replies), `feedback:write` (Reply to change requests and update their status)."}},"parameters":{"IdempotencyKey":{"name":"Idempotency-Key","in":"header","required":false,"description":"Unique per request, up to 255 printable ASCII characters. Reusing it with a different request is a 422.","schema":{"type":"string","minLength":1,"maxLength":255}}},"headers":{"IdempotentReplayed":{"description":"`true` when the response was replayed from an earlier request with the same Idempotency-Key.","schema":{"type":"string","enum":["true"]}}},"schemas":{"ApiError":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","examples":["INVALID_API_KEY","VALIDATION_FAILED","NOT_FOUND"]},"message":{"type":"string"},"fieldErrors":{"type":"object","additionalProperties":{"type":"array","items":{"type":"string"}}}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false},"Scope":{"type":"string","enum":["sites:read","sites:write","showcases:read","showcases:write","videos:read","media:write","embed:read","usage:read","collections:read","collections:write","collections:schema","feedback:read","feedback:write"]},"DeviceAuthorizationRequest":{"type":"object","properties":{"client_name":{"type":"string","maxLength":60,"default":"Dropl MCP"},"device_name":{"type":"string","maxLength":60},"scopes":{"type":"array","items":{"$ref":"#/components/schemas/Scope"},"minItems":1,"uniqueItems":true,"description":"Defaults to every scope."}},"required":[],"additionalProperties":false},"DeviceAuthorizationResponse":{"type":"object","properties":{"device_code":{"type":"string"},"user_code":{"type":"string","pattern":"^[BCDFGHJKLMNPQRSTVWXZ]{4}-[BCDFGHJKLMNPQRSTVWXZ]{4}$"},"verification_uri":{"type":"string","format":"uri"},"verification_uri_complete":{"type":"string","format":"uri"},"expires_in":{"type":"integer"},"interval":{"type":"integer"}},"required":["device_code","user_code","verification_uri","verification_uri_complete","expires_in","interval"],"additionalProperties":false},"DeviceTokenRequest":{"type":"object","properties":{"grant_type":{"const":"urn:ietf:params:oauth:grant-type:device_code"},"device_code":{"type":"string"}},"required":["grant_type","device_code"],"additionalProperties":false},"DeviceTokenResponse":{"type":"object","properties":{"access_token":{"type":"string","description":"The API key. Shown once; store it securely."},"token_type":{"const":"Bearer"},"api_key":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"prefix":{"type":"string"},"scopes":{"type":"array","items":{"$ref":"#/components/schemas/Scope"}},"siteIds":{"anyOf":[{"type":"array","items":{"type":"string","format":"uuid"}},{"type":"null"}]}},"required":["id","name","prefix","scopes","siteIds"],"additionalProperties":false},"organization":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"}},"required":["id","name"],"additionalProperties":false}},"required":["access_token","token_type","api_key","organization"],"additionalProperties":false},"DeviceTokenError":{"type":"object","properties":{"error":{"type":"string","enum":["authorization_pending","slow_down","access_denied","expired_token","invalid_grant","invalid_request","unsupported_grant_type"]},"error_description":{"type":"string"}},"required":["error","error_description"],"additionalProperties":false},"Me":{"type":"object","properties":{"organization":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"slug":{"type":"string"}},"required":["id","name","slug"],"additionalProperties":false},"user":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"email":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","email","name"],"additionalProperties":false},"role":{"type":"string","enum":["OWNER","ADMIN"]},"apiKey":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"prefix":{"type":"string"},"scopes":{"type":"array","items":{"$ref":"#/components/schemas/Scope"}},"siteIds":{"anyOf":[{"type":"array","items":{"type":"string","format":"uuid"}},{"type":"null"}]},"expiresAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]}},"required":["id","name","prefix","scopes","siteIds","expiresAt"],"additionalProperties":false},"webAppUrl":{"type":"string","format":"uri"}},"required":["organization","user","role","apiKey","webAppUrl"],"additionalProperties":false},"Site":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"isDefault":{"type":"boolean"},"domains":{"type":"array","items":{"type":"string"}},"canEdit":{"type":"boolean"}},"required":["id","name","isDefault","domains","canEdit"],"additionalProperties":false},"SitesResponse":{"type":"object","properties":{"sites":{"type":"array","items":{"$ref":"#/components/schemas/Site"}},"allowance":{"type":"object","properties":{"used":{"type":"integer"},"limit":{"anyOf":[{"type":"integer"},{"type":"null"}]}},"required":["used","limit"],"additionalProperties":false}},"required":["sites","allowance"],"additionalProperties":false},"CreateSiteRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"domain":{"type":"string","maxLength":253,"description":"Hostname, e.g. example.com or *.example.com. A pasted URL is reduced to its lowercase (punycode) hostname without port, path, or a leading www. Saved to the site's embed domain list."}},"required":["name"],"additionalProperties":false},"ShowcaseSummary":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"publicId":{"type":"string"},"title":{"type":"string"},"type":{"type":"string","enum":["gallery","projects"],"description":"gallery: one grid of photos and videos. projects: a portfolio of projects, each with its own page."},"layout":{"type":"string","enum":["grid","collage"]},"readyImageCount":{"type":"integer"},"itemCount":{"type":"integer"},"videoCount":{"type":"integer"},"projectCount":{"type":"integer"},"coverUrl":{"anyOf":[{"type":"string"},{"type":"null"}]},"isPrivate":{"type":"boolean","description":"Private client photos (e.g. \"Photos from feedback\"): never public, and the embed endpoint answers 409 SHOWCASE_PRIVATE."},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"deletedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]}},"required":["id","publicId","title","type","layout","readyImageCount","itemCount","videoCount","projectCount","coverUrl","isPrivate","createdAt","updatedAt","deletedAt"],"additionalProperties":false},"ShowcaseList":{"type":"object","properties":{"galleries":{"type":"array","items":{"$ref":"#/components/schemas/ShowcaseSummary"}},"nextCursor":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]}},"required":["galleries","nextCursor"],"additionalProperties":false},"Category":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"slug":{"type":"string"},"position":{"type":"integer"},"itemCount":{"type":"integer"},"projectCount":{"type":"integer"}},"required":["id","name","slug","position","itemCount","projectCount"],"additionalProperties":false},"ShowcaseItem":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"kind":{"type":"string","enum":["photo","video"]},"status":{"type":"string","enum":["uploading","processing","ready","failed"]},"failureReason":{"anyOf":[{"type":"string"},{"type":"null"}]},"position":{"type":"integer"},"altText":{"anyOf":[{"type":"string"},{"type":"null"}]},"width":{"anyOf":[{"type":"integer"},{"type":"null"}]},"height":{"anyOf":[{"type":"integer"},{"type":"null"}]},"placeholderColor":{"anyOf":[{"type":"string"},{"type":"null"}]},"previewUrl":{"anyOf":[{"type":"string"},{"type":"null"}]},"largeUrl":{"anyOf":[{"type":"string"},{"type":"null"}]},"sourceFileName":{"anyOf":[{"type":"string"},{"type":"null"}]},"categoryIds":{"type":"array","items":{"type":"string","format":"uuid"}},"projectId":{"anyOf":[{"type":"string","format":"uuid","description":"The project the item belongs to (projects showcases)."},{"type":"null"}]},"video":{"anyOf":[{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"publicId":{"type":"string"},"title":{"type":"string"},"durationMs":{"anyOf":[{"type":"integer"},{"type":"null"}]},"availability":{"type":"string","enum":["public","processing","failed","private","password","embed_disabled","trashed"]}},"required":["id","publicId","title","durationMs","availability"],"additionalProperties":false},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time"}},"required":["id","kind","status","failureReason","position","altText","width","height","placeholderColor","previewUrl","largeUrl","sourceFileName","categoryIds","projectId","video","createdAt"],"additionalProperties":false},"ShowcaseDetail":{"allOf":[{"$ref":"#/components/schemas/ShowcaseSummary"},{"type":"object","properties":{"workspaceId":{"type":"string","format":"uuid"},"purgeAfter":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]},"gridFit":{"type":"string","enum":["cover","contain"]},"showCategoryFilters":{"type":"boolean"},"pageSize":{"anyOf":[{"type":"integer"},{"type":"null"}]},"categories":{"type":"array","items":{"$ref":"#/components/schemas/Category"}},"images":{"type":"array","items":{"$ref":"#/components/schemas/ShowcaseItem"}},"projectDetailFields":{"type":"array","items":{"$ref":"#/components/schemas/ProjectDetailField"}},"projectDetailsVersion":{"type":"integer"},"projects":{"type":"array","items":{"$ref":"#/components/schemas/Project"}}},"required":["workspaceId","purgeAfter","gridFit","showCategoryFilters","pageSize","categories","images","projectDetailFields","projectDetailsVersion","projects"],"additionalProperties":false}]},"ShowcaseSettings":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":255},"type":{"type":"string","enum":["gallery","projects"],"description":"gallery: one grid of photos and videos. projects: a portfolio of projects, each with its own page. Changes only while the showcase is empty (409 SHOWCASE_NOT_EMPTY)."},"layout":{"type":"string","enum":["grid","collage"]},"gridFit":{"type":"string","enum":["cover","contain"]},"showCategoryFilters":{"type":"boolean"},"pageSize":{"anyOf":[{"type":"integer","minimum":3,"maximum":100},{"type":"null"}]}},"required":[],"additionalProperties":false},"CreateShowcaseRequest":{"allOf":[{"$ref":"#/components/schemas/ShowcaseSettings"},{"required":["title"]}]},"UpdateShowcaseRequest":{"allOf":[{"$ref":"#/components/schemas/ShowcaseSettings"},{"minProperties":1}]},"CreateCategoryRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":60},"slug":{"type":"string","maxLength":80,"pattern":"^[a-z0-9]+(?:-[a-z0-9]+)*$"}},"required":["name"],"additionalProperties":false},"UpdateCategoryRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":60},"slug":{"type":"string","maxLength":80}},"required":[],"additionalProperties":false,"minProperties":1},"BulkTagRequest":{"type":"object","properties":{"imageIds":{"type":"array","items":{"type":"string","format":"uuid"},"minItems":1,"maxItems":1000,"uniqueItems":true},"addCategoryIds":{"type":"array","items":{"type":"string","format":"uuid"},"uniqueItems":true},"removeCategoryIds":{"type":"array","items":{"type":"string","format":"uuid"},"uniqueItems":true}},"required":["imageIds"],"additionalProperties":false},"AddVideosRequest":{"type":"object","properties":{"videoIds":{"type":"array","items":{"type":"string","format":"uuid"},"minItems":1,"maxItems":50,"uniqueItems":true},"projectId":{"type":"string","format":"uuid","description":"Required in projects showcases."}},"required":["videoIds"],"additionalProperties":false},"AltText":{"anyOf":[{"type":"string","maxLength":500,"description":"What the photo shows, for screen readers and search engines (e.g. \"Cedar deck with glass railing\"). Line breaks and invisible characters are removed; null or empty marks the photo decorative."},{"type":"null"}]},"ShowcaseItemChange":{"type":"object","properties":{"altText":{"$ref":"#/components/schemas/AltText"},"addCategoryIds":{"type":"array","items":{"type":"string","format":"uuid"},"uniqueItems":true,"maxItems":50},"removeCategoryIds":{"type":"array","items":{"type":"string","format":"uuid"},"uniqueItems":true,"maxItems":50}},"required":[],"additionalProperties":false,"minProperties":1,"description":"Change the alt text, categories, or both. Category ids must be this showcase's."},"BulkUpdateShowcaseItemsRequest":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"altText":{"$ref":"#/components/schemas/AltText"},"addCategoryIds":{"type":"array","items":{"type":"string","format":"uuid"},"uniqueItems":true,"maxItems":50},"removeCategoryIds":{"type":"array","items":{"type":"string","format":"uuid"},"uniqueItems":true,"maxItems":50}},"required":["id"],"additionalProperties":false,"minProperties":2},"minItems":1,"maxItems":100,"description":"Unique item ids. All or nothing: an unknown item or category fails the whole request."}},"required":["items"],"additionalProperties":false},"ShowcaseItemList":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/ShowcaseItem"}}},"required":["items"],"additionalProperties":false},"CreatePhotoUploadsRequest":{"type":"object","properties":{"files":{"type":"array","items":{"type":"object","properties":{"fileName":{"type":"string","minLength":1,"maxLength":512},"contentType":{"type":"string","enum":["image/jpeg","image/png","image/webp","image/avif","image/heic","image/heif"]},"sizeBytes":{"type":"integer","minimum":1,"maximum":20000000},"altText":{"$ref":"#/components/schemas/AltText"}},"required":["fileName","contentType","sizeBytes"],"additionalProperties":false},"minItems":1,"maxItems":100},"projectId":{"type":"string","format":"uuid","description":"The project the photos go into; required in projects showcases."}},"required":["files"],"additionalProperties":false},"CreatePhotoUploadsResponse":{"type":"object","properties":{"uploads":{"type":"array","items":{"type":"object","properties":{"imageId":{"type":"string","format":"uuid"},"uploadUrl":{"type":"string","format":"uri","description":"PUT the file here with exactly `headers`."},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["imageId","uploadUrl","headers"],"additionalProperties":false}},"expiresAt":{"type":"string","format":"date-time"}},"required":["uploads","expiresAt"],"additionalProperties":false},"CompletePhotoUploadsRequest":{"type":"object","properties":{"imageIds":{"type":"array","items":{"type":"string","format":"uuid"},"minItems":1,"maxItems":100,"uniqueItems":true}},"required":["imageIds"],"additionalProperties":false},"CompletePhotoUploadsResponse":{"type":"object","properties":{"images":{"type":"array","items":{"$ref":"#/components/schemas/ShowcaseItem"}}},"required":["images"],"additionalProperties":false},"VideoSummary":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"publicId":{"type":"string"},"title":{"type":"string"},"status":{"type":"string","enum":["uploading","processing","ready","failed"]},"failureReason":{"anyOf":[{"type":"string"},{"type":"null"}]},"visibility":{"type":"string","enum":["PUBLIC","UNLISTED","PRIVATE"]},"hasPassword":{"type":"boolean"},"watchPageEnabled":{"type":"boolean"},"folderId":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"durationMs":{"anyOf":[{"type":"integer"},{"type":"null"}]},"width":{"anyOf":[{"type":"integer"},{"type":"null"}]},"height":{"anyOf":[{"type":"integer"},{"type":"null"}]},"thumbnailUrl":{"anyOf":[{"type":"string"},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"deletedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]}},"required":["id","publicId","title","status","failureReason","visibility","hasPassword","watchPageEnabled","folderId","durationMs","width","height","thumbnailUrl","createdAt","updatedAt","deletedAt"],"additionalProperties":false},"VideoList":{"type":"object","properties":{"videos":{"type":"array","items":{"$ref":"#/components/schemas/VideoSummary"}},"nextCursor":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]}},"required":["videos","nextCursor"],"additionalProperties":false},"VideoVersion":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"versionNumber":{"type":"integer"},"status":{"type":"string","enum":["uploading","processing","ready","failed"]},"failureReason":{"anyOf":[{"type":"string"},{"type":"null"}]},"sourceFileName":{"anyOf":[{"type":"string"},{"type":"null"}]},"sourceSizeBytes":{"anyOf":[{"type":"integer"},{"type":"null"}]},"pendingUploadSessionId":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time"},"readyAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]}},"required":["id","versionNumber","status","failureReason","sourceFileName","sourceSizeBytes","pendingUploadSessionId","createdAt","readyAt"],"additionalProperties":false},"VideoDetail":{"allOf":[{"$ref":"#/components/schemas/VideoSummary"},{"type":"object","properties":{"workspaceId":{"type":"string","format":"uuid"},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"embedPolicy":{"type":"string","enum":["INHERIT","ANYWHERE","ALLOWLIST","DISABLED"]},"activeVersion":{"anyOf":[{"$ref":"#/components/schemas/VideoVersion"},{"type":"null"}]},"latestVersion":{"anyOf":[{"$ref":"#/components/schemas/VideoVersion"},{"type":"null"}]},"purgeAfter":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]},"hasCustomThumbnail":{"type":"boolean"}},"required":["workspaceId","description","embedPolicy","activeVersion","latestVersion","purgeAfter","hasCustomThumbnail"],"additionalProperties":false}]},"CreateVideoUploadRequest":{"type":"object","properties":{"fileName":{"type":"string","minLength":1,"maxLength":512},"contentType":{"type":"string","enum":["video/mp4","video/quicktime","video/webm","video/x-matroska","video/x-msvideo","video/mpeg","video/x-m4v"]},"sizeBytes":{"type":"integer","minimum":1,"maximum":20000000000},"title":{"type":"string","minLength":1,"maxLength":255},"folderId":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]}},"required":["fileName","contentType","sizeBytes"],"additionalProperties":false},"CreateVideoUploadResponse":{"type":"object","properties":{"uploadSessionId":{"type":"string","format":"uuid"},"videoId":{"type":"string","format":"uuid"},"publicId":{"type":"string"},"partSizeBytes":{"type":"integer","description":"Every part except the last must be exactly this size."},"partCount":{"type":"integer"},"expiresAt":{"type":"string","format":"date-time"}},"required":["uploadSessionId","videoId","publicId","partSizeBytes","partCount","expiresAt"],"additionalProperties":false},"PresignPartsRequest":{"type":"object","properties":{"partNumbers":{"type":"array","items":{"type":"integer","minimum":1},"minItems":1,"maxItems":100,"uniqueItems":true}},"required":["partNumbers"],"additionalProperties":false},"PresignPartsResponse":{"type":"object","properties":{"parts":{"type":"array","items":{"type":"object","properties":{"partNumber":{"type":"integer"},"url":{"type":"string","format":"uri"}},"required":["partNumber","url"],"additionalProperties":false}},"urlsExpireAt":{"type":"string","format":"date-time"}},"required":["parts","urlsExpireAt"],"additionalProperties":false},"UploadSession":{"type":"object","properties":{"uploadSessionId":{"type":"string","format":"uuid"},"videoId":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["pending","completed","aborted","expired"]},"partSizeBytes":{"type":"integer"},"partCount":{"type":"integer"},"uploadedPartNumbers":{"type":"array","items":{"type":"integer"}},"expiresAt":{"type":"string","format":"date-time"}},"required":["uploadSessionId","videoId","status","partSizeBytes","partCount","uploadedPartNumbers","expiresAt"],"additionalProperties":false},"CompleteVideoUploadResponse":{"type":"object","properties":{"videoId":{"type":"string","format":"uuid"},"publicId":{"type":"string"},"status":{"const":"processing"}},"required":["videoId","publicId","status"],"additionalProperties":false},"VideoEmbed":{"type":"object","properties":{"videoId":{"type":"string","format":"uuid"},"publicId":{"type":"string"},"html":{"type":"string"},"watchUrl":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"embeddable":{"type":"boolean"},"notes":{"type":"array","items":{"type":"string"}}},"required":["videoId","publicId","html","watchUrl","embeddable","notes"],"additionalProperties":false},"ShowcaseEmbed":{"type":"object","properties":{"showcaseId":{"type":"string","format":"uuid"},"publicId":{"type":"string"},"type":{"type":"string","enum":["gallery","projects"],"description":"gallery: one grid of photos and videos. projects: a portfolio of projects, each with its own page."},"html":{"type":"string"},"categories":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"slug":{"type":"string"},"html":{"type":"string"}},"required":["id","name","slug","html"],"additionalProperties":false}},"projects":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"slug":{"type":"string"},"html":{"type":"string"}},"required":["id","title","slug","html"],"additionalProperties":false},"description":"Projects showcases: one snippet per project page (data-project)."},"notes":{"type":"array","items":{"type":"string"}}},"required":["showcaseId","publicId","type","html","categories","notes"],"additionalProperties":false},"ProjectDetailField":{"type":"object","properties":{"key":{"type":"string","description":"Stable; never changes."},"label":{"type":"string"},"type":{"type":"string","enum":["short_text","number","select","year","date","link"],"description":"Never changes."},"unit":{"anyOf":[{"type":"string"},{"type":"null"}]},"options":{"anyOf":[{"type":"array","items":{"type":"object","properties":{"value":{"type":"string"},"label":{"type":"string"}},"required":["value","label"],"additionalProperties":false}},{"type":"null"}]},"showOnCard":{"type":"boolean"}},"required":["key","label","type","unit","options","showOnCard"],"additionalProperties":false},"ProjectDetailFieldInput":{"type":"object","properties":{"key":{"type":"string","description":"An existing detail's key; omit to add a detail (derived from the label)."},"label":{"type":"string","minLength":1,"maxLength":60},"type":{"type":"string","enum":["short_text","number","select","year","date","link"]},"unit":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}]},"options":{"anyOf":[{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","maxLength":60,"description":"An existing option's value; omit to add one."},"label":{"type":"string","minLength":1,"maxLength":60}},"required":["label"],"additionalProperties":false},"maxItems":30},{"type":"null"}]},"showOnCard":{"type":"boolean","description":"At most 2 details show on cards."}},"required":["label","type"],"additionalProperties":false},"Project":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"slug":{"type":"string"},"title":{"type":"string"},"subtitle":{"anyOf":[{"type":"string"},{"type":"null"}]},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"coverImageId":{"anyOf":[{"type":"string","format":"uuid","description":"The chosen cover; null uses the first ready photo."},{"type":"null"}]},"coverUrl":{"anyOf":[{"type":"string"},{"type":"null"}]},"position":{"type":"integer"},"details":{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"}]}},"categoryIds":{"type":"array","items":{"type":"string","format":"uuid"}},"itemCount":{"type":"integer"},"readyItemCount":{"type":"integer","description":"The project shows on the website once it has a public item."},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","slug","title","subtitle","description","coverImageId","coverUrl","position","details","categoryIds","itemCount","readyItemCount","createdAt","updatedAt"],"additionalProperties":false},"ProjectWithItems":{"allOf":[{"$ref":"#/components/schemas/Project"},{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/ShowcaseItem"}}},"required":["items"],"additionalProperties":false}]},"ProjectList":{"type":"object","properties":{"showcaseId":{"type":"string","format":"uuid"},"type":{"type":"string","enum":["gallery","projects"],"description":"gallery: one grid of photos and videos. projects: a portfolio of projects, each with its own page."},"detailFields":{"type":"array","items":{"$ref":"#/components/schemas/ProjectDetailField"}},"detailsVersion":{"type":"integer"},"projects":{"type":"array","items":{"$ref":"#/components/schemas/ProjectWithItems"}}},"required":["showcaseId","type","detailFields","detailsVersion","projects"],"additionalProperties":false},"CreateProjectRequest":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":160},"subtitle":{"anyOf":[{"type":"string","maxLength":200,"description":"E.g. the location."},{"type":"null"}]},"description":{"anyOf":[{"type":"string","maxLength":5000},{"type":"null"}]},"slug":{"type":"string","maxLength":120,"pattern":"^[a-z0-9]+(?:-[a-z0-9]+)*$","description":"Used in project links; derived from the title when omitted."},"details":{"type":"object","additionalProperties":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"number"}]},{"type":"null"}]},"description":"Detail key to value: numbers for number and year, YYYY-MM-DD for date, an option value (or label) for select. null clears one."},"categoryIds":{"type":"array","items":{"type":"string","format":"uuid"},"uniqueItems":true,"maxItems":50}},"required":["title"],"additionalProperties":false},"UpdateProjectRequest":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":160},"subtitle":{"anyOf":[{"type":"string","maxLength":200,"description":"E.g. the location."},{"type":"null"}]},"description":{"anyOf":[{"type":"string","maxLength":5000},{"type":"null"}]},"slug":{"type":"string","maxLength":120,"pattern":"^[a-z0-9]+(?:-[a-z0-9]+)*$","description":"Used in project links; derived from the title when omitted."},"details":{"type":"object","additionalProperties":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"number"}]},{"type":"null"}]},"description":"Detail key to value: numbers for number and year, YYYY-MM-DD for date, an option value (or label) for select. null clears one."},"categoryIds":{"type":"array","items":{"type":"string","format":"uuid"},"uniqueItems":true,"maxItems":50},"coverImageId":{"anyOf":[{"type":"string","format":"uuid","description":"A photo in this project, or null for the first ready photo."},{"type":"null"}]}},"required":[],"additionalProperties":false,"minProperties":1,"description":"details merges (null clears one); categoryIds replaces."},"ReorderProjectsRequest":{"type":"object","properties":{"projectIds":{"type":"array","items":{"type":"string","format":"uuid"},"minItems":1,"maxItems":100,"uniqueItems":true,"description":"Every project of the showcase, in the new order."}},"required":["projectIds"],"additionalProperties":false},"ReorderProjectItemsRequest":{"type":"object","properties":{"imageIds":{"type":"array","items":{"type":"string","format":"uuid"},"minItems":1,"maxItems":1000,"uniqueItems":true,"description":"Every item of the project, in the new order."}},"required":["imageIds"],"additionalProperties":false},"ProjectDetailsSchema":{"type":"object","properties":{"fields":{"type":"array","items":{"$ref":"#/components/schemas/ProjectDetailField"}},"version":{"type":"integer"}},"required":["fields","version"],"additionalProperties":false},"UpdateProjectDetailsRequest":{"type":"object","properties":{"fields":{"type":"array","items":{"$ref":"#/components/schemas/ProjectDetailFieldInput"},"maxItems":8,"description":"The whole new list, in order."},"expectedVersion":{"type":"integer","minimum":1,"description":"The version you read; a newer one is a 409 SCHEMA_CHANGED."},"dryRun":{"type":"boolean"},"confirmDestructive":{"type":"boolean","description":"Required when a change removes values (409 CONFIRMATION_REQUIRED otherwise)."}},"required":["fields","expectedVersion"],"additionalProperties":false},"ProjectDetailsChangeResult":{"type":"object","properties":{"applied":{"type":"boolean"},"fields":{"type":"array","items":{"$ref":"#/components/schemas/ProjectDetailField"}},"version":{"type":"integer"},"changes":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string"},"key":{"anyOf":[{"type":"string"},{"type":"null"}]},"description":{"type":"string"},"destructive":{"type":"boolean"},"affectedProjectCount":{"type":"integer"}},"required":["kind","key","description","destructive","affectedProjectCount"],"additionalProperties":false}},"summary":{"type":"string"}},"required":["applied","fields","version","changes","summary"],"additionalProperties":false},"UsageSummary":{"type":"object","properties":{"periodStart":{"type":"string","format":"date-time"},"periodEnd":{"type":"string","format":"date-time"},"isTrialPeriod":{"type":"boolean"},"storage":{"type":"object","properties":{"usedBytes":{"type":"integer"},"limitBytes":{"type":"integer"}},"required":["usedBytes","limitBytes"],"additionalProperties":false},"bandwidth":{"type":"object","properties":{"usedBytes":{"type":"integer"},"limitBytes":{"type":"integer"}},"required":["usedBytes","limitBytes"],"additionalProperties":false},"bandwidthTracked":{"type":"boolean"},"uploadedBytes":{"type":"integer"},"encodedSeconds":{"type":"integer"},"playbackSuspended":{"type":"boolean"},"uploadsSuspended":{"type":"boolean"},"suspensionReason":{"anyOf":[{"type":"string"},{"type":"null"}]},"days":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","format":"date"},"deliveredBytes":{"type":"integer"},"uploadedBytes":{"type":"integer"}},"required":["date","deliveredBytes","uploadedBytes"],"additionalProperties":false}},"workspaces":{"type":"array","items":{"type":"object","properties":{"workspaceId":{"type":"string","format":"uuid"},"name":{"type":"string"},"storedBytes":{"type":"integer"},"deliveredBytes":{"type":"integer"}},"required":["workspaceId","name","storedBytes","deliveredBytes"],"additionalProperties":false}},"updatedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]},"collectionItems":{"type":"object","properties":{"used":{"type":"integer"},"limit":{"anyOf":[{"type":"integer"},{"type":"null"}]}},"required":["used","limit"],"additionalProperties":false}},"required":["periodStart","periodEnd","isTrialPeriod","storage","bandwidth","bandwidthTracked","uploadedBytes","encodedSeconds","playbackSuspended","uploadsSuspended","suspensionReason","days","workspaces","updatedAt","collectionItems"],"additionalProperties":false},"CollectionFieldOption":{"type":"object","properties":{"value":{"type":"string"},"label":{"type":"string"}},"required":["value","label"],"additionalProperties":false},"CollectionField":{"type":"object","properties":{"key":{"type":"string","pattern":"^[a-z][a-z0-9_]*$","description":"Stable; websites read values by it. Omit on new fields to derive it from the label."},"label":{"type":"string"},"type":{"type":"string","enum":["short_text","long_text","number","price","date","datetime","toggle","select","multi_select","image","images","link"]},"required":{"type":"boolean"},"helpText":{"anyOf":[{"type":"string"},{"type":"null"}]},"options":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/CollectionFieldOption"}},{"type":"null"}]},"currency":{"anyOf":[{"type":"string","pattern":"^[A-Z]{3}$"},{"type":"null"}]},"min":{"anyOf":[{"type":"number"},{"type":"null"}]},"max":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["label","type"],"additionalProperties":false},"CollectionLimits":{"type":"object","properties":{"accountItemsUsed":{"type":"integer"},"accountItemLimit":{"anyOf":[{"type":"integer"},{"type":"null"}]},"itemsPerCollectionLimit":{"type":"integer"},"collectionsPerSiteLimit":{"anyOf":[{"type":"integer"},{"type":"null"}]},"siteCollectionsUsed":{"anyOf":[{"type":"integer"},{"type":"null"}]}},"required":["accountItemsUsed","accountItemLimit","itemsPerCollectionLimit","collectionsPerSiteLimit","siteCollectionsUsed"],"additionalProperties":false},"CollectionSummary":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"publicId":{"type":"string"},"workspaceId":{"type":"string","format":"uuid"},"name":{"type":"string"},"slug":{"type":"string"},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"templateKey":{"anyOf":[{"type":"string","enum":["menu","inventory","events"]},{"type":"null"}]},"visibility":{"type":"string","enum":["public","private"]},"itemCount":{"type":"integer"},"publishedItemCount":{"type":"integer"},"titleFieldKey":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"deletedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]},"purgeAfter":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]},"lastPublicReadAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]}},"required":["id","publicId","workspaceId","name","slug","description","templateKey","visibility","itemCount","publishedItemCount","titleFieldKey","createdAt","updatedAt","deletedAt","purgeAfter","lastPublicReadAt"],"additionalProperties":false},"CollectionDetail":{"allOf":[{"$ref":"#/components/schemas/CollectionSummary"},{"type":"object","properties":{"fields":{"type":"array","items":{"$ref":"#/components/schemas/CollectionField"}},"schemaVersion":{"type":"integer"},"timezone":{"type":"string"},"publicItemsUrl":{"anyOf":[{"type":"string","format":"uri","description":"Public read endpoint for websites (published items only); null when private."},{"type":"null"}]},"canEditSchema":{"type":"boolean"},"limits":{"$ref":"#/components/schemas/CollectionLimits"}},"required":["fields","schemaVersion","timezone","publicItemsUrl","canEditSchema","limits"],"additionalProperties":false}]},"CollectionList":{"type":"object","properties":{"collections":{"type":"array","items":{"$ref":"#/components/schemas/CollectionSummary"}},"limits":{"$ref":"#/components/schemas/CollectionLimits"},"canEditSchema":{"type":"boolean"}},"required":["collections","limits","canEditSchema"],"additionalProperties":false},"CreateCollectionRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80},"slug":{"type":"string","maxLength":60,"pattern":"^[a-z0-9]+(?:-[a-z0-9]+)*$"},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"templateKey":{"anyOf":[{"type":"string","enum":["menu","inventory","events"]},{"type":"null"}]},"fields":{"type":"array","items":{"$ref":"#/components/schemas/CollectionField"},"maxItems":50},"titleFieldKey":{"type":"string"},"visibility":{"type":"string","enum":["public","private"]}},"required":["name"],"additionalProperties":false},"UpdateCollectionRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80},"slug":{"type":"string","maxLength":60},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"visibility":{"type":"string","enum":["public","private"]},"timezone":{"type":"string","description":"IANA zone of the whole client site, e.g. America/Chicago."}},"required":[],"additionalProperties":false,"minProperties":1},"CollectionSchemaChange":{"type":"object","properties":{"kind":{"type":"string"},"fieldKey":{"anyOf":[{"type":"string"},{"type":"null"}]},"description":{"type":"string"},"destructive":{"type":"boolean","description":"Needs confirmDestructive: removes, converts, or renames something websites rely on."},"affectedItemCount":{"type":"integer"}},"required":["kind","fieldKey","description","destructive","affectedItemCount"],"additionalProperties":false},"UpdateCollectionSchemaRequest":{"type":"object","properties":{"fields":{"type":"array","items":{"$ref":"#/components/schemas/CollectionField"},"minItems":1,"maxItems":50},"titleFieldKey":{"type":"string"},"expectedSchemaVersion":{"type":"integer","description":"The schemaVersion you read; a newer one is a 409 SCHEMA_CHANGED."},"dryRun":{"type":"boolean"},"confirmDestructive":{"type":"boolean"}},"required":["fields","expectedSchemaVersion"],"additionalProperties":false},"CollectionSchemaChangeResult":{"type":"object","properties":{"changes":{"type":"array","items":{"$ref":"#/components/schemas/CollectionSchemaChange"}},"destructive":{"type":"boolean"},"applied":{"type":"boolean"},"collection":{"$ref":"#/components/schemas/CollectionDetail"}},"required":["changes","destructive","applied","collection"],"additionalProperties":false},"CollectionSchema":{"type":"object","properties":{"collectionId":{"type":"string","format":"uuid"},"slug":{"type":"string"},"name":{"type":"string"},"schemaVersion":{"type":"integer"},"titleFieldKey":{"type":"string"},"fields":{"type":"array","items":{"$ref":"#/components/schemas/CollectionField"}},"timezone":{"type":"string"},"typescript":{"type":"string","description":"Types for the public read response of this collection."},"publicItemsUrl":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]}},"required":["collectionId","slug","name","schemaVersion","titleFieldKey","fields","timezone","typescript","publicItemsUrl"],"additionalProperties":false},"CollectionPlanRequest":{"type":"object","properties":{"collections":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"templateKey":{"anyOf":[{"type":"string","enum":["menu","inventory","events"]},{"type":"null"}]},"fields":{"type":"array","items":{"$ref":"#/components/schemas/CollectionField"}},"titleFieldKey":{"type":"string"},"visibility":{"type":"string","enum":["public","private"]},"expectedSchemaVersion":{"type":"integer"}},"required":["name"],"additionalProperties":false},"minItems":1,"maxItems":10},"dryRun":{"type":"boolean","default":true,"description":"Defaults to true: returns the diff without saving."},"confirmDestructive":{"type":"boolean"}},"required":["collections"],"additionalProperties":false},"CollectionPlanResult":{"type":"object","properties":{"applied":{"type":"boolean"},"destructive":{"type":"boolean"},"summary":{"type":"string","description":"Plain-text diff to show before applying."},"results":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"},"action":{"type":"string","enum":["create","update","unchanged","conflict"]},"collectionId":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"changes":{"type":"array","items":{"$ref":"#/components/schemas/CollectionSchemaChange"}},"destructive":{"type":"boolean"},"schemaVersion":{"anyOf":[{"type":"integer"},{"type":"null"}]},"message":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["slug","name","action","collectionId","changes","destructive","schemaVersion","message"],"additionalProperties":false}}},"required":["applied","destructive","summary","results"],"additionalProperties":false},"CollectionActivity":{"type":"object","properties":{"activity":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"action":{"type":"string"},"summary":{"type":"string"},"actor":{"type":"object","properties":{"label":{"type":"string"},"kind":{"type":"string","enum":["user","api_key","system"]}},"required":["label","kind"],"additionalProperties":false},"createdAt":{"type":"string","format":"date-time"},"undoable":{"type":"boolean"},"undoneAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]}},"required":["id","action","summary","actor","createdAt","undoable","undoneAt"],"additionalProperties":false}}},"required":["activity"],"additionalProperties":false},"CollectionItemValues":{"type":"object","description":"Field key → value. Prices are { amount, currency }; image fields hold photo ids from this collection's media uploads.","additionalProperties":true},"CollectionItem":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"slug":{"type":"string"},"status":{"type":"string","enum":["draft","published"]},"position":{"type":"integer"},"title":{"type":"string"},"values":{"$ref":"#/components/schemas/CollectionItemValues"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"publishedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]},"deletedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]},"updatedBy":{"anyOf":[{"type":"object","properties":{"label":{"type":"string"},"kind":{"type":"string","enum":["user","api_key","system"]}},"required":["label","kind"],"additionalProperties":false},{"type":"null"}]}},"required":["id","slug","status","position","title","values","createdAt","updatedAt","publishedAt","deletedAt","updatedBy"],"additionalProperties":false},"CollectionMedia":{"type":"object","description":"Photo id → preview for the images the items reference.","additionalProperties":true},"CollectionItemList":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/CollectionItem"}},"total":{"type":"integer"},"limit":{"type":"integer"},"offset":{"type":"integer"},"media":{"$ref":"#/components/schemas/CollectionMedia"}},"required":["items","total","limit","offset","media"],"additionalProperties":false},"CollectionItemResult":{"type":"object","properties":{"item":{"$ref":"#/components/schemas/CollectionItem"},"media":{"$ref":"#/components/schemas/CollectionMedia"}},"required":["item","media"],"additionalProperties":false},"CreateCollectionItemRequest":{"type":"object","properties":{"values":{"$ref":"#/components/schemas/CollectionItemValues"},"status":{"type":"string","enum":["draft","published"],"default":"published"},"slug":{"type":"string","maxLength":120}},"required":["values"],"additionalProperties":false},"UpdateCollectionItemRequest":{"type":"object","properties":{"values":{"$ref":"#/components/schemas/CollectionItemValues","description":"Only the fields to change."},"status":{"type":"string","enum":["draft","published"]},"slug":{"type":"string","maxLength":120},"expectedUpdatedAt":{"type":"string","format":"date-time","description":"The updatedAt you read; a newer one is a 409 ITEM_CHANGED unless force is true."},"force":{"type":"boolean"}},"required":[],"additionalProperties":false,"minProperties":1},"BulkCreateCollectionItemsRequest":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/CreateCollectionItemRequest"},"minItems":1,"maxItems":500},"dryRun":{"type":"boolean"},"mode":{"type":"string","enum":["valid_only","all_or_nothing"],"default":"valid_only"}},"required":["items"],"additionalProperties":false},"BulkCreateCollectionItemsResult":{"type":"object","properties":{"created":{"type":"array","items":{"$ref":"#/components/schemas/CollectionItem"}},"errors":{"type":"array","items":{"type":"object","properties":{"index":{"type":"integer"},"errors":{"type":"object","additionalProperties":{"type":"string"}}},"required":["index","errors"],"additionalProperties":false}},"dryRun":{"type":"boolean"}},"required":["created","errors","dryRun"],"additionalProperties":false},"BulkCollectionItemsActionRequest":{"type":"object","properties":{"action":{"type":"string","enum":["publish","unpublish","trash","restore"]},"itemIds":{"type":"array","items":{"type":"string","format":"uuid"},"minItems":1,"maxItems":500,"uniqueItems":true}},"required":["action","itemIds"],"additionalProperties":false},"BulkCollectionItemsActionResult":{"type":"object","properties":{"updatedCount":{"type":"integer"}},"required":["updatedCount"],"additionalProperties":false},"ReorderCollectionItemsRequest":{"type":"object","properties":{"itemIds":{"type":"array","items":{"type":"string","format":"uuid"},"minItems":1,"maxItems":10000,"uniqueItems":true}},"required":["itemIds"],"additionalProperties":false},"CollectionSiteExport":{"type":"object","description":"Every live collection of the site with fields, items (drafts too), and temporary full-size photo URLs.","additionalProperties":true},"CollectionFile":{"type":"string","description":"CSV (default) or JSON file."},"FeedbackStatus":{"type":"string","enum":["open","in_progress","done","wont_do"]},"FeedbackPerson":{"type":"object","properties":{"userId":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"name":{"type":"string"},"isTeam":{"type":"boolean"}},"required":["userId","name","isTeam"],"additionalProperties":false},"FeedbackAttachment":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"purpose":{"type":"string","enum":["screenshot","attachment","replacement"]},"status":{"type":"string","enum":["processing","ready","failed"]},"previewUrl":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"largeUrl":{"anyOf":[{"type":"string","format":"uri","description":"Temporary signed URL; fetch it to look at the photo."},{"type":"null"}]},"width":{"anyOf":[{"type":"integer"},{"type":"null"}]},"height":{"anyOf":[{"type":"integer"},{"type":"null"}]},"fileName":{"anyOf":[{"type":"string"},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time"}},"required":["id","purpose","status","previewUrl","largeUrl","width","height","fileName","createdAt"],"additionalProperties":false},"FeedbackRequestSummary":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"number":{"type":"integer","description":"Per-site number, shown as #12."},"site":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"}},"required":["id","name"],"additionalProperties":false},"type":{"type":"string","enum":["comment","text_change","general"]},"imageAction":{"anyOf":[{"type":"string","enum":["replace","remove"]},{"type":"null"}]},"status":{"$ref":"#/components/schemas/FeedbackStatus"},"message":{"anyOf":[{"type":"string"},{"type":"null"}]},"pageUrl":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"pagePath":{"anyOf":[{"type":"string"},{"type":"null"}]},"pageTitle":{"anyOf":[{"type":"string"},{"type":"null"}]},"currentText":{"anyOf":[{"type":"string","description":"Text changes: the wording on the page now."},{"type":"null"}]},"requestedText":{"anyOf":[{"type":"string","description":"Text changes: the exact new wording."},{"type":"null"}]},"requester":{"$ref":"#/components/schemas/FeedbackPerson"},"deviceType":{"anyOf":[{"type":"string","enum":["mobile","tablet","desktop"]},{"type":"null"}]},"screenshot":{"anyOf":[{"$ref":"#/components/schemas/FeedbackAttachment"},{"type":"null"}]},"replyCount":{"type":"integer"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"lastActivityAt":{"type":"string","format":"date-time"}},"required":["id","number","site","type","imageAction","status","message","pageUrl","pagePath","pageTitle","currentText","requestedText","requester","deviceType","screenshot","replyCount","createdAt","updatedAt","lastActivityAt"],"additionalProperties":false},"FeedbackMessage":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"kind":{"type":"string","enum":["reply","status"]},"author":{"$ref":"#/components/schemas/FeedbackPerson"},"body":{"type":"string"},"statusFrom":{"anyOf":[{"$ref":"#/components/schemas/FeedbackStatus"},{"type":"null"}]},"statusTo":{"anyOf":[{"$ref":"#/components/schemas/FeedbackStatus"},{"type":"null"}]},"attachments":{"type":"array","items":{"$ref":"#/components/schemas/FeedbackAttachment"}},"createdAt":{"type":"string","format":"date-time"}},"required":["id","kind","author","body","statusFrom","statusTo","attachments","createdAt"],"additionalProperties":false},"FeedbackRequestDetail":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"number":{"type":"integer","description":"Per-site number, shown as #12."},"site":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"}},"required":["id","name"],"additionalProperties":false},"type":{"type":"string","enum":["comment","text_change","general"]},"imageAction":{"anyOf":[{"type":"string","enum":["replace","remove"]},{"type":"null"}]},"status":{"$ref":"#/components/schemas/FeedbackStatus"},"message":{"anyOf":[{"type":"string"},{"type":"null"}]},"pageUrl":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"pagePath":{"anyOf":[{"type":"string"},{"type":"null"}]},"pageTitle":{"anyOf":[{"type":"string"},{"type":"null"}]},"currentText":{"anyOf":[{"type":"string","description":"Text changes: the wording on the page now."},{"type":"null"}]},"requestedText":{"anyOf":[{"type":"string","description":"Text changes: the exact new wording."},{"type":"null"}]},"requester":{"$ref":"#/components/schemas/FeedbackPerson"},"deviceType":{"anyOf":[{"type":"string","enum":["mobile","tablet","desktop"]},{"type":"null"}]},"screenshot":{"anyOf":[{"$ref":"#/components/schemas/FeedbackAttachment"},{"type":"null"}]},"replyCount":{"type":"integer"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"lastActivityAt":{"type":"string","format":"date-time"},"element":{"anyOf":[{"type":"object","additionalProperties":true,"description":"CSS selector, tag, nearby text, and position of the clicked element."},{"type":"null"}]},"context":{"anyOf":[{"type":"object","additionalProperties":true,"description":"Device, browser, viewport, and scroll position."},{"type":"null"}]},"resolutionNote":{"anyOf":[{"type":"string"},{"type":"null"}]},"resolvedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]},"attachments":{"type":"array","items":{"$ref":"#/components/schemas/FeedbackAttachment"}},"messages":{"type":"array","items":{"$ref":"#/components/schemas/FeedbackMessage"}},"allowedStatuses":{"type":"array","items":{"$ref":"#/components/schemas/FeedbackStatus"}}},"required":["id","number","site","type","imageAction","status","message","pageUrl","pagePath","pageTitle","currentText","requestedText","requester","deviceType","screenshot","replyCount","createdAt","updatedAt","lastActivityAt","element","context","resolutionNote","resolvedAt","attachments","messages","allowedStatuses"],"additionalProperties":false,"description":"The summary plus where on the page, device context, attachments, and the thread."},"FeedbackList":{"type":"object","properties":{"requests":{"type":"array","items":{"$ref":"#/components/schemas/FeedbackRequestSummary"}},"total":{"type":"integer"}},"required":["requests","total"],"additionalProperties":false},"FeedbackReplyRequest":{"type":"object","properties":{"message":{"type":"string","minLength":1,"maxLength":5000}},"required":["message"],"additionalProperties":false},"UpdateFeedbackRequest":{"type":"object","properties":{"status":{"$ref":"#/components/schemas/FeedbackStatus"},"resolutionNote":{"anyOf":[{"type":"string","maxLength":2000,"description":"Kept with done and wont_do; done emails it to the client."},{"type":"null"}]}},"required":["status"],"additionalProperties":false}}}}