{"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":{"operationId":"listReleases","summary":"List workspace releases","description":"Lists releases in the API key workspace. Requires the `artifact:read` scope.","tags":["Workspace"],"security":[{"workspaceApiKey":[]}],"parameters":[{"in":"query","name":"limit","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}}],"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"}}}}}},"post":{"operationId":"createRelease","summary":"Create a workspace release","description":"Creates a release in the API key workspace. Accepts `Idempotency-Key` and requires the `release:create` scope.","tags":["Workspace"],"security":[{"workspaceApiKey":[]}],"parameters":[{"in":"header","name":"Idempotency-Key","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"}}}},"201":{"description":"Release created.","content":{"application/json":{"schema":{"type":"object"}}}},"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"}}}}}}},"/api/v1/source-apps":{"post":{"operationId":"createSourceApp","summary":"Create a workspace source app","description":"Registers a release-intake source in the API key workspace. Requires the `source:write` scope.","tags":["Workspace"],"security":[{"workspaceApiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SourceAppCreateRequest"}}}},"responses":{"201":{"description":"Source app created.","content":{"application/json":{"schema":{"type":"object"}}}},"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"}}}}}}},"/api/v1/assets/upload-url":{"post":{"operationId":"createAssetUploadUrl","summary":"Create a signed asset upload URL","description":"Creates an asset record and a short-lived signed upload URL. Requires the `upload:sign` scope.","tags":["Assets"],"security":[{"workspaceApiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetUploadRequest"}}}},"responses":{"201":{"description":"Signed upload instructions.","content":{"application/json":{"schema":{"type":"object"}}}},"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"}}}}}}},"/api/v1/assets/{assetId}/complete":{"post":{"operationId":"completeAssetUpload","summary":"Complete an asset upload","description":"Marks a signed upload as complete after storage verification. Requires the `asset:write` scope.","tags":["Assets"],"security":[{"workspaceApiKey":[]}],"parameters":[{"$ref":"#/components/parameters/AssetId"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetCompleteRequest"}}}},"responses":{"200":{"description":"Asset upload completed."},"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"}}}}}}},"/api/v1/assets/{assetId}/download-url":{"get":{"operationId":"createAssetDownloadUrl","summary":"Create a signed asset download URL","description":"Returns a short-lived signed download URL for a workspace asset. Requires the `artifact:read` scope.","tags":["Assets"],"security":[{"workspaceApiKey":[]}],"parameters":[{"$ref":"#/components/parameters/AssetId"}],"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"}}}}}}},"/api/v1/assets/{assetId}":{"delete":{"operationId":"deleteAsset","x-screenshot-studio-entitlement":{"feature":"asset:delete","minimumPlan":"pro","quota":"api:write:minute"},"summary":"Delete a workspace asset","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).","tags":["Assets"],"security":[{"workspaceApiKey":[]}],"parameters":[{"$ref":"#/components/parameters/AssetId"}],"responses":{"202":{"description":"Asset deletion accepted."},"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"}}}}}}},"/api/v1/me":{"get":{"operationId":"getCurrentUser","summary":"Get the signed-in user","description":"Returns the id, name, email, and avatar of the user behind the session cookie.","tags":["Shell"],"security":[{"workspaceSession":[]}],"responses":{"200":{"description":"The resolved resource.","content":{"application/json":{"schema":{"type":"object"}}}},"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"}}}}}}},"/api/v1/bootstrap":{"get":{"operationId":"getShellBootstrap","summary":"Bootstrap a Playbook shell","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.","tags":["Shell"],"security":[{"workspaceSession":[]}],"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"}}}}}}},"/api/v1/organizations":{"get":{"operationId":"listOrganizations","summary":"List the user organizations","description":"Lists every organization the signed-in user belongs to, with their normalized role in each.","tags":["Shell"],"security":[{"workspaceSession":[]}],"responses":{"200":{"description":"The resolved resource.","content":{"application/json":{"schema":{"type":"object"}}}},"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"}}}}}}},"/api/v1/organizations/{organizationId}":{"get":{"operationId":"getOrganization","summary":"Get the active organization","description":"Returns identity fields for the organization. The organization must be the active one; activate it first otherwise.","tags":["Shell"],"security":[{"workspaceSession":[]}],"responses":{"200":{"description":"The resolved resource.","content":{"application/json":{"schema":{"type":"object"}}}},"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"}}}}},"parameters":[{"in":"path","name":"organizationId","required":true,"schema":{"type":"string"}}]}},"/api/v1/organizations/{organizationId}/members":{"get":{"operationId":"listOrganizationMembers","summary":"List organization members","description":"Lists members and their roles in the active organization. Requires the member:read permission.","tags":["Shell"],"security":[{"workspaceSession":[]}],"responses":{"200":{"description":"The resolved resource.","content":{"application/json":{"schema":{"type":"object"}}}},"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"}}}}},"parameters":[{"in":"path","name":"organizationId","required":true,"schema":{"type":"string"}}]}},"/api/v1/organizations/{organizationId}/invitations":{"get":{"operationId":"listOrganizationInvitations","summary":"List organization invitations","description":"Lists invitations for the active organization. Requires the invitation:read permission.","tags":["Shell"],"security":[{"workspaceSession":[]}],"responses":{"200":{"description":"The resolved resource.","content":{"application/json":{"schema":{"type":"object"}}}},"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"}}}}},"parameters":[{"in":"path","name":"organizationId","required":true,"schema":{"type":"string"}}]}},"/api/v1/organizations/{organizationId}/settings":{"get":{"operationId":"getOrganizationSettings","summary":"Get workspace settings","description":"Returns locale, time zone, default publishing time, and description for the active organization.","tags":["Shell"],"security":[{"workspaceSession":[]}],"responses":{"200":{"description":"The resolved resource.","content":{"application/json":{"schema":{"type":"object"}}}},"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"}}}}},"parameters":[{"in":"path","name":"organizationId","required":true,"schema":{"type":"string"}}]}},"/api/v1/organizations/{organizationId}/permissions":{"get":{"operationId":"getOrganizationPermissions","summary":"Get the user permissions","description":"Returns the normalized role and resolved permission list of the signed-in user in the active organization.","tags":["Shell"],"security":[{"workspaceSession":[]}],"responses":{"200":{"description":"The resolved resource.","content":{"application/json":{"schema":{"type":"object"}}}},"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"}}}}},"parameters":[{"in":"path","name":"organizationId","required":true,"schema":{"type":"string"}}]}},"/api/v1/organizations/{organizationId}/capabilities":{"get":{"operationId":"getOrganizationCapabilities","summary":"Get organization capabilities","description":"Returns capability flags and the safe entitlement view (plan, status, features) for the active organization.","tags":["Shell"],"security":[{"workspaceSession":[]}],"responses":{"200":{"description":"The resolved resource.","content":{"application/json":{"schema":{"type":"object"}}}},"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"}}}}},"parameters":[{"in":"path","name":"organizationId","required":true,"schema":{"type":"string"}}]}},"/api/v1/organizations/{organizationId}/activate":{"post":{"operationId":"activateOrganization","summary":"Switch the active organization","description":"Makes the organization active for this session after checking membership and deletion state, then returns the refreshed bootstrap.","tags":["Shell"],"security":[{"workspaceSession":[]}],"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"}}}}},"parameters":[{"in":"path","name":"organizationId","required":true,"schema":{"type":"string"}}]}},"/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."}},"parameters":{"AssetId":{"in":"path","name":"assetId","required":true,"schema":{"type":"string","format":"uuid"}}},"schemas":{"ReleaseCreateRequest":{"type":"object","additionalProperties":false,"required":["title","benefitStatement"],"properties":{"title":{"type":"string","minLength":1,"maxLength":160},"benefitStatement":{"type":"string","minLength":1,"maxLength":500},"description":{"type":"string","maxLength":10000,"description":"Plain-text brief. Markup is rejected."},"audience":{"type":"string","maxLength":1000},"sourceUrls":{"type":"array","maxItems":20,"items":{"type":"string","format":"uri"}},"productSurfaceId":{"type":"string","description":"A product surface in the same workspace."}}},"PlaybookBootstrap":{"type":"object","required":["user","organization","organizations","membership","workspace","entitlements","capabilities","counters"],"properties":{"user":{"type":"object"},"organization":{"type":"object"},"organizations":{"type":"array","items":{"type":"object"}},"membership":{"type":"object","properties":{"role":{"type":"string"},"permissions":{"type":"array","items":{"type":"string"}}}},"workspace":{"type":"object"},"entitlements":{"type":"object"},"capabilities":{"type":"object"},"counters":{"type":"object"}}},"ReleaseListResponse":{"type":"object","required":["releases"],"properties":{"releases":{"type":"array","items":{"type":"object"}}}},"SourceAppCreateRequest":{"type":"object","additionalProperties":false,"required":["allowedHosts","name"],"properties":{"allowedHosts":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"string","format":"uri"}},"externalId":{"type":"string","maxLength":160},"name":{"type":"string","minLength":1,"maxLength":100},"provider":{"type":"string","default":"generic","maxLength":64},"secretReference":{"type":"string","maxLength":128}}},"AssetUploadRequest":{"type":"object","additionalProperties":false,"required":["bytes","contentType","fileName"],"properties":{"bytes":{"type":"integer","minimum":1,"maximum":52428800},"classification":{"type":"string","default":"input"},"contentType":{"type":"string","enum":["image/gif","image/jpeg","image/png","image/webp","video/mp4","video/webm"]},"fileName":{"type":"string","minLength":1,"maxLength":128},"sha256":{"type":"string","pattern":"^[a-fA-F0-9]{64}$"}}},"AssetCompleteRequest":{"type":"object","additionalProperties":false,"properties":{"sha256":{"type":"string","pattern":"^[a-fA-F0-9]{64}$"}}},"AssetDownloadResponse":{"type":"object","required":["downloadUrl"],"properties":{"downloadUrl":{"type":"string","format":"uri"}}},"Error":{"type":"object","description":"Every failing request returns this envelope. `code` is stable and safe to branch on; `error` and `message` carry the same human-readable text.","required":["error","code","message","hint","status","documentation"],"properties":{"error":{"type":"string","description":"Human-readable error message.","examples":["URL is required"]},"code":{"type":"string","description":"Stable machine-readable error code.","enum":["invalid_request","invalid_url","unsupported_value","unauthorized","forbidden","forbidden_domain","not_found","method_not_allowed","rate_limited","workspace_feature_not_entitled","workspace_quota_exceeded","upstream_timeout","upstream_unavailable","upstream_failed","internal_error"]},"message":{"type":"string","description":"Human-readable error message, same value as `error`."},"hint":{"type":"string","description":"How to resolve the error."},"status":{"type":"integer","description":"HTTP status code, repeated in the body."},"documentation":{"type":"string","format":"uri","description":"Link to the error reference."}}},"RateLimitError":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"retryAfter":{"type":"integer","description":"Seconds to wait before retrying."}}}]},"WorkspaceEntitlementError":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","required":["currentPlan","feature","requiredPlan"],"properties":{"currentPlan":{"type":"string","enum":["free","pro","business","enterprise"]},"feature":{"type":"string"},"requiredPlan":{"type":"string","enum":["free","pro","business","enterprise"]}}}]},"WorkspaceQuotaError":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","required":["limit","quota"],"properties":{"limit":{"type":"integer"},"quota":{"type":"string"}}}]},"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."}}}}}}