{"openapi":"3.1.0","info":{"title":"Screenshot Studio API","version":"1.0.0","summary":"Public HTTP API for Screenshot Studio.","description":"Screenshot Studio exposes anonymous editor utilities for screenshot capture, export compression, tweet resolution, and approved media proxying. Workspace-scoped `/api/v1` operations require an organization API key with the declared scope. Shell operations under `/api/v1` (bootstrap, organizations, membership) describe the signed-in user and require a session; they refuse API keys. Every error response uses the same JSON envelope with a stable `code` and a human-readable `hint`.","contact":{"name":"Screenshot Studio","url":"https://www.screenshot-studio.com/contact"},"license":{"name":"Apache-2.0","url":"https://www.apache.org/licenses/LICENSE-2.0"},"termsOfService":"https://www.screenshot-studio.com/terms"},"servers":[{"url":"https://www.screenshot-studio.com","description":"Production"}],"externalDocs":{"description":"Interactive Screenshot Studio API reference","url":"https://www.screenshot-studio.com/api-reference"},"security":[],"tags":[{"name":"Screenshots","description":"Capture live web pages as images."},{"name":"Images","description":"Optimize and proxy image bytes."},{"name":"Social","description":"Resolve social media content."},{"name":"Workspace","description":"Authenticated workspace release and source configuration operations."},{"name":"Assets","description":"Authenticated workspace asset upload and download operations."},{"name":"Shell","description":"Signed-in user context for Playbook shells: bootstrap, organizations, membership, and capabilities. Rendering hints only; every mutation is re-authorized server-side."},{"name":"Discovery","description":"Machine-readable descriptions of the site and this API."}],"paths":{"/api/screenshot":{"post":{"operationId":"captureScreenshot","summary":"Capture a web page screenshot","description":"Renders the page at the given URL and returns the screenshot as a base64-encoded PNG. Results are cached per URL, device type, and color scheme; set `forceRefresh` to bypass the cache. Limited to 20 requests per minute per IP address.","tags":["Screenshots"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScreenshotRequest"}}}},"responses":{"200":{"description":"Screenshot captured or served from cache.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScreenshotResponse"}}}},"400":{"description":"The URL or an option value is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Method not allowed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"408":{"description":"The target page took too long to load.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Per-IP rate limit exceeded.","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"description":"Requests allowed per window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix epoch milliseconds when the window resets.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitError"}}}},"500":{"description":"The screenshot could not be produced.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"The upstream screenshot service is down.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"get":{"operationId":"captureScreenshotMethodProbe","summary":"Method probe for the screenshot endpoint","description":"The screenshot endpoint only accepts POST. GET returns a 405 with the same JSON error envelope and an `Allow` header.","tags":["Screenshots"],"responses":{"405":{"description":"Method not allowed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/export":{"post":{"operationId":"optimizeExportImage","summary":"Recompress an image","description":"Accepts a raw image as multipart form data and returns an optimized image in the requested format. JPEG uses the MozJPEG encoder, WebP uses libwebp, and PNG uses adaptive filtering. The response body is the image bytes, not JSON.","tags":["Images"],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ExportRequest"},"encoding":{"image":{"contentType":"image/png, image/jpeg, image/webp"}}}}},"responses":{"200":{"description":"Optimized image bytes.","content":{"image/png":{"schema":{"type":"string","format":"binary"}},"image/jpeg":{"schema":{"type":"string","format":"binary"}},"image/webp":{"schema":{"type":"string","format":"binary"}}}},"400":{"description":"Missing image, or invalid format/quality preset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Method not allowed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"The image could not be processed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"get":{"operationId":"optimizeExportImageMethodProbe","summary":"Method probe for the export endpoint","description":"The export endpoint only accepts POST. GET returns a 405 with the same JSON error envelope and an `Allow` header.","tags":["Images"],"responses":{"405":{"description":"Method not allowed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/tweet/{id}":{"get":{"operationId":"getTweet","summary":"Fetch a tweet by ID","description":"Returns the public tweet payload used to render a tweet as an image. The `id` is the numeric status ID from the tweet URL.","tags":["Social"],"parameters":[{"name":"id","in":"path","required":true,"description":"Numeric tweet status ID, for example 1234567890123456789.","schema":{"type":"string","pattern":"^[0-9]+$"}}],"responses":{"200":{"description":"Tweet payload.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TweetResponse"}}}},"404":{"description":"No tweet exists with that ID.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"The tweet could not be fetched.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/image-proxy":{"get":{"operationId":"proxyTwitterImage","summary":"Proxy a Twitter media file","description":"Streams a Twitter-hosted image through this origin so it can be drawn onto a canvas without tainting it. Only pbs.twimg.com, abs.twimg.com, ton.twitter.com, and video.twimg.com are allowed.","tags":["Images"],"parameters":[{"name":"url","in":"query","required":true,"description":"Absolute URL of the Twitter-hosted media file.","schema":{"type":"string","format":"uri"}}],"responses":{"200":{"description":"Image bytes.","content":{"image/*":{"schema":{"type":"string","format":"binary"}}}},"400":{"description":"The `url` query parameter is missing.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The host is not on the allowlist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"The image could not be fetched.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"The upstream host refused the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/releases":{"get":{"description":"Lists releases in the API key workspace. Requires the `artifact:read` scope.","operationId":"listReleases","parameters":[{"in":"query","name":"limit","required":false,"schema":{"default":50,"type":"integer","minimum":1,"maximum":100}}],"responses":{"200":{"description":"Workspace releases.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReleaseListResponse"}}}},"400":{"description":"The list query is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication is required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key lacks the required workspace scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"A required dependency is unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"workspaceApiKey":[]}],"summary":"List workspace releases","tags":["Workspace"]},"post":{"description":"Creates a release in the API key workspace. Accepts `Idempotency-Key` and requires the `release:create` scope.","operationId":"createRelease","parameters":[{"in":"header","name":"Idempotency-Key","required":false,"schema":{"type":"string","maxLength":128}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReleaseCreateRequest"}}}},"responses":{"200":{"description":"An existing idempotent result.","content":{"application/json":{"schema":{"type":"object","properties":{"created":{"type":"boolean"},"release":{"type":"object","properties":{"id":{"type":"string"},"productSurfaceId":{"type":["string","null"]},"status":{"type":"string","enum":["DRAFT","READY","ARCHIVED","CANCELLED"]},"title":{"type":"string"}},"required":["id","productSurfaceId","status","title"],"additionalProperties":false}},"required":["created","release"],"additionalProperties":false}}}},"201":{"description":"Release created.","content":{"application/json":{"schema":{"type":"object","properties":{"created":{"type":"boolean"},"release":{"type":"object","properties":{"id":{"type":"string"},"productSurfaceId":{"type":["string","null"]},"status":{"type":"string","enum":["DRAFT","READY","ARCHIVED","CANCELLED"]},"title":{"type":"string"}},"required":["id","productSurfaceId","status","title"],"additionalProperties":false}},"required":["created","release"],"additionalProperties":false}}}},"400":{"description":"The release input is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication is required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key lacks the required workspace scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"A required dependency is unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"workspaceApiKey":[]}],"summary":"Create a workspace release","tags":["Workspace"]}},"/api/v1/source-apps":{"post":{"description":"Registers a release-intake source in the API key workspace and returns its webhook URL. Without a `secretReference`, the response also carries the webhook secret, shown only this once. Requires the `source:write` scope.","operationId":"createSourceApp","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SourceAppCreateRequest"}}}},"responses":{"201":{"description":"Source app created.","content":{"application/json":{"schema":{"type":"object","properties":{"sourceApp":{"type":"object","properties":{"allowedHosts":{"type":"array","items":{"type":"string"}},"branch":{"type":["string","null"]},"createdAt":{"type":"string"},"externalId":{"type":["string","null"]},"id":{"type":"string"},"ignoreBotPullRequests":{"type":"boolean"},"ignoredPullRequestAuthors":{"type":"array","items":{"type":"string"}},"name":{"type":"string"},"organizationId":{"type":"string"},"provider":{"type":"string"},"secretReference":{"type":["string","null"]},"skipPrereleases":{"type":"boolean"},"status":{"type":"string","enum":["DRAFT","ACTIVE","ARCHIVED"]},"updatedAt":{"type":"string"}},"required":["allowedHosts","branch","createdAt","externalId","id","ignoreBotPullRequests","ignoredPullRequestAuthors","name","organizationId","provider","secretReference","skipPrereleases","status","updatedAt"],"additionalProperties":false},"webhook":{"type":"object","properties":{"secret":{"type":["string","null"]},"url":{"type":"string","format":"uri"}},"required":["secret","url"],"additionalProperties":false}},"required":["sourceApp","webhook"],"additionalProperties":false}}}},"400":{"description":"The source app input is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication is required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key lacks the required workspace scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"A required dependency is unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"workspaceApiKey":[]}],"summary":"Create a workspace source app","tags":["Workspace"]}},"/api/v1/source-apps/{sourceAppId}":{"patch":{"description":"Changes which webhook deliveries a source turns into releases: the watched branch, the bot and author filters, and pre-release handling. Requires the `source:write` scope.","operationId":"updateSourceApp","parameters":[{"in":"path","name":"sourceAppId","required":true,"schema":{"type":"string","minLength":1}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SourceAppUpdateRequest"}}}},"responses":{"200":{"description":"Source app updated.","content":{"application/json":{"schema":{"type":"object","properties":{"sourceApp":{"type":"object","properties":{"allowedHosts":{"type":"array","items":{"type":"string"}},"branch":{"type":["string","null"]},"createdAt":{"type":"string"},"externalId":{"type":["string","null"]},"id":{"type":"string"},"ignoreBotPullRequests":{"type":"boolean"},"ignoredPullRequestAuthors":{"type":"array","items":{"type":"string"}},"name":{"type":"string"},"organizationId":{"type":"string"},"provider":{"type":"string"},"secretReference":{"type":["string","null"]},"skipPrereleases":{"type":"boolean"},"status":{"type":"string","enum":["DRAFT","ACTIVE","ARCHIVED"]},"updatedAt":{"type":"string"}},"required":["allowedHosts","branch","createdAt","externalId","id","ignoreBotPullRequests","ignoredPullRequestAuthors","name","organizationId","provider","secretReference","skipPrereleases","status","updatedAt"],"additionalProperties":false}},"required":["sourceApp"],"additionalProperties":false}}}},"400":{"description":"The rules are invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication is required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key lacks the required workspace scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No source app with that ID exists in the workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"A required dependency is unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"workspaceApiKey":[]}],"summary":"Update a workspace source app","tags":["Workspace"]}},"/api/v1/link-preview":{"get":{"description":"Reads a public page as the chosen crawler and reports how its links preview: every meta tag, the measured preview images, robots.txt access for each platform crawler, the redirect chain, a 0 to 100 score, and each issue with its fix. Run it in CI to fail a deploy whose links would preview badly. Requires the `artifact:read` scope.","operationId":"getLinkPreview","parameters":[{"in":"query","name":"url","required":true,"schema":{"type":"string","maxLength":2048,"format":"uri"}},{"in":"query","name":"agent","required":false,"schema":{"default":"default","type":"string","enum":["default","facebook","x","linkedin","slack","discord","telegram","whatsapp","google"]}}],"responses":{"200":{"description":"The check.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkPreviewReport"}}}},"400":{"description":"The URL is invalid, private, or not on a standard web port.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication is required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key lacks the required workspace scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The page could not be read: it timed out, errored, or is not HTML.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many checks for this workspace; retry after the reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceQuotaError"}}}},"503":{"description":"A required dependency is unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"workspaceApiKey":[]}],"summary":"Check how a link previews","tags":["Workspace"]}},"/api/v1/assets/upload-url":{"post":{"description":"Creates an asset record and a short-lived signed upload URL. Upload the bytes with `PUT`, the declared `Content-Type`, and `If-None-Match: *`: the URL is write-once and both headers are part of its signature. Requires the `upload:sign` scope.","operationId":"createAssetUploadUrl","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetUploadRequest"}}}},"responses":{"201":{"description":"Signed upload instructions.","content":{"application/json":{"schema":{"type":"object","properties":{"asset":{"type":"object","properties":{"id":{"type":"string"},"objectKey":{"type":"string"},"status":{"type":"string","enum":["PENDING","UPLOADED","FAILED","DELETED"]}},"required":["id","objectKey","status"],"additionalProperties":false},"uploadUrl":{"type":"string"}},"required":["asset","uploadUrl"],"additionalProperties":false}}}},"400":{"description":"The asset metadata is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication is required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key lacks the required workspace scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"A required dependency is unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"workspaceApiKey":[]}],"summary":"Create a signed asset upload URL","tags":["Assets"]}},"/api/v1/assets/{assetId}/complete":{"post":{"description":"Marks a signed upload as complete after storage verification. Requires the `asset:write` scope.","operationId":"completeAssetUpload","parameters":[{"in":"path","name":"assetId","required":true,"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetCompleteRequest"}}}},"responses":{"200":{"description":"Asset upload completed.","content":{"application/json":{"schema":{"type":"object","properties":{"asset":{"type":"object","properties":{"id":{"type":"string"},"objectKey":{"type":"string"},"status":{"type":"string","enum":["PENDING","UPLOADED","FAILED","DELETED"]}},"required":["id","objectKey","status"],"additionalProperties":false}},"required":["asset"],"additionalProperties":false}}}},"400":{"description":"The completion input is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication is required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key lacks the required workspace scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"The asset was not found in this workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"A required dependency is unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"workspaceApiKey":[]}],"summary":"Complete an asset upload","tags":["Assets"]}},"/api/v1/assets/{assetId}/download-url":{"get":{"description":"Returns a short-lived signed download URL for a workspace asset. Requires the `artifact:read` scope.","operationId":"createAssetDownloadUrl","parameters":[{"in":"path","name":"assetId","required":true,"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}],"responses":{"200":{"description":"Signed asset download URL.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetDownloadResponse"}}}},"400":{"description":"The asset identifier is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication is required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key lacks the required workspace scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"The asset was not found in this workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"A required dependency is unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"workspaceApiKey":[]}],"summary":"Create a signed asset download URL","tags":["Assets"]}},"/api/v1/assets/{assetId}":{"delete":{"x-screenshot-studio-entitlement":{"feature":"asset:delete","minimumPlan":"pro","quota":"api:write:minute"},"description":"Queues deletion of an uploaded asset that is not in use. Requires the `asset:write` scope and the asset deletion workspace entitlement (Pro or higher by default).","operationId":"deleteAsset","parameters":[{"in":"path","name":"assetId","required":true,"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}],"responses":{"202":{"description":"Asset deletion accepted.","content":{"application/json":{"schema":{"type":"object","properties":{"accepted":{"type":"boolean","const":true}},"required":["accepted"],"additionalProperties":false}}}},"400":{"description":"The asset identifier is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication is required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The principal lacks the required workspace permission, scope, or pricing entitlement.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"The asset was not found in this workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The asset is in use or is not ready for deletion.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"The workspace plan quota has been exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceQuotaError"}}}},"503":{"description":"A required dependency is unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"workspaceApiKey":[]}],"summary":"Delete a workspace asset","tags":["Assets"]}},"/api/v1/me":{"get":{"description":"Returns the id, name, email, and avatar of the user behind the session cookie.","operationId":"getCurrentUser","responses":{"200":{"description":"The resolved resource.","content":{"application/json":{"schema":{"type":"object","properties":{"user":{"type":"object","properties":{"email":{"type":"string"},"id":{"type":"string"},"image":{"type":["string","null"]},"name":{"type":["string","null"]}},"required":["email","id","image","name"],"additionalProperties":false}},"required":["user"],"additionalProperties":false}}}},"401":{"description":"A signed-in user session is required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The user is not a member of the active organization, lacks the permission, or sent an API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"A required dependency is unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"workspaceSession":[]}],"summary":"Get the signed-in user","tags":["Shell"]}},"/api/v1/bootstrap":{"get":{"description":"Returns the user, active organization, memberships, resolved permissions, workspace settings, entitlements, capabilities, and counters. Call after sign-in and again after any 401 or 403.","operationId":"getShellBootstrap","responses":{"200":{"description":"The resolved resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlaybookBootstrap"}}}},"401":{"description":"A signed-in user session is required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The user is not a member of the active organization, lacks the permission, or sent an API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"A required dependency is unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"workspaceSession":[]}],"summary":"Bootstrap a Playbook shell","tags":["Shell"]}},"/api/v1/organizations":{"get":{"description":"Lists every organization the signed-in user belongs to, with their normalized role in each.","operationId":"listOrganizations","responses":{"200":{"description":"The resolved resource.","content":{"application/json":{"schema":{"type":"object","properties":{"organizations":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"isScheduledForDeletion":{"type":"boolean"},"name":{"type":"string"},"role":{"type":"string"},"slug":{"type":"string"},"workspaceDeletion":{"type":"object","properties":{"requestedByUserId":{"type":"string"},"scheduledFor":{"type":"string"},"status":{"type":"string"}},"required":["requestedByUserId","scheduledFor","status"],"additionalProperties":false}},"required":["id","isScheduledForDeletion","name","role","slug"],"additionalProperties":false}}},"required":["organizations"],"additionalProperties":false}}}},"401":{"description":"A signed-in user session is required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The user is not a member of the active organization, lacks the permission, or sent an API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"A required dependency is unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"workspaceSession":[]}],"summary":"List the user organizations","tags":["Shell"]}},"/api/v1/organizations/{organizationId}":{"get":{"description":"Returns identity fields for the organization. The organization must be the active one; activate it first otherwise.","operationId":"getOrganization","parameters":[{"in":"path","name":"organizationId","required":true,"schema":{"type":"string","minLength":1,"maxLength":128}}],"responses":{"200":{"description":"The resolved resource.","content":{"application/json":{"schema":{"type":"object","properties":{"organization":{"type":"object","properties":{"createdAt":{"type":"string"},"id":{"type":"string"},"logo":{"type":["string","null"]},"name":{"type":"string"},"role":{"type":"string","enum":["owner","admin","creator","approver","publisher","viewer"]},"slug":{"type":"string"}},"required":["id","logo","name","role","slug"],"additionalProperties":false}},"required":["organization"],"additionalProperties":false}}}},"401":{"description":"A signed-in user session is required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The user is not a member of the active organization, lacks the permission, or sent an API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"A required dependency is unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"workspaceSession":[]}],"summary":"Get the active organization","tags":["Shell"]}},"/api/v1/organizations/{organizationId}/members":{"get":{"description":"Lists members and their roles in the active organization. Requires the member:read permission.","operationId":"listOrganizationMembers","parameters":[{"in":"path","name":"organizationId","required":true,"schema":{"type":"string","minLength":1,"maxLength":128}}],"responses":{"200":{"description":"The resolved resource.","content":{"application/json":{"schema":{"type":"object","properties":{"members":{"type":"array","items":{"type":"object","properties":{"createdAt":{"type":"string"},"id":{"type":"string"},"role":{"type":"string","enum":["owner","admin","creator","approver","publisher","viewer"]},"user":{"type":"object","properties":{"email":{"type":"string"},"id":{"type":"string"},"image":{"type":["string","null"]},"name":{"type":"string"}},"required":["email","id","image","name"],"additionalProperties":false}},"required":["createdAt","id","role","user"],"additionalProperties":false}}},"required":["members"],"additionalProperties":false}}}},"401":{"description":"A signed-in user session is required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The user is not a member of the active organization, lacks the permission, or sent an API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"A required dependency is unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"workspaceSession":[]}],"summary":"List organization members","tags":["Shell"]}},"/api/v1/organizations/{organizationId}/invitations":{"get":{"description":"Lists invitations for the active organization. Requires the invitation:read permission.","operationId":"listOrganizationInvitations","parameters":[{"in":"path","name":"organizationId","required":true,"schema":{"type":"string","minLength":1,"maxLength":128}}],"responses":{"200":{"description":"The resolved resource.","content":{"application/json":{"schema":{"type":"object","properties":{"invitations":{"type":"array","items":{"type":"object","properties":{"createdAt":{"type":"string"},"email":{"type":"string"},"expiresAt":{"type":"string"},"id":{"type":"string"},"role":{"anyOf":[{"type":"string","enum":["owner","admin","creator","approver","publisher","viewer"]},{"type":"null"}]},"status":{"type":"string"}},"required":["createdAt","email","expiresAt","id","role","status"],"additionalProperties":false}}},"required":["invitations"],"additionalProperties":false}}}},"401":{"description":"A signed-in user session is required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The user is not a member of the active organization, lacks the permission, or sent an API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"A required dependency is unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"workspaceSession":[]}],"summary":"List organization invitations","tags":["Shell"]}},"/api/v1/organizations/{organizationId}/settings":{"get":{"description":"Returns locale, time zone, default publishing time, and description for the active organization.","operationId":"getOrganizationSettings","parameters":[{"in":"path","name":"organizationId","required":true,"schema":{"type":"string","minLength":1,"maxLength":128}}],"responses":{"200":{"description":"The resolved resource.","content":{"application/json":{"schema":{"type":"object","properties":{"settings":{"type":"object","properties":{"createdAt":{"type":"string"},"defaultPublishTime":{"type":"string"},"description":{"type":["string","null"]},"locale":{"type":"string"},"organizationId":{"type":"string"},"timeZone":{"type":"string"},"updatedAt":{"type":"string"}},"required":["defaultPublishTime","description","locale","timeZone"],"additionalProperties":false}},"required":["settings"],"additionalProperties":false}}}},"401":{"description":"A signed-in user session is required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The user is not a member of the active organization, lacks the permission, or sent an API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"A required dependency is unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"workspaceSession":[]}],"summary":"Get workspace settings","tags":["Shell"]}},"/api/v1/organizations/{organizationId}/permissions":{"get":{"description":"Returns the normalized role and resolved permission list of the signed-in user in the active organization.","operationId":"getOrganizationPermissions","parameters":[{"in":"path","name":"organizationId","required":true,"schema":{"type":"string","minLength":1,"maxLength":128}}],"responses":{"200":{"description":"The resolved resource.","content":{"application/json":{"schema":{"type":"object","properties":{"permissions":{"readOnly":true,"type":"array","items":{"type":"string","enum":["workspace:read","workspace:update","workspace:delete","workspace:transfer_ownership","member:read","member:invite","member:remove","member:update_role","invitation:read","invitation:revoke","audit:read","audit:export","audit:manage","identity:manage","brand:manage","release:create","release:approve","artifact:read","artifact:edit","publish:manage","support:manage"]}},"role":{"type":"string","enum":["owner","admin","creator","approver","publisher","viewer"]}},"required":["permissions","role"],"additionalProperties":false}}}},"401":{"description":"A signed-in user session is required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The user is not a member of the active organization, lacks the permission, or sent an API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"A required dependency is unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"workspaceSession":[]}],"summary":"Get the user permissions","tags":["Shell"]}},"/api/v1/organizations/{organizationId}/capabilities":{"get":{"description":"Returns capability flags and the safe entitlement view (plan, status, features) for the active organization.","operationId":"getOrganizationCapabilities","parameters":[{"in":"path","name":"organizationId","required":true,"schema":{"type":"string","minLength":1,"maxLength":128}}],"responses":{"200":{"description":"The resolved resource.","content":{"application/json":{"schema":{"type":"object","properties":{"capabilities":{"type":"object","properties":{"browserAutomation":{"type":"boolean"},"engineeringAgent":{"type":"boolean"},"publishing":{"type":"boolean"},"voiceCapture":{"type":"boolean"},"workflows":{"type":"boolean"}},"required":["browserAutomation","engineeringAgent","publishing","voiceCapture","workflows"],"additionalProperties":false},"entitlements":{"type":"object","properties":{"features":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"boolean"}},"plan":{"type":"string"},"status":{"type":"string"}},"required":["features","plan","status"],"additionalProperties":false}},"required":["capabilities","entitlements"],"additionalProperties":false}}}},"401":{"description":"A signed-in user session is required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The user is not a member of the active organization, lacks the permission, or sent an API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"A required dependency is unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"workspaceSession":[]}],"summary":"Get organization capabilities","tags":["Shell"]}},"/api/v1/organizations/{organizationId}/activate":{"post":{"description":"Makes the organization active for this session after checking membership and deletion state, then returns the refreshed bootstrap.","operationId":"activateOrganization","parameters":[{"in":"path","name":"organizationId","required":true,"schema":{"type":"string","minLength":1,"maxLength":128}}],"responses":{"200":{"description":"The resolved resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlaybookBootstrap"}}}},"401":{"description":"A signed-in user session is required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The user is not a member of the active organization, lacks the permission, or sent an API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"A required dependency is unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"workspaceSession":[]}],"summary":"Switch the active organization","tags":["Shell"]}},"/openapi.json":{"get":{"operationId":"getOpenApiSpec","summary":"Fetch this OpenAPI specification","description":"Returns the OpenAPI 3.1 document describing every public Screenshot Studio operation.","tags":["Discovery"],"responses":{"200":{"description":"OpenAPI 3.1 document.","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/llms.txt":{"get":{"operationId":"getLlmsTxt","summary":"Fetch the llms.txt site overview","description":"Returns a Markdown overview of Screenshot Studio: features, pages, pricing, and contact details.","tags":["Discovery"],"responses":{"200":{"description":"Markdown overview.","content":{"text/markdown":{"schema":{"type":"string"}}}}}}},"/llms-full.txt":{"get":{"operationId":"getLlmsFullTxt","summary":"Fetch the full llms.txt reference","description":"Returns the complete Markdown reference: every feature, every page, the technology stack, and the privacy model.","tags":["Discovery"],"responses":{"200":{"description":"Markdown reference.","content":{"text/markdown":{"schema":{"type":"string"}}}}}}}},"components":{"securitySchemes":{"workspaceApiKey":{"type":"apiKey","in":"header","name":"X-API-Key","description":"Workspace API key with the operation-required scope."},"workspaceSession":{"type":"apiKey","in":"cookie","name":"better-auth.session_token","description":"Signed-in user session cookie issued by sign-in."}},"schemas":{"ReleaseListResponse":{"type":"object","properties":{"releases":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"productSurfaceId":{"type":["string","null"]},"status":{"type":"string","enum":["DRAFT","READY","ARCHIVED","CANCELLED"]},"title":{"type":"string"},"benefitStatement":{"type":"string"},"createdAt":{"type":"string"},"features":{"type":"array","items":{"type":"object","properties":{"author":{"type":"string"},"kind":{"type":"string","enum":["feature","improvement","fix","internal","other"]},"number":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"title":{"type":"string"},"url":{"type":"string"}},"required":["kind","title"],"additionalProperties":false}},"screenshotAssetIds":{"type":"array","items":{"type":"string"}},"updatedAt":{"type":"string"}},"required":["id","productSurfaceId","status","title","benefitStatement","createdAt","updatedAt"],"additionalProperties":false}}},"required":["releases"],"additionalProperties":false},"ReleaseCreateRequest":{"type":"object","properties":{"audience":{"type":"string","maxLength":1000},"benefitStatement":{"default":"","type":"string","maxLength":500},"description":{"type":"string","maxLength":10000},"productSurfaceId":{"type":"string","format":"cuid","pattern":"^[cC][0-9a-z]{6,}$"},"sourceUrls":{"maxItems":20,"type":"array","items":{"type":"string","maxLength":2000,"format":"uri"}},"title":{"type":"string","minLength":1,"maxLength":160}},"required":["title"]},"SourceAppCreateRequest":{"type":"object","properties":{"allowedHosts":{"minItems":1,"maxItems":50,"type":"array","items":{"type":"string","format":"uri"}},"branch":{"type":"string","minLength":1,"maxLength":255,"pattern":"^(?!refs\\/)[^\\s~^:?*[\\\\]+$"},"externalId":{"type":"string","minLength":1,"maxLength":160},"githubConnectionId":{"type":"string","pattern":"^[a-z0-9]{10,32}$"},"ignoreBotPullRequests":{"type":"boolean"},"ignoredPullRequestAuthors":{"maxItems":100,"type":"array","items":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9-]{0,38}(\\[bot\\])?$"}},"name":{"type":"string","minLength":1,"maxLength":100},"provider":{"default":"generic","type":"string","maxLength":64,"pattern":"^[a-z0-9_-]+$"},"secretReference":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"},"skipPrereleases":{"type":"boolean"}},"required":["allowedHosts","name"]},"SourceAppUpdateRequest":{"type":"object","properties":{"branch":{"anyOf":[{"type":"string","minLength":1,"maxLength":255,"pattern":"^(?!refs\\/)[^\\s~^:?*[\\\\]+$"},{"type":"null"}]},"ignoreBotPullRequests":{"type":"boolean"},"ignoredPullRequestAuthors":{"maxItems":100,"type":"array","items":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9-]{0,38}(\\[bot\\])?$"}},"skipPrereleases":{"type":"boolean"}}},"LinkPreviewReport":{"type":"object","properties":{"url":{"type":"string"},"title":{"type":"string"},"description":{"type":"string"},"canonical":{"type":"string"},"favicon":{"type":"string"},"language":{"type":"string"},"charset":{"type":"string"},"viewport":{"type":"string"},"robots":{"type":"string"},"themeColor":{"type":"string"},"ogTitle":{"type":"string"},"ogDescription":{"type":"string"},"ogImage":{"type":"string"},"ogImageAlt":{"type":"string"},"ogImageWidth":{"type":"string"},"ogImageHeight":{"type":"string"},"ogType":{"type":"string"},"ogUrl":{"type":"string"},"ogSiteName":{"type":"string"},"ogLocale":{"type":"string"},"twitterCard":{"type":"string"},"twitterTitle":{"type":"string"},"twitterDescription":{"type":"string"},"twitterImage":{"type":"string"},"twitterImageAlt":{"type":"string"},"twitterSite":{"type":"string"},"twitterCreator":{"type":"string"},"robotsFile":{"type":"string"},"sitemap":{"type":"string"},"jsonLd":{"type":"array","items":{"type":"string"}},"tags":{"type":"array","items":{"type":"object","properties":{"attribute":{"type":"string","enum":["charset","http-equiv","itemprop","name","property","rel"]},"key":{"type":"string"},"value":{"type":"string"},"hreflang":{"type":"string"},"sizes":{"type":"string"},"type":{"type":"string"}},"required":["attribute","key","value"],"additionalProperties":false}},"agent":{"type":"string","enum":["default","facebook","x","linkedin","slack","discord","telegram","whatsapp","google"]},"response":{"type":"object","properties":{"hops":{"type":"array","items":{"type":"object","properties":{"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"url":{"type":"string"}},"required":["status","url"],"additionalProperties":false}},"durationMs":{"type":"integer","minimum":0,"maximum":9007199254740991},"contentType":{"type":"string"},"bytes":{"type":"integer","minimum":0,"maximum":9007199254740991},"truncated":{"type":"boolean"},"xRobotsTag":{"type":"string"},"headers":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}},"required":["hops","durationMs","contentType","bytes","truncated"],"additionalProperties":false},"images":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string"},"error":{"type":"string"},"contentType":{"type":"string"},"bytes":{"type":"integer","minimum":0,"maximum":9007199254740991},"tooLarge":{"type":"boolean"},"format":{"type":"string"},"width":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"height":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["url"],"additionalProperties":false}},"crawlers":{"type":"array","items":{"type":"object","properties":{"crawler":{"type":"string","enum":["facebook","x","linkedin","slack","discord","telegram","whatsapp","google"]},"allowed":{"type":"boolean"},"rule":{"type":"string"}},"required":["crawler","allowed"],"additionalProperties":false}},"robotsTxt":{"type":"string"},"targets":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["canonical","og:url"]},"url":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"finalUrl":{"type":"string"},"error":{"type":"string"}},"required":["kind","url"],"additionalProperties":false}},"tracking":{"type":"object","properties":{"url":{"type":"string"},"finalUrl":{"type":"string"},"kept":{"type":"boolean"},"error":{"type":"string"}},"required":["url"],"additionalProperties":false},"oembed":{"type":"object","properties":{"url":{"type":"string"},"error":{"type":"string"},"type":{"type":"string"},"title":{"type":"string"},"providerName":{"type":"string"},"authorName":{"type":"string"},"thumbnailUrl":{"type":"string"},"width":{"type":"number"},"height":{"type":"number"},"hasHtml":{"type":"boolean"}},"required":["url"],"additionalProperties":false},"score":{"type":"integer","minimum":0,"maximum":100},"issues":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"severity":{"type":"string","enum":["error","warning","info"]},"category":{"type":"string","enum":["content","social","images","indexing","technical"]},"title":{"type":"string"},"fix":{"type":"string"}},"required":["id","severity","category","title","fix"],"additionalProperties":false}}},"required":["url","jsonLd","tags","score","issues"],"additionalProperties":false},"AssetUploadRequest":{"type":"object","properties":{"bytes":{"type":"integer","exclusiveMinimum":0,"maximum":52428800},"classification":{"default":"input","type":"string","enum":["capture","derived","export","input"]},"contentType":{"type":"string","pattern":"^(image\\/(gif|jpeg|png|webp)|video\\/(mp4|webm))$"},"fileName":{"type":"string","minLength":1,"maxLength":128},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"}},"required":["bytes","contentType","fileName"]},"AssetCompleteRequest":{"type":"object","properties":{"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"}}},"AssetDownloadResponse":{"type":"object","properties":{"downloadUrl":{"type":"string","format":"uri"}},"required":["downloadUrl"],"additionalProperties":false},"PlaybookBootstrap":{"type":"object","properties":{"capabilities":{"type":"object","properties":{"browserAutomation":{"type":"boolean"},"engineeringAgent":{"type":"boolean"},"publishing":{"type":"boolean"},"voiceCapture":{"type":"boolean"},"workflows":{"type":"boolean"}},"required":["browserAutomation","engineeringAgent","publishing","voiceCapture","workflows"],"additionalProperties":false},"counters":{"type":"object","properties":{"approvals":{"type":"number"},"attention":{"type":"number"}},"required":["approvals","attention"],"additionalProperties":false},"entitlements":{"type":"object","properties":{"features":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"boolean"}},"plan":{"type":"string"},"status":{"type":"string"}},"required":["features","plan","status"],"additionalProperties":false},"membership":{"type":"object","properties":{"permissions":{"type":"array","items":{"type":"string"}},"role":{"type":"string"}},"required":["permissions","role"],"additionalProperties":false},"organization":{"type":"object","properties":{"id":{"type":"string"},"logo":{"type":["string","null"]},"name":{"type":"string"},"slug":{"type":"string"}},"required":["id","logo","name","slug"],"additionalProperties":false},"organizations":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"role":{"type":"string"},"slug":{"type":"string"}},"required":["id","name","role","slug"],"additionalProperties":false}},"user":{"type":"object","properties":{"email":{"type":"string"},"id":{"type":"string"},"name":{"type":["string","null"]}},"required":["email","id","name"],"additionalProperties":false},"workspace":{"type":"object","properties":{"defaultPublishTime":{"type":"string"},"locale":{"type":"string"},"timeZone":{"type":"string"}},"required":["defaultPublishTime","locale","timeZone"],"additionalProperties":false}},"required":["capabilities","counters","entitlements","membership","organization","organizations","user","workspace"],"additionalProperties":false},"Error":{"type":"object","properties":{"code":{"type":"string","enum":["invalid_request","invalid_url","unsupported_value","unauthorized","forbidden","forbidden_domain","not_found","method_not_allowed","conflict","rate_limited","workspace_feature_not_entitled","workspace_quota_exceeded","upstream_timeout","upstream_unavailable","upstream_failed","internal_error"],"description":"Stable machine-readable error code."},"documentation":{"type":"string","format":"uri","description":"Link to the error reference."},"error":{"type":"string","description":"Human-readable error message.","examples":["URL is required"]},"hint":{"type":"string","description":"How to resolve the error."},"message":{"type":"string","description":"Human-readable error message, same value as `error`."},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"HTTP status code, repeated in the body."}},"required":["code","documentation","error","hint","message","status"],"additionalProperties":false,"description":"Every failing request returns this envelope. `code` is stable and safe to branch on; `error` and `message` carry the same human-readable text."},"WorkspaceEntitlementError":{"type":"object","properties":{"code":{"type":"string","enum":["invalid_request","invalid_url","unsupported_value","unauthorized","forbidden","forbidden_domain","not_found","method_not_allowed","conflict","rate_limited","workspace_feature_not_entitled","workspace_quota_exceeded","upstream_timeout","upstream_unavailable","upstream_failed","internal_error"],"description":"Stable machine-readable error code."},"documentation":{"type":"string","format":"uri","description":"Link to the error reference."},"error":{"type":"string","description":"Human-readable error message.","examples":["URL is required"]},"hint":{"type":"string","description":"How to resolve the error."},"message":{"type":"string","description":"Human-readable error message, same value as `error`."},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"HTTP status code, repeated in the body."},"currentPlan":{"type":"string","enum":["free","pro","business","enterprise"]},"feature":{"type":"string","enum":["asset:create","asset:read","asset:update","asset:delete","release:create","source-app:create","enterprise:audit-drain","enterprise:sso","enterprise:scim","campaign:workflow"]},"requiredPlan":{"type":"string","enum":["free","pro","business","enterprise"]}},"required":["code","documentation","error","hint","message","status","currentPlan","feature","requiredPlan"],"additionalProperties":false},"WorkspaceQuotaError":{"type":"object","properties":{"code":{"type":"string","enum":["invalid_request","invalid_url","unsupported_value","unauthorized","forbidden","forbidden_domain","not_found","method_not_allowed","conflict","rate_limited","workspace_feature_not_entitled","workspace_quota_exceeded","upstream_timeout","upstream_unavailable","upstream_failed","internal_error"],"description":"Stable machine-readable error code."},"documentation":{"type":"string","format":"uri","description":"Link to the error reference."},"error":{"type":"string","description":"Human-readable error message.","examples":["URL is required"]},"hint":{"type":"string","description":"How to resolve the error."},"message":{"type":"string","description":"Human-readable error message, same value as `error`."},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"HTTP status code, repeated in the body."},"limit":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"quota":{"type":"string","enum":["api:write:minute","storage:bytes","ai:credits:monthly","posts:monthly","emails:monthly","jobs:concurrent"]}},"required":["code","documentation","error","hint","message","status","limit","quota"],"additionalProperties":false},"RateLimitError":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"retryAfter":{"type":"integer","description":"Seconds to wait before retrying."}}}]},"ScreenshotRequest":{"type":"object","required":["url"],"properties":{"url":{"type":"string","format":"uri","description":"Absolute http or https URL of the page to capture.","examples":["https://example.com"]},"deviceType":{"type":"string","enum":["desktop","mobile"],"default":"desktop","description":"Viewport preset. `desktop` is 1920x1080, `mobile` is 375x667."},"colorScheme":{"type":"string","enum":["light","dark"],"default":"light","description":"prefers-color-scheme sent to the target page."},"forceRefresh":{"type":"boolean","default":false,"description":"Bypass and replace the cached capture for this URL."}}},"ScreenshotResponse":{"type":"object","required":["screenshot","url","cached"],"properties":{"screenshot":{"type":"string","contentEncoding":"base64","description":"Base64-encoded PNG bytes, without a data URI prefix."},"url":{"type":"string","format":"uri","description":"Normalized URL that was captured."},"cached":{"type":"boolean","description":"True when the image was served from cache."},"strategy":{"type":"string","description":"Capture backend that produced the image."},"deviceType":{"type":"string","enum":["desktop","mobile"]},"colorScheme":{"type":"string","enum":["light","dark"]}}},"ExportRequest":{"type":"object","required":["image","format","qualityPreset"],"properties":{"image":{"type":"string","format":"binary","description":"The raw image file to recompress."},"format":{"type":"string","enum":["png","jpeg","webp"],"description":"Output image format."},"qualityPreset":{"type":"string","enum":["high","medium","low"],"description":"Compression preset applied to the chosen format."}}},"TweetResponse":{"type":"object","required":["data"],"properties":{"data":{"type":["object","null"],"description":"Tweet payload as returned by the public syndication API, or null when the tweet is unavailable."},"error":{"type":"string","description":"Present only when `data` is null."}}}}}}