Schemas
The 117 objects of the StoreShot API 1.18.0 contract.
ApiKeyEnvironment
string
test keys never incur charges or call image providers.
One of: "live" , "test"
GenerationStatus
string
queued: waiting for a worker (can be canceled). running: being generated (retries keep it running). succeeded, failed and canceled are final.
One of: "queued" , "running" , "succeeded" , "failed" , "canceled"
StoreTarget
string
One of: "app_store" , "google_play"
Orientation
string
One of: "portrait" , "landscape"
PaletteColor
object
| Field | Type | Description |
|---|---|---|
hexrequired | string | |
namerequired | string |
WebhookGenerationData
object
Generation at the time of the event, without download URLs.| Field | Type | Description |
|---|---|---|
idrequired | string | Format: uuid |
statusrequired | GenerationStatus | |
environmentrequired | ApiKeyEnvironment | |
inputsrequired | array of object | |
inputs[].uploadIdrequired | string | Format: uuid |
inputs[].sourceUrlrequired | stringnullable | For a URL input: origin and path of the URL (it was imported as uploadId). |
storerequired | StoreTarget | |
devicerequired | string | Catalogue id of the size. |
sizerequired | object | |
size.widthrequired | integer | |
size.heightrequired | integer | |
orientationrequired | Orientation | |
apprequired | object | |
app.namerequired | string | |
app.descriptionrequired | string | |
captionrequired | stringnullable | As requested; null = derive. |
paletterequired | array of PaletteColornullable | As requested, or from the style (style.applied contains palette); null = extract from the screenshot. |
logorequired | objectnullable | |
logo.uploadIdrequired | string | Format: uuid |
metadatarequired | object | |
creditsChargedrequired | integer | 1 for live keys, 0 for test keys. |
creditsRefundedrequired | integer | Refunded when the generation failed or was canceled before it started. |
resultrequired | objectnullable | As in GET /generations/{id} but without URLs (they expire): fetch the generation for fresh ones. |
result.imagerequired | object | |
result.image.contentTyperequired | string | PNG; JPEG for the Google Play feature graphic.One of: "image/png", "image/jpeg" |
result.image.widthrequired | integer | |
result.image.heightrequired | integer | |
result.thumbnailrequired | objectnullable | |
result.thumbnail.contentTyperequired | string | One of: "image/webp" |
result.captionrequired | string | The caption used: yours, or the one derived from the screenshot (may be empty). |
result.paletterequired | array of PaletteColor | The colours used. |
errorrequired | objectnullable | Only when failed. See /v1/docs/errors for each code. |
error.coderequired | string | One of: "GENERATION_FAILED", "GENERATION_TIMEOUT", "NOT_A_SCREENSHOT", "UPLOAD_NOT_READY", "INTERNAL_ERROR" |
error.messagerequired | string | |
createdAtrequired | string | RFC 3339 UTC timestamp. |
startedAtrequired | stringnullable | RFC 3339 UTC timestamp. |
finishedAtrequired | stringnullable | RFC 3339 UTC timestamp. |
deletedAtrequired | stringnullable | Set by DELETE: the result files are gone, this record stays. |
screenshotSet | object | Present only when this generation is an image of a screenshot set (POST /screenshot-sets). |
screenshotSet.idrequired | string | Format: uuid |
screenshotSet.positionrequired | integer | The screen (1-based). |
screenshotSet.attemptrequired | integer | 2 and up: a retry. |
GenerationSucceededEvent
object
| Field | Type | Description |
|---|---|---|
idrequired | string | Event id (evt_…), identical on every attempt: deduplicate on it. |
typerequired | string | One of: "generation.succeeded" |
createdrequired | string | RFC 3339 UTC timestamp. |
environmentrequired | ApiKeyEnvironment | |
apiVersionrequired | string | |
datarequired | WebhookGenerationData |
GenerationFailedEvent
object
| Field | Type | Description |
|---|---|---|
idrequired | string | Event id (evt_…), identical on every attempt: deduplicate on it. |
typerequired | string | One of: "generation.failed" |
createdrequired | string | RFC 3339 UTC timestamp. |
environmentrequired | ApiKeyEnvironment | |
apiVersionrequired | string | |
datarequired | WebhookGenerationData |
ScreenshotSetStatus
string
queued (all queued), running (any running, or some finished and some not), succeeded (all succeeded), partially_failed (all finished, some succeeded), canceled (none succeeded, all canceled), failed (none succeeded, otherwise).
One of: "queued" , "running" , "succeeded" , "partially_failed" , "failed" , "canceled"
ScreenshotSetPreview
object
GET /screenshot-sets and GET /screenshot-sets/{id}; absent from create, retry and cancel answers and from screenshot_set.completed events. null while no image has succeeded, or for a deleted set.| Field | Type | Description |
|---|---|---|
generationIdrequired | string | The image shown.Format: uuid |
storerequired | StoreTarget | |
devicerequired | string | |
thumbnailrequired | object | |
thumbnail.urlrequired | string | Signed URL of the 512 px WebP preview (expires at urlsExpireAt).Format: uri |
thumbnail.contentTyperequired | string | One of: "image/webp" |
urlsExpireAtrequired | string | 15 minutes after this response. Fetch the set again for a fresh URL. |
WebhookScreenshotSetData
object
ScreenshotSet at the time of the event, without source, project and preview.| Field | Type | Description |
|---|---|---|
idrequired | string | Format: uuid |
statusrequired | ScreenshotSetStatus | |
environmentrequired | ApiKeyEnvironment | |
apprequired | object | |
app.namerequired | string | |
app.descriptionrequired | string | |
orientationrequired | Orientation | |
paletterequired | array of PaletteColor | The palette of every image: as requested, or from the style (style.applied contains palette), or extracted. |
paletteSourcerequired | string | auto: extracted from screen 1 when the set was created.One of: "given", "auto" |
logorequired | objectnullable | |
logo.uploadIdrequired | string | Format: uuid |
metadatarequired | object | |
screensrequired | array of object | |
screens[].positionrequired | integer | |
screens[].inputrequired | object | |
screens[].input.uploadIdrequired | string | Format: uuid |
screens[].captionrequired | string | |
storesrequired | array of object | |
stores[].storerequired | StoreTarget | |
stores[].devicesrequired | array of string | |
stores[].featureGraphicrequired | objectnullable | |
stores[].featureGraphic.screenrequired | integer | |
stores[].featureGraphic.captionrequired | string | |
imagesrequired | integer | |
countsrequired | object | |
counts.queuedrequired | integer | |
counts.runningrequired | integer | |
counts.succeededrequired | integer | |
counts.failedrequired | integer | |
counts.canceledrequired | integer | |
creditsChargedrequired | integer | Every image of the set, retries included (0 with a test key). |
creditsRefundedrequired | integer | |
childrenrequired | array of object | The current image of every slot (store, device, screen). Result URLs: GET /generations?screenshotSetId= or the archive. |
children[].positionrequired | integer | The screen (1-based). |
children[].storerequired | StoreTarget | |
children[].devicerequired | string | |
children[].sizerequired | object | |
children[].size.widthrequired | integer | |
children[].size.heightrequired | integer | |
children[].featureGraphicrequired | boolean | |
children[].generationIdrequired | string | Format: uuid |
children[].attemptrequired | integer | |
children[].statusrequired | GenerationStatus | |
children[].errorrequired | objectnullable | |
children[].error.coderequired | string | One of: "GENERATION_FAILED", "GENERATION_TIMEOUT", "NOT_A_SCREENSHOT", "UPLOAD_NOT_READY", "INTERNAL_ERROR" |
children[].error.messagerequired | string | |
archiveUrlrequired | string | |
createdAtrequired | string | RFC 3339 UTC timestamp. |
updatedAtrequired | string | RFC 3339 UTC timestamp. |
finishedAtrequired | stringnullable | RFC 3339 UTC timestamp. |
deletedAtrequired | stringnullable | RFC 3339 UTC timestamp. |
preview | ScreenshotSetPreview |
ScreenshotSetCompletedEvent
object
| Field | Type | Description |
|---|---|---|
idrequired | string | Event id (evt_…), identical on every attempt: deduplicate on it. |
typerequired | string | One of: "screenshot_set.completed" |
createdrequired | string | RFC 3339 UTC timestamp. |
environmentrequired | ApiKeyEnvironment | |
apiVersionrequired | string | |
datarequired | WebhookScreenshotSetData |
CreditsLowEvent
object
| Field | Type | Description |
|---|---|---|
idrequired | string | Event id (evt_…), identical on every attempt: deduplicate on it. |
typerequired | string | One of: "credits.low" |
createdrequired | string | RFC 3339 UTC timestamp. |
environmentrequired | ApiKeyEnvironment | |
apiVersionrequired | string | |
datarequired | object | |
data.balancesrequired | object | |
data.balances.starterrequired | integer | |
data.balances.subscriptionrequired | integer | |
data.balances.purchasedrequired | integer | |
data.totalrequired | integer | |
data.thresholdrequired | integer |
WebhookTestEvent
object
| Field | Type | Description |
|---|---|---|
idrequired | string | Event id (evt_…), identical on every attempt: deduplicate on it. |
typerequired | string | One of: "webhook.test" |
createdrequired | string | RFC 3339 UTC timestamp. |
environmentrequired | ApiKeyEnvironment | |
apiVersionrequired | string | |
datarequired | object | |
data.webhookIdrequired | string | Format: uuid |
data.messagerequired | string |
CheckStatus
string
One of: "up" , "down" , "not_configured"
HealthReport
object
| Field | Type | Description |
|---|---|---|
statusrequired | string | One of: "healthy", "degraded" |
versionrequired | string | Server release version. |
commitrequired | string | Deployed git commit (short SHA). |
checksrequired | object | |
checks.databaserequired | CheckStatus | |
checks.redisrequired | CheckStatus |
ErrorCode
string
One of: "INVALID_INPUT" , "UNAUTHORIZED" , "FORBIDDEN" , "NOT_FOUND" , "METHOD_NOT_ALLOWED" , "PAYLOAD_TOO_LARGE" , "UPLOAD_NOT_READY" , "IDEMPOTENCY_CONFLICT" , "GENERATION_STATE_CONFLICT" , "SCREENSHOT_SET_STATE_CONFLICT" , "WEBHOOK_STATE_CONFLICT" , "BILLING_STATE_CONFLICT" , "IMAGE_TOO_LARGE" , "UNSUPPORTED_FORMAT" , "NOT_A_SCREENSHOT" , "URL_FETCH_FAILED" , "WEBHOOK_URL_REJECTED" , "INSUFFICIENT_CREDITS" , "RATE_LIMITED" , "CONCURRENCY_LIMITED" , "INTERNAL_ERROR" , "GENERATION_FAILED" , "SERVICE_UNAVAILABLE" , "BILLING_UNAVAILABLE" , "GENERATION_TIMEOUT"
ErrorEnvelope
object
| Field | Type | Description |
|---|---|---|
errorrequired | object | |
error.coderequired | ErrorCode | |
error.messagerequired | string | Human-readable message; safe to display. |
error.requestIdrequired | string | Equals the X-Request-Id response header. |
error.docUrlrequired | string | Documentation for this error code.Format: uri |
error.details | object | Code-specific structured details. |
DeviceKind
string
One of: "screenshot" , "feature_graphic"
Device
object
| Field | Type | Description |
|---|---|---|
idrequired | string | Stable identifier: <store>_<width>x<height>. |
storerequired | StoreTarget | |
kindrequired | DeviceKind | |
labelrequired | string | Display name; may change. Do not parse. |
deviceHintrequired | string | Example devices; may change. Do not parse. |
widthrequired | integer | Pixels. Portrait (canonical) for screenshots; landscape swaps width/height. |
heightrequired | integer | Pixels. |
orientationsrequired | array of Orientation | |
deprecated | boolean | true: still accepted (same output size) so existing requests keep working, but it breaks a store rule or is superseded. Never a default. Use replacedBy. Absent otherwise. |
replacedBy | string | Deprecated devices only: the GET /devices id to use instead. |
DeviceList
object
| Field | Type | Description |
|---|---|---|
datarequired | array of Device |
ComponentStatus
string
unknown only if every component is).
One of: "operational" , "degraded" , "outage" , "unknown"
StatusReport
object
| Field | Type | Description |
|---|---|---|
statusrequired | ComponentStatus | |
updatedAtrequired | string | When the state was computed (RFC 3339 UTC). |
windowSecondsrequired | integer | The window judged, in seconds. |
componentsrequired | array of object | |
components[].idrequired | string | One of: "api", "generation", "image_provider", "vision_provider" |
components[].namerequired | string | |
components[].statusrequired | ComponentStatus | unknown: no recent traffic to judge from, or the state could not be read. |
ApiKeyScope
string
One of: "generations:write" , "generations:read" , "uploads:write" , "usage:read" , "keys:manage" , "billing:read" , "billing:write" , "webhooks:read" , "webhooks:write"
Me
object
| Field | Type | Description |
|---|---|---|
userrequired | object | |
user.idrequired | string | Format: uuid |
user.displayNamerequired | stringnullable | |
user.avatarUrlrequired | stringnullable | |
user.email | string | Only when authenticated with an access token. |
user.createdAtrequired | string | RFC 3339 UTC timestamp. |
credentialrequired | object | |
credential.typerequired | string | One of: "user_token", "api_key" |
credential.environmentrequired | ApiKeyEnvironment | |
credential.scopesrequired | array of ApiKeyScope | |
credential.apiKey | object | Only when authenticated with an API key. Never the secret. |
credential.apiKey.idrequired | string | Format: uuid |
credential.apiKey.namerequired | string | |
credential.apiKey.prefixrequired | string | |
credential.apiKey.expiresAtrequired | stringnullable | RFC 3339 UTC timestamp. |
ApiKey
object
| Field | Type | Description |
|---|---|---|
idrequired | string | Format: uuid |
namerequired | string | |
prefixrequired | string | First characters of the key, for display. |
environmentrequired | ApiKeyEnvironment | |
scopesrequired | array of ApiKeyScope | |
statusrequired | string | One of: "active", "expired" |
createdAtrequired | string | RFC 3339 UTC timestamp. |
lastUsedAtrequired | stringnullable | RFC 3339 UTC timestamp. |
expiresAtrequired | stringnullable | RFC 3339 UTC timestamp. |
CreatedApiKey
ApiKey & object
| Field | Type | Description |
|---|---|---|
idrequired | string | Format: uuid |
namerequired | string | |
prefixrequired | string | First characters of the key, for display. |
environmentrequired | ApiKeyEnvironment | |
scopesrequired | array of ApiKeyScope | |
statusrequired | string | One of: "active", "expired" |
createdAtrequired | string | RFC 3339 UTC timestamp. |
lastUsedAtrequired | stringnullable | RFC 3339 UTC timestamp. |
expiresAtrequired | stringnullable | RFC 3339 UTC timestamp. |
keyrequired | string | The full secret. Returned only in this response; store it now. |
CreateApiKeyRequest
object
| Field | Type | Description |
|---|---|---|
namerequired | string | 1–64 characters after trimming; need not be unique. |
environmentrequired | ApiKeyEnvironment | |
scopes | array of ApiKeyScope | Defaults to every scope except keys:manage, billing:read, billing:write, webhooks:read and webhooks:write. |
expiresAt | string | Optional RFC 3339 expiry, in the future and at most 365 days ahead.Format: date-time |
ApiKeyList
object
| Field | Type | Description |
|---|---|---|
datarequired | array of ApiKey |
DeviceAuthorization
object
| Field | Type | Description |
|---|---|---|
device_coderequired | string | Secret. Send it to POST /auth/device/token; never show it to anyone. |
user_coderequired | string | Show it to the human: they confirm it in the console. |
verification_urirequired | string | Format: uri |
verification_uri_completerequired | string | The verification page with the code filled in.Format: uri |
expires_inrequired | integer | Seconds until the codes expire. |
intervalrequired | integer | Seconds to wait between polls of POST /auth/device/token. |
DeviceAuthorizationRequest
object
| Field | Type | Description |
|---|---|---|
client_name | string | Your tool’s name, shown to the human as an unverified label. 1–64 printable ASCII characters. When absent, client_id is used instead (generic OAuth libraries send one). |
scope | string | Space-separated scopes for the new key. Default generations:write generations:read uploads:write usage:read. keys:manage, billing:write and webhooks:write cannot be requested. The human may narrow the list, or add billing:read and webhooks:read. |
environment | ApiKeyEnvironment | Environment of the new key. Default live. |
DeviceToken
object
| Field | Type | Description |
|---|---|---|
access_tokenrequired | string | The new API key (ss_live_… or ss_test_…). Returned once: store it now. |
token_typerequired | string | One of: "Bearer" |
scoperequired | string | Space-separated scopes the human approved (may be narrower than requested). |
key_idrequired | string | Id of the new API key.Format: uuid |
environmentrequired | ApiKeyEnvironment |
DeviceTokenError
object
ErrorEnvelope. X-Request-Id is still in the response headers.| Field | Type | Description |
|---|---|---|
errorrequired | string | One of: "authorization_pending", "slow_down", "access_denied", "expired_token", "invalid_grant", "invalid_request", "unsupported_grant_type" |
error_descriptionrequired | string |
DeviceTokenRequest
object
| Field | Type | Description |
|---|---|---|
grant_typerequired | string | One of: "urn:ietf:params:oauth:grant-type:device_code" |
device_coderequired | string |
CreditBalances
object
| Field | Type | Description |
|---|---|---|
balancesrequired | object | |
balances.starterrequired | integer | |
balances.subscriptionrequired | integer | |
balances.purchasedrequired | integer | |
totalrequired | integer | Sum of the three balances. |
UsageGroupBy
string
day: one bucket per UTC day in the range, including empty days. key: per API key id (none for calls without a key). source: per surface (mobile, api, web, mcp, cli).
One of: "day" , "key" , "source"
UsageCounts
object
| Field | Type | Description |
|---|---|---|
generationsrequired | integer | Generations started in the bucket. |
succeededrequired | integer | Completed. |
failedrequired | integer | Failed before any credit was charged. |
refundedrequired | integer | Charged, then refunded. |
pendingrequired | integer | Still running. |
creditsUsedrequired | integer | Credits charged minus credits refunded for these generations. One generation can use several credits. |
UsageBucket
UsageCounts & object
| Field | Type | Description |
|---|---|---|
generationsrequired | integer | Generations started in the bucket. |
succeededrequired | integer | Completed. |
failedrequired | integer | Failed before any credit was charged. |
refundedrequired | integer | Charged, then refunded. |
pendingrequired | integer | Still running. |
creditsUsedrequired | integer | Credits charged minus credits refunded for these generations. One generation can use several credits. |
keyrequired | string | The UTC day, API key id or source. |
UsageReport
object
| Field | Type | Description |
|---|---|---|
fromrequired | string | Resolved start (inclusive). |
torequired | string | Resolved end (exclusive). |
groupByrequired | UsageGroupBy | |
datarequired | array of UsageBucket | Buckets sorted by key. |
totalsrequired | UsageCounts |
UploadStatus
string
pending: presigned, waiting for the file and complete. ready: usable in generations. failed: the file was rejected (it is deleted). deleted: deleted by you or by retention (metadata only).
One of: "pending" , "ready" , "failed" , "deleted"
UploadOrientation
string
square when equal.
One of: "portrait" , "landscape" , "square"
Upload
object
| Field | Type | Description |
|---|---|---|
idrequired | string | Format: uuid |
statusrequired | UploadStatus | |
sourcerequired | string | How the file arrived: a multipart upload, a presigned PUT, or a URL import.One of: "multipart", "presign", "url" |
environmentrequired | ApiKeyEnvironment | |
contentTyperequired | string | Detected from the file bytes (for a pending presigned upload: the declared type).One of: "image/png", "image/jpeg", "image/webp" |
bytesrequired | integer | File size (declared, while pending). |
widthrequired | integernullable | Pixels, EXIF-oriented. Null unless ready. |
heightrequired | integernullable | Pixels, EXIF-oriented. Null unless ready. |
orientationrequired | UploadOrientation | |
sha256required | stringnullable | Hex SHA-256 of the file. Null unless ready. |
sourceUrlrequired | stringnullable | URL imports only: origin and path of the URL you sent (query and fragment are never stored). |
expiresAtrequired | string | When the upload and its file are deleted: 30 days after creation (24 hours for pending or failed uploads). Generated results are kept until you delete them. |
createdAtrequired | string | RFC 3339 UTC timestamp. |
CreateUploadFromUrl
object
| Field | Type | Description |
|---|---|---|
urlrequired | string | An https:// URL (port 443, no credentials, at most 2048 characters) that resolves to a public address. Fetched once, server-side. |
PresignedUpload
object
| Field | Type | Description |
|---|---|---|
uploadrequired | Upload | |
uploadUrlrequired | string | PUT the file here, from your server.Format: uri |
methodrequired | string | One of: "PUT" |
headersrequired | object | Send exactly these headers with the PUT (they are signed). |
uploadUrlExpiresAtrequired | string | 15 minutes after this response. |
PresignUploadRequest
object
| Field | Type | Description |
|---|---|---|
contentTyperequired | string | The type of the file you will PUT: image/png, image/jpeg or image/webp. |
bytesrequired | integer | Exact size of the file you will PUT, at most 20 MB (20971520). |
UploadList
object
| Field | Type | Description |
|---|---|---|
datarequired | array of Upload | |
nextCursorrequired | stringnullable | Pass as cursor for the next page; null on the last page. |
GenerationResult
object
succeeded and not deleted.| Field | Type | Description |
|---|---|---|
imagerequired | object | |
image.urlrequired | string | Signed download URL (expires at urlsExpireAt).Format: uri |
image.contentTyperequired | string | PNG; JPEG for the Google Play feature graphic.One of: "image/png", "image/jpeg" |
image.widthrequired | integer | |
image.heightrequired | integer | |
thumbnailrequired | objectnullable | A 512 px preview. Best effort: its URL may return 404. |
thumbnail.urlrequired | string | Format: uri |
thumbnail.contentTyperequired | string | One of: "image/webp" |
urlsExpireAtrequired | string | 15 minutes after this response. Fetch the generation again for fresh URLs. |
captionrequired | string | The caption used: yours, or the one derived from the screenshot (may be empty). |
paletterequired | array of PaletteColor | The colours used. |
GenerationSource
string
One of: "mobile" , "api" , "web" , "mcp" , "cli"
ProjectRef
object
POST /projects/{id}/items).| Field | Type | Description |
|---|---|---|
idrequired | string | Format: uuid |
namerequired | string |
StyleField
string
One of: "palette" , "logo" , "backgroundMood" , "backgroundPrompt" , "captionTone"
StyleRef
object
styleId) it was made with, for an image of a screenshot set its set’s; null when none.| Field | Type | Description |
|---|---|---|
idrequired | stringnullable | null once the style was deleted (the generation keeps what it used).Format: uuid |
namerequired | string | |
appliedrequired | array of StyleField | What the style supplied, as it was at creation. Fields you sent yourself are not listed. |
Generation
object
| Field | Type | Description |
|---|---|---|
idrequired | string | Format: uuid |
statusrequired | GenerationStatus | |
environmentrequired | ApiKeyEnvironment | |
inputsrequired | array of object | |
inputs[].uploadIdrequired | string | Format: uuid |
inputs[].sourceUrlrequired | stringnullable | For a URL input: origin and path of the URL (it was imported as uploadId). |
storerequired | StoreTarget | |
devicerequired | string | Catalogue id of the size. |
sizerequired | object | |
size.widthrequired | integer | |
size.heightrequired | integer | |
orientationrequired | Orientation | |
apprequired | object | |
app.namerequired | string | |
app.descriptionrequired | string | |
captionrequired | stringnullable | As requested; null = derive. |
paletterequired | array of PaletteColornullable | As requested, or from the style (style.applied contains palette); null = extract from the screenshot. |
logorequired | objectnullable | |
logo.uploadIdrequired | string | Format: uuid |
metadatarequired | object | |
creditsChargedrequired | integer | 1 for live keys, 0 for test keys. |
creditsRefundedrequired | integer | Refunded when the generation failed or was canceled before it started. |
resultrequired | GenerationResult | |
errorrequired | objectnullable | Only when failed. See /v1/docs/errors for each code. |
error.coderequired | string | One of: "GENERATION_FAILED", "GENERATION_TIMEOUT", "NOT_A_SCREENSHOT", "UPLOAD_NOT_READY", "INTERNAL_ERROR" |
error.messagerequired | string | |
createdAtrequired | string | RFC 3339 UTC timestamp. |
startedAtrequired | stringnullable | RFC 3339 UTC timestamp. |
finishedAtrequired | stringnullable | RFC 3339 UTC timestamp. |
deletedAtrequired | stringnullable | Set by DELETE: the result files are gone, this record stays. |
screenshotSet | object | Present only when this generation is an image of a screenshot set (POST /screenshot-sets). |
screenshotSet.idrequired | string | Format: uuid |
screenshotSet.positionrequired | integer | The screen (1-based). |
screenshotSet.attemptrequired | integer | 2 and up: a retry. |
source | GenerationSource | |
clientName | stringnullable | Since 1.15.0 (always sent): the X-Storeshot-Client header of the request (e.g. cli/storeshot@1.2.0), else its sanitised User-Agent. Self-asserted: for your records only. |
requestId | stringnullable | Since 1.15.0 (always sent): the X-Request-Id of the request that created it (quote it to support). Null for test generations made before 1.15.0. |
project | ProjectRef | |
style | StyleRef |
GenerationInput
object
GenerationSize
object
| Field | Type | Description |
|---|---|---|
widthrequired | integer | |
heightrequired | integer |
GenerationMetadata
object
GET /generations?metadata=key:value): at most 20 keys of 1–40 characters (A-Z a-z 0-9 _ . -), string values of at most 500 characters, 4 KB in total.CreateGenerationRequest
object
| Field | Type | Description |
|---|---|---|
inputsrequired | array of GenerationInput | Exactly one screenshot in this version. |
storerequired | StoreTarget | |
device | string | A GET /devices id of the same store. Exactly one of device and size is required. |
size | GenerationSize | |
orientation | Orientation | Default: from size (wider than tall is landscape), else portrait (the feature graphic: landscape). Must agree with the size and the device. |
apprequired | object | |
app.namerequired | string | |
app.description | string | Default: "" |
caption | string | The marketing caption. Absent or blank: derived from the screenshot. |
palette | array of PaletteColor | 1–8 colours. Absent: extracted from the screenshot. |
logo | GenerationInput | Your app icon or logo (any shape; PNG, JPEG or WebP). |
metadata | GenerationMetadata | |
projectId | string | Since 1.15.0: put the generation in this project of yours (GET /projects). The project does not change how it is generated.Format: uuid |
styleId | string | Since 1.18.0: a style of yours (GET /styles). It fills palette and logo when you leave them out and adds its background mood, description and caption tone. It is copied into the generation: editing or deleting the style later changes nothing here.Format: uuid |
GenerationList
object
| Field | Type | Description |
|---|---|---|
datarequired | array of Generation | |
nextCursorrequired | stringnullable | Pass as cursor for the next page; null on the last page. |
ScreenshotSetQuote
object
| Field | Type | Description |
|---|---|---|
dryRunrequired | boolean | One of: true |
environmentrequired | ApiKeyEnvironment | |
imagesrequired | integer | |
creditsrequired | integer | What creating this set charges now (1 per image with a live key, 0 with a test key). |
availableCreditsrequired | integer | |
sufficientrequired | boolean | |
screensrequired | integer | |
breakdownrequired | array of object | |
breakdown[].storerequired | StoreTarget | |
breakdown[].devicerequired | string | |
breakdown[].sizerequired | object | |
breakdown[].size.widthrequired | integer | |
breakdown[].size.heightrequired | integer | |
breakdown[].orientationrequired | Orientation | |
breakdown[].imagesrequired | integer | |
breakdown[].defaultedrequired | boolean | The store default (no devices given). |
ScreenshotSet
object
| Field | Type | Description |
|---|---|---|
idrequired | string | Format: uuid |
statusrequired | ScreenshotSetStatus | |
environmentrequired | ApiKeyEnvironment | |
apprequired | object | |
app.namerequired | string | |
app.descriptionrequired | string | |
orientationrequired | Orientation | |
paletterequired | array of PaletteColor | The palette of every image: as requested, or from the style (style.applied contains palette), or extracted. |
paletteSourcerequired | string | auto: extracted from screen 1 when the set was created.One of: "given", "auto" |
logorequired | objectnullable | |
logo.uploadIdrequired | string | Format: uuid |
metadatarequired | object | |
screensrequired | array of object | |
screens[].positionrequired | integer | |
screens[].inputrequired | object | |
screens[].input.uploadIdrequired | string | Format: uuid |
screens[].captionrequired | string | |
storesrequired | array of object | |
stores[].storerequired | StoreTarget | |
stores[].devicesrequired | array of string | |
stores[].featureGraphicrequired | objectnullable | |
stores[].featureGraphic.screenrequired | integer | |
stores[].featureGraphic.captionrequired | string | |
imagesrequired | integer | |
countsrequired | object | |
counts.queuedrequired | integer | |
counts.runningrequired | integer | |
counts.succeededrequired | integer | |
counts.failedrequired | integer | |
counts.canceledrequired | integer | |
creditsChargedrequired | integer | Every image of the set, retries included (0 with a test key). |
creditsRefundedrequired | integer | |
childrenrequired | array of object | The current image of every slot (store, device, screen). Result URLs: GET /generations?screenshotSetId= or the archive. |
children[].positionrequired | integer | The screen (1-based). |
children[].storerequired | StoreTarget | |
children[].devicerequired | string | |
children[].sizerequired | object | |
children[].size.widthrequired | integer | |
children[].size.heightrequired | integer | |
children[].featureGraphicrequired | boolean | |
children[].generationIdrequired | string | Format: uuid |
children[].attemptrequired | integer | |
children[].statusrequired | GenerationStatus | |
children[].errorrequired | objectnullable | |
children[].error.coderequired | string | One of: "GENERATION_FAILED", "GENERATION_TIMEOUT", "NOT_A_SCREENSHOT", "UPLOAD_NOT_READY", "INTERNAL_ERROR" |
children[].error.messagerequired | string | |
archiveUrlrequired | string | |
createdAtrequired | string | RFC 3339 UTC timestamp. |
updatedAtrequired | string | RFC 3339 UTC timestamp. |
finishedAtrequired | stringnullable | RFC 3339 UTC timestamp. |
deletedAtrequired | stringnullable | RFC 3339 UTC timestamp. |
preview | ScreenshotSetPreview | |
source | GenerationSource | Since 1.15.0 (always sent; absent from screenshot_set.completed events): the source of the request that created the set. |
project | ProjectRef | Since 1.15.0 (always sent; absent from screenshot_set.completed events): its project (POST /projects/{id}/items). |
style | StyleRef | Since 1.18.0 (always sent; absent from screenshot_set.completed events): the style (styleId) it was made with; null when none. |
SetUploadRef
object
| Field | Type | Description |
|---|---|---|
uploadIdrequired | string | A ready upload of the same environment (test or live) as the credential.Format: uuid |
ScreenshotSetScreen
object
| Field | Type | Description |
|---|---|---|
inputrequired | SetUploadRef | |
captionrequired | string | Required (1–1000 characters): the same caption is used on every device of this screen. |
ScreenshotSetFeatureGraphic
boolean or object
true: one 1024×500 feature graphic from screen 1 with its caption (+1 image).ScreenshotSetTarget
object
| Field | Type | Description |
|---|---|---|
storerequired | StoreTarget | |
devices | array of string | GET /devices screenshot ids of this store that meet its rules (GET /stores/{store}/requirements). Absent: the store defaults (App Store: app_store_1290x2796 and app_store_1179x2556, the 6.9” and 6.3” iPhone groups Apple asks for; Google Play: google_play_1080x1920). At most one size per device class (for a taller Play phone, google_play_1080x2160 instead of google_play_1080x1920). Pass fewer devices to pay for fewer images. |
featureGraphic | ScreenshotSetFeatureGraphic |
CreateScreenshotSetRequest
object
| Field | Type | Description |
|---|---|---|
apprequired | object | |
app.namerequired | string | |
app.description | string | Default: "" |
screensrequired | array of ScreenshotSetScreen | 1–10 screenshots, in listing order. |
storesrequired | array of ScreenshotSetTarget | |
orientation | Orientation | Of the screenshots (the feature graphic is always landscape).Default: "portrait" |
palette | array of PaletteColor | 1–8 colours. Absent: extracted once from screen 1 and used for every image. |
logo | SetUploadRef | Your app icon or logo, used on every image. |
metadata | GenerationMetadata | |
projectId | string | Since 1.15.0: put the set (and so every image of it, retries included) in this project of yours.Format: uuid |
styleId | string | Since 1.18.0: a style of yours (GET /styles). It fills palette and logo when you leave them out and adds its background mood, description and caption tone to every image. It is copied into the set and its retries: editing or deleting the style later changes nothing here. With ?dryRun=true the style is checked; styles are free, so the quote is the same.Format: uuid |
ScreenshotSetList
object
| Field | Type | Description |
|---|---|---|
datarequired | array of ScreenshotSet | |
nextCursorrequired | stringnullable |
ScreenshotSetRetryResult
object
| Field | Type | Description |
|---|---|---|
createdrequired | array of object | |
created[].generationIdrequired | string | Format: uuid |
created[].positionrequired | integer | |
created[].devicerequired | string | |
created[].attemptrequired | integer | |
skippedrequired | array of object | |
skipped[].generationIdrequired | string | Format: uuid |
skipped[].reasonrequired | string | One of: "superseded", "not_failed", "attempts_exhausted" |
RetriedScreenshotSet
ScreenshotSet & object
| Field | Type | Description |
|---|---|---|
idrequired | string | Format: uuid |
statusrequired | ScreenshotSetStatus | |
environmentrequired | ApiKeyEnvironment | |
apprequired | object | |
app.namerequired | string | |
app.descriptionrequired | string | |
orientationrequired | Orientation | |
paletterequired | array of PaletteColor | The palette of every image: as requested, or from the style (style.applied contains palette), or extracted. |
paletteSourcerequired | string | auto: extracted from screen 1 when the set was created.One of: "given", "auto" |
logorequired | objectnullable | |
logo.uploadIdrequired | string | Format: uuid |
metadatarequired | object | |
screensrequired | array of object | |
screens[].positionrequired | integer | |
screens[].inputrequired | object | |
screens[].input.uploadIdrequired | string | Format: uuid |
screens[].captionrequired | string | |
storesrequired | array of object | |
stores[].storerequired | StoreTarget | |
stores[].devicesrequired | array of string | |
stores[].featureGraphicrequired | objectnullable | |
stores[].featureGraphic.screenrequired | integer | |
stores[].featureGraphic.captionrequired | string | |
imagesrequired | integer | |
countsrequired | object | |
counts.queuedrequired | integer | |
counts.runningrequired | integer | |
counts.succeededrequired | integer | |
counts.failedrequired | integer | |
counts.canceledrequired | integer | |
creditsChargedrequired | integer | Every image of the set, retries included (0 with a test key). |
creditsRefundedrequired | integer | |
childrenrequired | array of object | The current image of every slot (store, device, screen). Result URLs: GET /generations?screenshotSetId= or the archive. |
children[].positionrequired | integer | The screen (1-based). |
children[].storerequired | StoreTarget | |
children[].devicerequired | string | |
children[].sizerequired | object | |
children[].size.widthrequired | integer | |
children[].size.heightrequired | integer | |
children[].featureGraphicrequired | boolean | |
children[].generationIdrequired | string | Format: uuid |
children[].attemptrequired | integer | |
children[].statusrequired | GenerationStatus | |
children[].errorrequired | objectnullable | |
children[].error.coderequired | string | One of: "GENERATION_FAILED", "GENERATION_TIMEOUT", "NOT_A_SCREENSHOT", "UPLOAD_NOT_READY", "INTERNAL_ERROR" |
children[].error.messagerequired | string | |
archiveUrlrequired | string | |
createdAtrequired | string | RFC 3339 UTC timestamp. |
updatedAtrequired | string | RFC 3339 UTC timestamp. |
finishedAtrequired | stringnullable | RFC 3339 UTC timestamp. |
deletedAtrequired | stringnullable | RFC 3339 UTC timestamp. |
preview | ScreenshotSetPreview | |
source | GenerationSource | Since 1.15.0 (always sent; absent from screenshot_set.completed events): the source of the request that created the set. |
project | ProjectRef | Since 1.15.0 (always sent; absent from screenshot_set.completed events): its project (POST /projects/{id}/items). |
style | StyleRef | Since 1.18.0 (always sent; absent from screenshot_set.completed events): the style (styleId) it was made with; null when none. |
retryrequired | ScreenshotSetRetryResult |
RetryScreenshotSetRequest
object
| Field | Type | Description |
|---|---|---|
generationIds | array of string | Images of this set to retry. Absent: every failed or canceled image. |
Project
object
| Field | Type | Description |
|---|---|---|
idrequired | string | Format: uuid |
namerequired | string | |
descriptionrequired | string | |
storerequired | StoreTarget | |
paletterequired | array of PaletteColor | |
logorequired | objectnullable | |
logo.urlrequired | string | Signed URL (expires at expiresAt).Format: uri |
logo.expiresAtrequired | string | RFC 3339 UTC timestamp. |
countsrequired | object | |
counts.generationsrequired | integer | Standalone generations in the project (the images of a set count in it). |
counts.screenshotSetsrequired | integer | |
previewrequired | ScreenshotSetPreview | The most recently finished succeeded image (with a thumbnail) of its generations and sets; null while there is none. |
createdAtrequired | string | RFC 3339 UTC timestamp. |
updatedAtrequired | string | RFC 3339 UTC timestamp. |
CreateProjectRequest
object
| Field | Type | Description |
|---|---|---|
namerequired | string | |
description | string | |
store | StoreTarget | Default google_play. |
palette | array of PaletteColor | |
logo | object | |
logo.uploadIdrequired | string | A ready upload of this account (PNG, JPEG or WebP; either environment). It is copied: deleting the upload later keeps the logo.Format: uuid |
ProjectList
object
| Field | Type | Description |
|---|---|---|
datarequired | array of Project | |
nextCursorrequired | stringnullable | Pass as cursor for the next page; null on the last page. |
UpdateProjectRequest
object
| Field | Type | Description |
|---|---|---|
name | string | |
description | string | |
store | StoreTarget | |
palette | array of PaletteColor | Replaces the palette; [] clears it. |
logo | objectnullable | A new logo, or null to remove it. |
logo.uploadIdrequired | string | A ready upload of this account (PNG, JPEG or WebP; either environment). It is copied: deleting the upload later keeps the logo.Format: uuid |
ProjectItemsAdded
object
| Field | Type | Description |
|---|---|---|
projectIdrequired | string | Format: uuid |
addedrequired | integer | Items newly in this project (moved from another project or from none). |
ProjectItemsRequest
object
| Field | Type | Description |
|---|---|---|
generationIds | array of string | Ids of your standalone generations (an image of a set moves with its set). |
screenshotSetIds | array of string | Ids of your screenshot sets. |
ProjectItemsRemoved
object
| Field | Type | Description |
|---|---|---|
projectIdrequired | string | Format: uuid |
removedrequired | integer | Items that left this project (items in another project are left alone). |
BackgroundMood
string
minimal, light, dark, vibrant, gradient or textured.
One of: "minimal" , "light" , "dark" , "vibrant" , "gradient" , "textured"
CaptionTone
string
professional, friendly, playful, bold or premium. A caption you send is kept word for word; the tone guides its typography and any wording the model writes.
One of: "professional" , "friendly" , "playful" , "bold" , "premium"
Style
object
id as styleId when you create a generation or a screenshot set. It fills the palette and logo you leave out and adds its background mood, description and caption tone; fields you send win. Generations and sets keep a copy of what they used, so editing or deleting the style never changes them or their retries.| Field | Type | Description |
|---|---|---|
idrequired | string | Format: uuid |
namerequired | string | |
paletterequired | array of PaletteColor | |
logorequired | objectnullable | |
logo.urlrequired | string | Signed URL (expires at expiresAt).Format: uri |
logo.expiresAtrequired | string | RFC 3339 UTC timestamp. |
backgroundMoodrequired | BackgroundMood | |
backgroundPromptrequired | stringnullable | |
captionTonerequired | CaptionTone | |
referenceGenerationIdrequired | stringnullable | The generation the values were copied from, if any (provenance only).Format: uuid |
createdAtrequired | string | RFC 3339 UTC timestamp. |
updatedAtrequired | string | RFC 3339 UTC timestamp. |
CreateStyleRequest
object
| Field | Type | Description |
|---|---|---|
namerequired | string | |
palette | array of PaletteColor | 1–8 colours. |
logo | object | |
logo.uploadIdrequired | string | A ready upload of this account (PNG, JPEG or WebP, at most 5 MB and 4096 × 4096 pixels; either environment). It is copied: deleting the upload later keeps the logo.Format: uuid |
backgroundMood | BackgroundMood & string | |
backgroundPrompt | string | At most 200 characters on one line: what the background looks like. It is passed to the model as a quoted description of the look, never as instructions. |
captionTone | CaptionTone & string | |
referenceGenerationId | string | A succeeded generation of yours: its colours (and, when it was made with a style, that style’s background and caption choices) are copied into the fields you leave out, once. Its image and logo are not used.Format: uuid |
StyleList
object
| Field | Type | Description |
|---|---|---|
datarequired | array of Style | |
nextCursorrequired | stringnullable | Pass as cursor for the next page; null on the last page. |
UpdateStyleRequest
object
| Field | Type | Description |
|---|---|---|
name | string | |
palette | array of PaletteColor | Replaces the palette; [] clears it. |
logo | objectnullable | A new logo, or null to remove it. |
logo.uploadIdrequired | string | A ready upload of this account (PNG, JPEG or WebP, at most 5 MB and 4096 × 4096 pixels; either environment). It is copied: deleting the upload later keeps the logo.Format: uuid |
backgroundMood | BackgroundMood | null clears it. |
backgroundPrompt | stringnullable | At most 200 characters on one line; null clears it. |
captionTone | CaptionTone | null clears it. |
referenceGenerationId | stringnullable | Copy from this generation again (into the fields you leave out), or null to forget where the values came from (the values stay).Format: uuid |
ExtractedColor
object
| Field | Type | Description |
|---|---|---|
hexrequired | string | Uppercase #RRGGBB. |
namerequired | string | Nearest named colour. |
inputIndex | integer | dominant only: index in inputs of the image this colour came from. |
Palette
object
| Field | Type | Description |
|---|---|---|
moderequired | string | One of: "extract", "dominant" |
sourcerequired | string | default: no colour could be extracted, so colors is the Storeshot default palette.One of: "extracted", "default" |
colorsrequired | array of ExtractedColor |
PaletteInput
object
CreatePaletteRequest
object
| Field | Type | Description |
|---|---|---|
inputsrequired | array of PaletteInput | extract: exactly one image. dominant: 1–10 images. At most 3 URL inputs. |
mode | string | extract: up to maxColors distinct colours of one image (the Storeshot app’s palette). dominant: the dominant colour of each image.One of: "extract", "dominant"Default: "extract" |
maxColors | integer | extract only: 1–10, default 5. |
StoreSummary
object
| Field | Type | Description |
|---|---|---|
idrequired | StoreTarget | |
namerequired | string | |
requirementsUrlrequired | string |
StoreList
object
| Field | Type | Description |
|---|---|---|
datarequired | array of StoreSummary |
StoreRuleIssue
string
One of: "size_not_accepted" , "edge_below_min" , "edge_above_max" , "aspect_ratio_exceeds_2_1" , "aspect_ratio_not_exact"
StoreDeviceClass
object
| Field | Type | Description |
|---|---|---|
idrequired | string | |
familyrequired | string | One of: "iphone", "ipad", "watch", "phone", "tablet", "chromebook", "xr" |
labelrequired | string | |
requirementrequired | string | conditional: named by a requiredGroups entry (one of its classes is needed when its condition holds); optional: never needed.One of: "required", "conditional", "optional" |
countrequired | object | Screenshots per locale when this class is provided. |
count.minrequired | integer | |
count.maxrequired | integer | |
maxFileBytesrequired | integernullable | Per-class file limit; null when the store publishes none. |
acceptedSizesrequired | array of objectnullable | App Store: every accepted pixel size (both orientations). Null when rules apply. |
acceptedSizes[].widthrequired | integer | |
acceptedSizes[].heightrequired | integer | |
rulesrequired | objectnullable | Google Play: dimension rules. Null when acceptedSizes apply. |
rules.minEdgerequired | integer | Shorter side, at least. |
rules.maxEdgerequired | integernullable | Longer side, at most (null: no published maximum). |
rules.maxAspectRatiorequired | number | Longer side ÷ shorter side, at most. |
rules.exactAspectRatiorequired | stringnullable | long:short the image must match exactly, or null. |
rules.recommendedAspectRatiosrequired | array of string | Advisory (store promotion), not enforced. |
sourcesrequired | array of string | |
devicesrequired | array of object | GET /devices sizes of this class. compliant: false lists the hard store rules the size breaks (in portrait or landscape). A deprecated size (deprecated: true) names its replacedBy. |
devices[].idrequired | string | |
devices[].compliantrequired | boolean | |
devices[].issuesrequired | array of StoreRuleIssue | |
devices[].deprecated | boolean | true: still accepted (same output size) so existing requests keep working, but it breaks a store rule or is superseded. Never a default. Use replacedBy. Absent otherwise. |
devices[].replacedBy | string | Deprecated devices only: the GET /devices id to use instead. |
StoreRequirements
object
sources (checked on checkedOn). Stores change their rules; treat this as guidance.| Field | Type | Description |
|---|---|---|
storerequired | StoreTarget | |
namerequired | string | |
screenshotsrequired | object | |
screenshots.formatsrequired | array of string | |
screenshots.alpharequired | boolean | false: no transparency (no alpha channel). |
screenshots.maxFileBytesrequired | integernullable | Null when the store publishes no limit (see a class’s own maxFileBytes). |
screenshots.countrequired | object | |
screenshots.count.minTotalrequired | integer | Across all classes. |
screenshots.count.maxPerDeviceClassrequired | integer | |
screenshots.sourcesrequired | array of string | |
deviceClassesrequired | array of StoreDeviceClass | |
requiredGroupsrequired | array of object | |
requiredGroups[].whenrequired | string | |
requiredGroups[].anyOfrequired | array of string | Provide at least one of these classes. |
requiredGroups[].sourcesrequired | array of string | |
featureGraphicrequired | objectnullable | Google Play only. |
featureGraphic.widthrequired | integer | |
featureGraphic.heightrequired | integer | |
featureGraphic.formatsrequired | array of string | |
featureGraphic.alpharequired | boolean | |
featureGraphic.maxFileBytesrequired | integernullable | |
featureGraphic.requiredrequired | boolean | |
featureGraphic.sourcesrequired | array of string | |
featureGraphic.devicerequired | string | |
sourcesrequired | array of object | |
sources[].idrequired | string | One of: "apple_screenshot_specs", "play_preview_assets" |
sources[].titlerequired | string | |
sources[].urlrequired | string | Format: uri |
sources[].checkedOnrequired | string | Date the facts were last checked (UTC). |
WebhookEventType
string
generation.succeeded; generation.failed (a generation ended failed or canceled: see data.status); screenshot_set.completed (a set reached a final status, again after a retry); credits.low (live only: the balance fell below creditsLowThreshold). webhook.test is sent on demand by POST /webhooks/{id}/test and needs no subscription.
One of: "generation.succeeded" , "generation.failed" , "screenshot_set.completed" , "credits.low"
Webhook
object
| Field | Type | Description |
|---|---|---|
idrequired | string | Format: uuid |
environmentrequired | ApiKeyEnvironment | |
urlrequired | string | Masked: scheme, host and the last 4 characters of the path. |
eventsrequired | array of WebhookEventType | |
descriptionrequired | string | |
enabledrequired | boolean | |
creditsLowThresholdrequired | integer | |
secretrequired | object | |
secret.hintrequired | string | The last 4 characters. |
secret.rotatedAtrequired | stringnullable | RFC 3339 UTC timestamp. |
secret.previousExpiresAtrequired | stringnullable | Until then deliveries are also signed with the previous secret. |
createdAtrequired | string | RFC 3339 UTC timestamp. |
updatedAtrequired | string | RFC 3339 UTC timestamp. |
WebhookWithSecret
Webhook & object
| Field | Type | Description |
|---|---|---|
idrequired | string | Format: uuid |
environmentrequired | ApiKeyEnvironment | |
urlrequired | string | Masked: scheme, host and the last 4 characters of the path. |
eventsrequired | array of WebhookEventType | |
descriptionrequired | string | |
enabledrequired | boolean | |
creditsLowThresholdrequired | integer | |
secretrequired | object | |
secret.hintrequired | string | The last 4 characters. |
secret.rotatedAtrequired | stringnullable | RFC 3339 UTC timestamp. |
secret.previousExpiresAtrequired | stringnullable | Until then deliveries are also signed with the previous secret. |
createdAtrequired | string | RFC 3339 UTC timestamp. |
updatedAtrequired | string | RFC 3339 UTC timestamp. |
secretrequired | object | |
secret.hintrequired | string | The last 4 characters. |
secret.rotatedAtrequired | stringnullable | RFC 3339 UTC timestamp. |
secret.previousExpiresAtrequired | stringnullable | Until then deliveries are also signed with the previous secret. |
secret.valuerequired | string | The signing secret (whsec_…). Returned only in this response; store it now. Verify Storeshot-Signature with it. |
CreateWebhookRequest
object
| Field | Type | Description |
|---|---|---|
urlrequired | string | An https:// URL on port 443, without credentials, at most 2048 characters, whose host resolves only to public addresses (checked now and before every delivery). Shown masked afterwards. |
eventsrequired | array of WebhookEventType | The business events to deliver (1–4, unique). |
description | string | Free text, at most 200 characters. |
enabled | boolean | Default true. |
creditsLowThreshold | integer | Default 5. |
environment | ApiKeyEnvironment | Which events the webhook receives: live or test (test-key generations and sets). Default: the API key environment (access tokens: live). An API key can only create webhooks of its own environment. |
WebhookList
object
| Field | Type | Description |
|---|---|---|
datarequired | array of Webhook |
UpdateWebhookRequest
object
| Field | Type | Description |
|---|---|---|
url | string | An https:// URL on port 443, without credentials, at most 2048 characters, whose host resolves only to public addresses (checked now and before every delivery). Shown masked afterwards. |
events | array of WebhookEventType | The business events to deliver (1–4, unique). |
description | string | Free text, at most 200 characters. |
enabled | boolean | |
creditsLowThreshold | integer | credits.low fires when the live balance falls below this many credits (1–10000). |
RotateWebhookSecretRequest
object
| Field | Type | Description |
|---|---|---|
gracePeriodSeconds | integer | How long the previous secret keeps signing deliveries next to the new one (0–604800, default 86400). 0 drops it at once. |
WebhookTestResult
object
| Field | Type | Description |
|---|---|---|
eventIdrequired | string | |
deliveryIdrequired | string | Format: uuid |
WebhookDeliveryStatus
string
pending: queued or retrying. succeeded: a 2xx answer. exhausted: 8 attempts failed. failed: the destination was refused (blocked_destination, invalid_url) or the secret could not be read. canceled: the webhook was disabled before the attempt.
One of: "pending" , "succeeded" , "exhausted" , "failed" , "canceled"
WebhookDelivery
object
| Field | Type | Description |
|---|---|---|
idrequired | string | Format: uuid |
eventIdrequired | string | |
eventTyperequired | string | One of: "generation.succeeded", "generation.failed", "screenshot_set.completed", "credits.low", "webhook.test" |
statusrequired | WebhookDeliveryStatus | |
attemptsrequired | integer | |
nextAttemptAtrequired | stringnullable | When pending: the next attempt is due then (null while one is in flight). |
createdAtrequired | string | RFC 3339 UTC timestamp. |
finishedAtrequired | stringnullable | RFC 3339 UTC timestamp. |
logrequired | array of object | |
log[].attemptrequired | integer | |
log[].atrequired | string | RFC 3339 UTC timestamp. |
log[].latencyMsrequired | integer | |
log[].statusCoderequired | integernullable | |
log[].errorClassrequired | stringnullable | One of: "http_status", "timeout", "connect_failed", "tls_error", "dns_failure", "blocked_destination", "redirect", "invalid_url", "secret_unavailable" |
log[].responseSnippetrequired | stringnullable | First 256 characters of the response body, control characters removed. |
WebhookDeliveryList
object
| Field | Type | Description |
|---|---|---|
datarequired | array of WebhookDelivery | |
nextCursorrequired | stringnullable |
ActivityEntry
object
| Field | Type | Description |
|---|---|---|
idrequired | string | Format: uuid |
typerequired | string | api_key.created, api_key.revoked, credits.granted, credits.removed, webhook.created, webhook.updated, webhook.deleted, webhook.secret_rotated, webhook.test_sent, console.signed_in, console.sessions_revoked. New types may be added. |
createdAtrequired | string | RFC 3339 UTC timestamp. |
actorrequired | object | |
actor.typerequired | string | user: you (console or access token); api_key: one of your keys; system: Storeshot (payments, plan renewals).One of: "user", "api_key", "system" |
actor.apiKeyIdrequired | stringnullable | Format: uuid |
actor.apiKeyPrefixrequired | stringnullable | |
targetrequired | objectnullable | What changed (api_key, webhook, polar_order, …). |
target.typerequired | string | |
target.idrequired | string | |
detailsrequired | object | Type-specific, never secret: key name/prefix/environment, credits/bucket/reason, webhook host/events/changed fields, sign-in method. |
requestIdrequired | stringnullable | The X-Request-Id of the request that made the change (null for Storeshot). |
ActivityList
object
| Field | Type | Description |
|---|---|---|
datarequired | array of ActivityEntry | |
nextCursorrequired | stringnullable | Pass as cursor for the next page; null on the last page. |
ActivityFamily
string
api_key, credits, webhook, console).
One of: "api_key" , "credits" , "webhook" , "console"
BillingPack
object
| Field | Type | Description |
|---|---|---|
idrequired | string | Pack id to send as pack. |
namerequired | string | |
creditsrequired | integer | Purchased credits (never expire). |
priceAmountrequired | integer | List price in minor units (cents). Taxes are applied at checkout. |
currencyrequired | string | ISO 4217, lowercase. |
BillingPackList
object
| Field | Type | Description |
|---|---|---|
datarequired | array of BillingPack |
BillingCheckout
object
| Field | Type | Description |
|---|---|---|
idrequired | string | Format: uuid |
statusrequired | string | open (send the buyer to url), processing (payment confirmed, credits on the way), paid (credits granted), partially_refunded, refunded, expired (not paid in time) or failed.One of: "open", "processing", "paid", "partially_refunded", "refunded", "expired", "failed" |
packrequired | string | |
creditsrequired | integer | |
priceAmountrequired | integer | Minor units (cents). |
currencyrequired | string | |
urlrequired | stringnullable | Hosted checkout page (Polar). Null unless status is open.Format: uri |
expiresAtrequired | stringnullable | Format: date-time |
createdAtrequired | string | Format: date-time |
paidAtrequired | stringnullable | Format: date-time |
creditsGrantedrequired | integer | Credits added to purchased. |
creditsReversedrequired | integer | Credits taken back after a refund (spent credits are not taken twice). |
kind | string | SS-012: present (subscription) only on plan checkouts; then pack and plan hold the plan id and the credits are the monthly allotment, added to subscription. Absent on pack checkouts.One of: "subscription" |
plan | string | SS-012: the plan of a plan checkout (absent on pack checkouts).One of: "pro", "agency", "scale" |
planName | string | SS-013: the plan name, on GET /billing/checkouts/{id} of a plan checkout only (absent on pack checkouts). |
subscriptionStatus | stringnullable | SS-013: the payment provider’s status of the subscription this plan checkout created (active, trialing, past_due, canceled, …), or null while none is linked yet. Only on GET /billing/checkouts/{id} of a plan checkout. |
CreateBillingCheckoutRequest
object
| Field | Type | Description |
|---|---|---|
packrequired | string | |
successUrl | string | Where the buyer lands after paying. Default: a static confirmation page. https:// on storeshot.art, a storeshot.art subdomain or this API host; at most 2048 characters.Format: uri |
returnUrl | string | Where “back” on the checkout page leads. Default: the credits page. https:// on storeshot.art, a storeshot.art subdomain or this API host; at most 2048 characters.Format: uri |
BillingPlanLimits
object
| Field | Type | Description |
|---|---|---|
requestsPerMinutePerKeyrequired | integer | |
requestsPerMinutePerUserrequired | integer | |
concurrentGenerationsrequired | integer | |
dailyGenerationsrequired | integer | Credits per UTC day. |
maxStoredUploadsrequired | integer | |
maxStoredUploadMegabytesrequired | integer |
BillingPlan
object
| Field | Type | Description |
|---|---|---|
idrequired | string | Plan id to send as plan.One of: "pro", "agency", "scale" |
namerequired | string | |
creditsrequired | integer | Credits added to subscription each paid month. They are used before any other credits and expire (reset) at renewal; pack credits never expire. |
priceAmountrequired | integer | Monthly list price in minor units (cents). Taxes are applied at checkout. |
currencyrequired | string | ISO 4217, lowercase. |
intervalrequired | string | One of: "month" |
limitsrequired | BillingPlanLimits |
BillingPlanList
object
| Field | Type | Description |
|---|---|---|
datarequired | array of BillingPlan |
BillingSubscription
object
| Field | Type | Description |
|---|---|---|
idrequired | string | Format: uuid |
planrequired | stringnullable | Null when the subscription moved to a product that is not a Storeshot plan.One of: "pro", "agency", "scale" |
statusrequired | string | The payment provider status: active, trialing, past_due, incomplete, incomplete_expired, unpaid, paused or canceled. |
cancelAtPeriodEndrequired | boolean | |
currentPeriodStartrequired | stringnullable | Format: date-time |
currentPeriodEndrequired | stringnullable | Format: date-time |
pendingPlanrequired | stringnullable | A downgrade that takes effect at the next renewal.One of: "pro", "agency", "scale" |
creditsPerPeriodrequired | integer | |
subscriptionCreditsrequired | integer | The subscription balance now (expires at renewal). |
BillingSubscriptionState
object
| Field | Type | Description |
|---|---|---|
planrequired | string | The tier whose limits apply now. A plan applies while its subscription is active (until one day after the period end) or past due (three days after the period end).One of: "free", "pro", "agency", "scale" |
limitsrequired | BillingPlanLimits | |
subscriptionrequired | BillingSubscription |
CreateSubscriptionCheckoutRequest
object
| Field | Type | Description |
|---|---|---|
planrequired | string | One of: "pro", "agency", "scale" |
successUrl | string | Where the buyer lands after paying. Default: a static confirmation page. https:// on storeshot.art, a storeshot.art subdomain or this API host; at most 2048 characters.Format: uri |
returnUrl | string | Where “back” on the checkout page leads. Default: the credits page. https:// on storeshot.art, a storeshot.art subdomain or this API host; at most 2048 characters.Format: uri |
ChangeSubscriptionRequest
object
| Field | Type | Description |
|---|---|---|
planrequired | string | One of: "pro", "agency", "scale" |
BillingPortalSession
object
| Field | Type | Description |
|---|---|---|
urlrequired | string | Open it in the browser of the account owner.Format: uri |
expiresAtrequired | stringnullable | When a session link stops working; null for email_login.Format: date-time |
moderequired | string | session: signed in as this account. email_login: the provider asks for the billing email and sends a one-time code.One of: "session", "email_login" |
CreatePortalSessionRequest
object
| Field | Type | Description |
|---|---|---|
returnUrl | string | Where “back” in the portal leads. Default: the credits page. https:// on storeshot.art, a storeshot.art subdomain or this API host; at most 2048 characters.Format: uri |