Docs menu

Schemas

The 117 objects of the StoreShot API 1.18.0 contract.

View as Markdown

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

FieldTypeDescription
hexrequiredstring
namerequiredstring

WebhookGenerationData

object

The Generation at the time of the event, without download URLs.
FieldTypeDescription
idrequiredstringFormat: uuid
statusrequiredGenerationStatus
environmentrequiredApiKeyEnvironment
inputsrequiredarray of object
inputs[].uploadIdrequiredstringFormat: uuid
inputs[].sourceUrlrequiredstringnullableFor a URL input: origin and path of the URL (it was imported as uploadId).
storerequiredStoreTarget
devicerequiredstringCatalogue id of the size.
sizerequiredobject
size.widthrequiredinteger
size.heightrequiredinteger
orientationrequiredOrientation
apprequiredobject
app.namerequiredstring
app.descriptionrequiredstring
captionrequiredstringnullableAs requested; null = derive.
paletterequiredarray of PaletteColornullableAs requested, or from the style (style.applied contains palette); null = extract from the screenshot.
logorequiredobjectnullable
logo.uploadIdrequiredstringFormat: uuid
metadatarequiredobject
creditsChargedrequiredinteger1 for live keys, 0 for test keys.
creditsRefundedrequiredintegerRefunded when the generation failed or was canceled before it started.
resultrequiredobjectnullableAs in GET /generations/{id} but without URLs (they expire): fetch the generation for fresh ones.
result.imagerequiredobject
result.image.contentTyperequiredstringPNG; JPEG for the Google Play feature graphic.One of: "image/png", "image/jpeg"
result.image.widthrequiredinteger
result.image.heightrequiredinteger
result.thumbnailrequiredobjectnullable
result.thumbnail.contentTyperequiredstringOne of: "image/webp"
result.captionrequiredstringThe caption used: yours, or the one derived from the screenshot (may be empty).
result.paletterequiredarray of PaletteColorThe colours used.
errorrequiredobjectnullableOnly when failed. See /v1/docs/errors for each code.
error.coderequiredstringOne of: "GENERATION_FAILED", "GENERATION_TIMEOUT", "NOT_A_SCREENSHOT", "UPLOAD_NOT_READY", "INTERNAL_ERROR"
error.messagerequiredstring
createdAtrequiredstringRFC 3339 UTC timestamp.
startedAtrequiredstringnullableRFC 3339 UTC timestamp.
finishedAtrequiredstringnullableRFC 3339 UTC timestamp.
deletedAtrequiredstringnullableSet by DELETE: the result files are gone, this record stays.
screenshotSetobjectPresent only when this generation is an image of a screenshot set (POST /screenshot-sets).
screenshotSet.idrequiredstringFormat: uuid
screenshotSet.positionrequiredintegerThe screen (1-based).
screenshotSet.attemptrequiredinteger2 and up: a retry.

GenerationSucceededEvent

object

FieldTypeDescription
idrequiredstringEvent id (evt_…), identical on every attempt: deduplicate on it.
typerequiredstringOne of: "generation.succeeded"
createdrequiredstringRFC 3339 UTC timestamp.
environmentrequiredApiKeyEnvironment
apiVersionrequiredstring
datarequiredWebhookGenerationData

GenerationFailedEvent

object

FieldTypeDescription
idrequiredstringEvent id (evt_…), identical on every attempt: deduplicate on it.
typerequiredstringOne of: "generation.failed"
createdrequiredstringRFC 3339 UTC timestamp.
environmentrequiredApiKeyEnvironment
apiVersionrequiredstring
datarequiredWebhookGenerationData

ScreenshotSetStatus

string

Computed from the current image of every slot: 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

A thumbnail for lists (since 1.12.0): the most recently finished succeeded image of the current attempts, a device screenshot before the Google Play feature graphic. Only on 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.
FieldTypeDescription
generationIdrequiredstringThe image shown.Format: uuid
storerequiredStoreTarget
devicerequiredstring
thumbnailrequiredobject
thumbnail.urlrequiredstringSigned URL of the 512 px WebP preview (expires at urlsExpireAt).Format: uri
thumbnail.contentTyperequiredstringOne of: "image/webp"
urlsExpireAtrequiredstring15 minutes after this response. Fetch the set again for a fresh URL.

WebhookScreenshotSetData

object

The ScreenshotSet at the time of the event, without source, project and preview.
FieldTypeDescription
idrequiredstringFormat: uuid
statusrequiredScreenshotSetStatus
environmentrequiredApiKeyEnvironment
apprequiredobject
app.namerequiredstring
app.descriptionrequiredstring
orientationrequiredOrientation
paletterequiredarray of PaletteColorThe palette of every image: as requested, or from the style (style.applied contains palette), or extracted.
paletteSourcerequiredstringauto: extracted from screen 1 when the set was created.One of: "given", "auto"
logorequiredobjectnullable
logo.uploadIdrequiredstringFormat: uuid
metadatarequiredobject
screensrequiredarray of object
screens[].positionrequiredinteger
screens[].inputrequiredobject
screens[].input.uploadIdrequiredstringFormat: uuid
screens[].captionrequiredstring
storesrequiredarray of object
stores[].storerequiredStoreTarget
stores[].devicesrequiredarray of string
stores[].featureGraphicrequiredobjectnullable
stores[].featureGraphic.screenrequiredinteger
stores[].featureGraphic.captionrequiredstring
imagesrequiredinteger
countsrequiredobject
counts.queuedrequiredinteger
counts.runningrequiredinteger
counts.succeededrequiredinteger
counts.failedrequiredinteger
counts.canceledrequiredinteger
creditsChargedrequiredintegerEvery image of the set, retries included (0 with a test key).
creditsRefundedrequiredinteger
childrenrequiredarray of objectThe current image of every slot (store, device, screen). Result URLs: GET /generations?screenshotSetId= or the archive.
children[].positionrequiredintegerThe screen (1-based).
children[].storerequiredStoreTarget
children[].devicerequiredstring
children[].sizerequiredobject
children[].size.widthrequiredinteger
children[].size.heightrequiredinteger
children[].featureGraphicrequiredboolean
children[].generationIdrequiredstringFormat: uuid
children[].attemptrequiredinteger
children[].statusrequiredGenerationStatus
children[].errorrequiredobjectnullable
children[].error.coderequiredstringOne of: "GENERATION_FAILED", "GENERATION_TIMEOUT", "NOT_A_SCREENSHOT", "UPLOAD_NOT_READY", "INTERNAL_ERROR"
children[].error.messagerequiredstring
archiveUrlrequiredstring
createdAtrequiredstringRFC 3339 UTC timestamp.
updatedAtrequiredstringRFC 3339 UTC timestamp.
finishedAtrequiredstringnullableRFC 3339 UTC timestamp.
deletedAtrequiredstringnullableRFC 3339 UTC timestamp.
previewScreenshotSetPreview

ScreenshotSetCompletedEvent

object

FieldTypeDescription
idrequiredstringEvent id (evt_…), identical on every attempt: deduplicate on it.
typerequiredstringOne of: "screenshot_set.completed"
createdrequiredstringRFC 3339 UTC timestamp.
environmentrequiredApiKeyEnvironment
apiVersionrequiredstring
datarequiredWebhookScreenshotSetData

CreditsLowEvent

object

FieldTypeDescription
idrequiredstringEvent id (evt_…), identical on every attempt: deduplicate on it.
typerequiredstringOne of: "credits.low"
createdrequiredstringRFC 3339 UTC timestamp.
environmentrequiredApiKeyEnvironment
apiVersionrequiredstring
datarequiredobject
data.balancesrequiredobject
data.balances.starterrequiredinteger
data.balances.subscriptionrequiredinteger
data.balances.purchasedrequiredinteger
data.totalrequiredinteger
data.thresholdrequiredinteger

WebhookTestEvent

object

FieldTypeDescription
idrequiredstringEvent id (evt_…), identical on every attempt: deduplicate on it.
typerequiredstringOne of: "webhook.test"
createdrequiredstringRFC 3339 UTC timestamp.
environmentrequiredApiKeyEnvironment
apiVersionrequiredstring
datarequiredobject
data.webhookIdrequiredstringFormat: uuid
data.messagerequiredstring

CheckStatus

string

One of: "up" , "down" , "not_configured"

HealthReport

object

FieldTypeDescription
statusrequiredstringOne of: "healthy", "degraded"
versionrequiredstringServer release version.
commitrequiredstringDeployed git commit (short SHA).
checksrequiredobject
checks.databaserequiredCheckStatus
checks.redisrequiredCheckStatus

ErrorCode

string

Stable, machine-readable error code. See /v1/docs/errors.

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

FieldTypeDescription
errorrequiredobject
error.coderequiredErrorCode
error.messagerequiredstringHuman-readable message; safe to display.
error.requestIdrequiredstringEquals the X-Request-Id response header.
error.docUrlrequiredstringDocumentation for this error code.Format: uri
error.detailsobjectCode-specific structured details.

DeviceKind

string

One of: "screenshot" , "feature_graphic"

Device

object

FieldTypeDescription
idrequiredstringStable identifier: <store>_<width>x<height>.
storerequiredStoreTarget
kindrequiredDeviceKind
labelrequiredstringDisplay name; may change. Do not parse.
deviceHintrequiredstringExample devices; may change. Do not parse.
widthrequiredintegerPixels. Portrait (canonical) for screenshots; landscape swaps width/height.
heightrequiredintegerPixels.
orientationsrequiredarray of Orientation
deprecatedbooleantrue: 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.
replacedBystringDeprecated devices only: the GET /devices id to use instead.

DeviceList

object

FieldTypeDescription
datarequiredarray of Device

ComponentStatus

string

The worst known component state (unknown only if every component is).

One of: "operational" , "degraded" , "outage" , "unknown"

StatusReport

object

FieldTypeDescription
statusrequiredComponentStatus
updatedAtrequiredstringWhen the state was computed (RFC 3339 UTC).
windowSecondsrequiredintegerThe window judged, in seconds.
componentsrequiredarray of object
components[].idrequiredstringOne of: "api", "generation", "image_provider", "vision_provider"
components[].namerequiredstring
components[].statusrequiredComponentStatusunknown: no recent traffic to judge from, or the state could not be read.

ApiKeyScope

string

Permission an API key carries. Access tokens implicitly hold every scope.

One of: "generations:write" , "generations:read" , "uploads:write" , "usage:read" , "keys:manage" , "billing:read" , "billing:write" , "webhooks:read" , "webhooks:write"

Me

object

FieldTypeDescription
userrequiredobject
user.idrequiredstringFormat: uuid
user.displayNamerequiredstringnullable
user.avatarUrlrequiredstringnullable
user.emailstringOnly when authenticated with an access token.
user.createdAtrequiredstringRFC 3339 UTC timestamp.
credentialrequiredobject
credential.typerequiredstringOne of: "user_token", "api_key"
credential.environmentrequiredApiKeyEnvironment
credential.scopesrequiredarray of ApiKeyScope
credential.apiKeyobjectOnly when authenticated with an API key. Never the secret.
credential.apiKey.idrequiredstringFormat: uuid
credential.apiKey.namerequiredstring
credential.apiKey.prefixrequiredstring
credential.apiKey.expiresAtrequiredstringnullableRFC 3339 UTC timestamp.

ApiKey

object

FieldTypeDescription
idrequiredstringFormat: uuid
namerequiredstring
prefixrequiredstringFirst characters of the key, for display.
environmentrequiredApiKeyEnvironment
scopesrequiredarray of ApiKeyScope
statusrequiredstringOne of: "active", "expired"
createdAtrequiredstringRFC 3339 UTC timestamp.
lastUsedAtrequiredstringnullableRFC 3339 UTC timestamp.
expiresAtrequiredstringnullableRFC 3339 UTC timestamp.

CreatedApiKey

ApiKey & object

FieldTypeDescription
idrequiredstringFormat: uuid
namerequiredstring
prefixrequiredstringFirst characters of the key, for display.
environmentrequiredApiKeyEnvironment
scopesrequiredarray of ApiKeyScope
statusrequiredstringOne of: "active", "expired"
createdAtrequiredstringRFC 3339 UTC timestamp.
lastUsedAtrequiredstringnullableRFC 3339 UTC timestamp.
expiresAtrequiredstringnullableRFC 3339 UTC timestamp.
keyrequiredstringThe full secret. Returned only in this response; store it now.

CreateApiKeyRequest

object

FieldTypeDescription
namerequiredstring1–64 characters after trimming; need not be unique.
environmentrequiredApiKeyEnvironment
scopesarray of ApiKeyScopeDefaults to every scope except keys:manage, billing:read, billing:write, webhooks:read and webhooks:write.
expiresAtstringOptional RFC 3339 expiry, in the future and at most 365 days ahead.Format: date-time

ApiKeyList

object

Non-revoked keys, newest first (at most 100).
FieldTypeDescription
datarequiredarray of ApiKey

DeviceAuthorization

object

FieldTypeDescription
device_coderequiredstringSecret. Send it to POST /auth/device/token; never show it to anyone.
user_coderequiredstringShow it to the human: they confirm it in the console.
verification_urirequiredstringFormat: uri
verification_uri_completerequiredstringThe verification page with the code filled in.Format: uri
expires_inrequiredintegerSeconds until the codes expire.
intervalrequiredintegerSeconds to wait between polls of POST /auth/device/token.

DeviceAuthorizationRequest

object

FieldTypeDescription
client_namestringYour 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).
scopestringSpace-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.
environmentApiKeyEnvironmentEnvironment of the new key. Default live.

DeviceToken

object

FieldTypeDescription
access_tokenrequiredstringThe new API key (ss_live_… or ss_test_…). Returned once: store it now.
token_typerequiredstringOne of: "Bearer"
scoperequiredstringSpace-separated scopes the human approved (may be narrower than requested).
key_idrequiredstringId of the new API key.Format: uuid
environmentrequiredApiKeyEnvironment

DeviceTokenError

object

OAuth 2.0 error body (RFC 6749 §5.2, RFC 8628 §3.5): the one deliberate exception to ErrorEnvelope. X-Request-Id is still in the response headers.
FieldTypeDescription
errorrequiredstringOne of: "authorization_pending", "slow_down", "access_denied", "expired_token", "invalid_grant", "invalid_request", "unsupported_grant_type"
error_descriptionrequiredstring

DeviceTokenRequest

object

FieldTypeDescription
grant_typerequiredstringOne of: "urn:ietf:params:oauth:grant-type:device_code"
device_coderequiredstring

CreditBalances

object

Remaining credits. A caller with no credits reads all zeros.
FieldTypeDescription
balancesrequiredobject
balances.starterrequiredinteger
balances.subscriptionrequiredinteger
balances.purchasedrequiredinteger
totalrequiredintegerSum 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

FieldTypeDescription
generationsrequiredintegerGenerations started in the bucket.
succeededrequiredintegerCompleted.
failedrequiredintegerFailed before any credit was charged.
refundedrequiredintegerCharged, then refunded.
pendingrequiredintegerStill running.
creditsUsedrequiredintegerCredits charged minus credits refunded for these generations. One generation can use several credits.

UsageBucket

UsageCounts & object

FieldTypeDescription
generationsrequiredintegerGenerations started in the bucket.
succeededrequiredintegerCompleted.
failedrequiredintegerFailed before any credit was charged.
refundedrequiredintegerCharged, then refunded.
pendingrequiredintegerStill running.
creditsUsedrequiredintegerCredits charged minus credits refunded for these generations. One generation can use several credits.
keyrequiredstringThe UTC day, API key id or source.

UsageReport

object

Live usage of the whole account (every key and surface; test keys are unbilled and not counted), bucketed by when each generation started. Refunds always count against the generation they belong to.
FieldTypeDescription
fromrequiredstringResolved start (inclusive).
torequiredstringResolved end (exclusive).
groupByrequiredUsageGroupBy
datarequiredarray of UsageBucketBuckets sorted by key.
totalsrequiredUsageCounts

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

From the EXIF-oriented size; square when equal.

One of: "portrait" , "landscape" , "square"

Upload

object

FieldTypeDescription
idrequiredstringFormat: uuid
statusrequiredUploadStatus
sourcerequiredstringHow the file arrived: a multipart upload, a presigned PUT, or a URL import.One of: "multipart", "presign", "url"
environmentrequiredApiKeyEnvironment
contentTyperequiredstringDetected from the file bytes (for a pending presigned upload: the declared type).One of: "image/png", "image/jpeg", "image/webp"
bytesrequiredintegerFile size (declared, while pending).
widthrequiredintegernullablePixels, EXIF-oriented. Null unless ready.
heightrequiredintegernullablePixels, EXIF-oriented. Null unless ready.
orientationrequiredUploadOrientation
sha256requiredstringnullableHex SHA-256 of the file. Null unless ready.
sourceUrlrequiredstringnullableURL imports only: origin and path of the URL you sent (query and fragment are never stored).
expiresAtrequiredstringWhen 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.
createdAtrequiredstringRFC 3339 UTC timestamp.

CreateUploadFromUrl

object

FieldTypeDescription
urlrequiredstringAn https:// URL (port 443, no credentials, at most 2048 characters) that resolves to a public address. Fetched once, server-side.

PresignedUpload

object

FieldTypeDescription
uploadrequiredUpload
uploadUrlrequiredstringPUT the file here, from your server.Format: uri
methodrequiredstringOne of: "PUT"
headersrequiredobjectSend exactly these headers with the PUT (they are signed).
uploadUrlExpiresAtrequiredstring15 minutes after this response.

PresignUploadRequest

object

FieldTypeDescription
contentTyperequiredstringThe type of the file you will PUT: image/png, image/jpeg or image/webp.
bytesrequiredintegerExact size of the file you will PUT, at most 20 MB (20971520).

UploadList

object

Uploads that are not deleted, newest first.
FieldTypeDescription
datarequiredarray of Upload
nextCursorrequiredstringnullablePass as cursor for the next page; null on the last page.

GenerationResult

object

Only when succeeded and not deleted.
FieldTypeDescription
imagerequiredobject
image.urlrequiredstringSigned download URL (expires at urlsExpireAt).Format: uri
image.contentTyperequiredstringPNG; JPEG for the Google Play feature graphic.One of: "image/png", "image/jpeg"
image.widthrequiredinteger
image.heightrequiredinteger
thumbnailrequiredobjectnullableA 512 px preview. Best effort: its URL may return 404.
thumbnail.urlrequiredstringFormat: uri
thumbnail.contentTyperequiredstringOne of: "image/webp"
urlsExpireAtrequiredstring15 minutes after this response. Fetch the generation again for fresh URLs.
captionrequiredstringThe caption used: yours, or the one derived from the screenshot (may be empty).
paletterequiredarray of PaletteColorThe colours used.

GenerationSource

string

Since 1.15.0 (always sent): where the request that created it came from.

One of: "mobile" , "api" , "web" , "mcp" , "cli"

ProjectRef

object

Since 1.15.0 (always sent): its project, directly or through its screenshot set (POST /projects/{id}/items).
FieldTypeDescription
idrequiredstringFormat: uuid
namerequiredstring

StyleField

string

A field a style can supply to a generation or screenshot set.

One of: "palette" , "logo" , "backgroundMood" , "backgroundPrompt" , "captionTone"

StyleRef

object

Since 1.18.0 (always sent): the style (styleId) it was made with, for an image of a screenshot set its set’s; null when none.
FieldTypeDescription
idrequiredstringnullablenull once the style was deleted (the generation keeps what it used).Format: uuid
namerequiredstring
appliedrequiredarray of StyleFieldWhat the style supplied, as it was at creation. Fields you sent yourself are not listed.

Generation

object

FieldTypeDescription
idrequiredstringFormat: uuid
statusrequiredGenerationStatus
environmentrequiredApiKeyEnvironment
inputsrequiredarray of object
inputs[].uploadIdrequiredstringFormat: uuid
inputs[].sourceUrlrequiredstringnullableFor a URL input: origin and path of the URL (it was imported as uploadId).
storerequiredStoreTarget
devicerequiredstringCatalogue id of the size.
sizerequiredobject
size.widthrequiredinteger
size.heightrequiredinteger
orientationrequiredOrientation
apprequiredobject
app.namerequiredstring
app.descriptionrequiredstring
captionrequiredstringnullableAs requested; null = derive.
paletterequiredarray of PaletteColornullableAs requested, or from the style (style.applied contains palette); null = extract from the screenshot.
logorequiredobjectnullable
logo.uploadIdrequiredstringFormat: uuid
metadatarequiredobject
creditsChargedrequiredinteger1 for live keys, 0 for test keys.
creditsRefundedrequiredintegerRefunded when the generation failed or was canceled before it started.
resultrequiredGenerationResult
errorrequiredobjectnullableOnly when failed. See /v1/docs/errors for each code.
error.coderequiredstringOne of: "GENERATION_FAILED", "GENERATION_TIMEOUT", "NOT_A_SCREENSHOT", "UPLOAD_NOT_READY", "INTERNAL_ERROR"
error.messagerequiredstring
createdAtrequiredstringRFC 3339 UTC timestamp.
startedAtrequiredstringnullableRFC 3339 UTC timestamp.
finishedAtrequiredstringnullableRFC 3339 UTC timestamp.
deletedAtrequiredstringnullableSet by DELETE: the result files are gone, this record stays.
screenshotSetobjectPresent only when this generation is an image of a screenshot set (POST /screenshot-sets).
screenshotSet.idrequiredstringFormat: uuid
screenshotSet.positionrequiredintegerThe screen (1-based).
screenshotSet.attemptrequiredinteger2 and up: a retry.
sourceGenerationSource
clientNamestringnullableSince 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.
requestIdstringnullableSince 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.
projectProjectRef
styleStyleRef

GenerationInput

object

An image: an upload id or an https URL.

GenerationSize

object

Output pixels: a catalogue size of the store (portrait, or swapped for landscape; the Google Play feature graphic is 1024×500 only).
FieldTypeDescription
widthrequiredinteger
heightrequiredinteger

GenerationMetadata

object

Your own labels, echoed back and filterable (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

FieldTypeDescription
inputsrequiredarray of GenerationInputExactly one screenshot in this version.
storerequiredStoreTarget
devicestringA GET /devices id of the same store. Exactly one of device and size is required.
sizeGenerationSize
orientationOrientationDefault: from size (wider than tall is landscape), else portrait (the feature graphic: landscape). Must agree with the size and the device.
apprequiredobject
app.namerequiredstring
app.descriptionstringDefault: ""
captionstringThe marketing caption. Absent or blank: derived from the screenshot.
palettearray of PaletteColor1–8 colours. Absent: extracted from the screenshot.
logoGenerationInputYour app icon or logo (any shape; PNG, JPEG or WebP).
metadataGenerationMetadata
projectIdstringSince 1.15.0: put the generation in this project of yours (GET /projects). The project does not change how it is generated.Format: uuid
styleIdstringSince 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

Generations that are not deleted, newest first.
FieldTypeDescription
datarequiredarray of Generation
nextCursorrequiredstringnullablePass as cursor for the next page; null on the last page.

ScreenshotSetQuote

object

Nothing was created or charged. A quote is not a reservation.
FieldTypeDescription
dryRunrequiredbooleanOne of: true
environmentrequiredApiKeyEnvironment
imagesrequiredinteger
creditsrequiredintegerWhat creating this set charges now (1 per image with a live key, 0 with a test key).
availableCreditsrequiredinteger
sufficientrequiredboolean
screensrequiredinteger
breakdownrequiredarray of object
breakdown[].storerequiredStoreTarget
breakdown[].devicerequiredstring
breakdown[].sizerequiredobject
breakdown[].size.widthrequiredinteger
breakdown[].size.heightrequiredinteger
breakdown[].orientationrequiredOrientation
breakdown[].imagesrequiredinteger
breakdown[].defaultedrequiredbooleanThe store default (no devices given).

ScreenshotSet

object

FieldTypeDescription
idrequiredstringFormat: uuid
statusrequiredScreenshotSetStatus
environmentrequiredApiKeyEnvironment
apprequiredobject
app.namerequiredstring
app.descriptionrequiredstring
orientationrequiredOrientation
paletterequiredarray of PaletteColorThe palette of every image: as requested, or from the style (style.applied contains palette), or extracted.
paletteSourcerequiredstringauto: extracted from screen 1 when the set was created.One of: "given", "auto"
logorequiredobjectnullable
logo.uploadIdrequiredstringFormat: uuid
metadatarequiredobject
screensrequiredarray of object
screens[].positionrequiredinteger
screens[].inputrequiredobject
screens[].input.uploadIdrequiredstringFormat: uuid
screens[].captionrequiredstring
storesrequiredarray of object
stores[].storerequiredStoreTarget
stores[].devicesrequiredarray of string
stores[].featureGraphicrequiredobjectnullable
stores[].featureGraphic.screenrequiredinteger
stores[].featureGraphic.captionrequiredstring
imagesrequiredinteger
countsrequiredobject
counts.queuedrequiredinteger
counts.runningrequiredinteger
counts.succeededrequiredinteger
counts.failedrequiredinteger
counts.canceledrequiredinteger
creditsChargedrequiredintegerEvery image of the set, retries included (0 with a test key).
creditsRefundedrequiredinteger
childrenrequiredarray of objectThe current image of every slot (store, device, screen). Result URLs: GET /generations?screenshotSetId= or the archive.
children[].positionrequiredintegerThe screen (1-based).
children[].storerequiredStoreTarget
children[].devicerequiredstring
children[].sizerequiredobject
children[].size.widthrequiredinteger
children[].size.heightrequiredinteger
children[].featureGraphicrequiredboolean
children[].generationIdrequiredstringFormat: uuid
children[].attemptrequiredinteger
children[].statusrequiredGenerationStatus
children[].errorrequiredobjectnullable
children[].error.coderequiredstringOne of: "GENERATION_FAILED", "GENERATION_TIMEOUT", "NOT_A_SCREENSHOT", "UPLOAD_NOT_READY", "INTERNAL_ERROR"
children[].error.messagerequiredstring
archiveUrlrequiredstring
createdAtrequiredstringRFC 3339 UTC timestamp.
updatedAtrequiredstringRFC 3339 UTC timestamp.
finishedAtrequiredstringnullableRFC 3339 UTC timestamp.
deletedAtrequiredstringnullableRFC 3339 UTC timestamp.
previewScreenshotSetPreview
sourceGenerationSourceSince 1.15.0 (always sent; absent from screenshot_set.completed events): the source of the request that created the set.
projectProjectRefSince 1.15.0 (always sent; absent from screenshot_set.completed events): its project (POST /projects/{id}/items).
styleStyleRefSince 1.18.0 (always sent; absent from screenshot_set.completed events): the style (styleId) it was made with; null when none.

SetUploadRef

object

An upload id (URL inputs are not accepted in sets).
FieldTypeDescription
uploadIdrequiredstringA ready upload of the same environment (test or live) as the credential.Format: uuid

ScreenshotSetScreen

object

FieldTypeDescription
inputrequiredSetUploadRef
captionrequiredstringRequired (1–1000 characters): the same caption is used on every device of this screen.

ScreenshotSetFeatureGraphic

boolean or object

Google Play only. true: one 1024×500 feature graphic from screen 1 with its caption (+1 image).

ScreenshotSetTarget

object

FieldTypeDescription
storerequiredStoreTarget
devicesarray of stringGET /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.
featureGraphicScreenshotSetFeatureGraphic

CreateScreenshotSetRequest

object

FieldTypeDescription
apprequiredobject
app.namerequiredstring
app.descriptionstringDefault: ""
screensrequiredarray of ScreenshotSetScreen1–10 screenshots, in listing order.
storesrequiredarray of ScreenshotSetTarget
orientationOrientationOf the screenshots (the feature graphic is always landscape).Default: "portrait"
palettearray of PaletteColor1–8 colours. Absent: extracted once from screen 1 and used for every image.
logoSetUploadRefYour app icon or logo, used on every image.
metadataGenerationMetadata
projectIdstringSince 1.15.0: put the set (and so every image of it, retries included) in this project of yours.Format: uuid
styleIdstringSince 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

Sets that are not deleted, newest first.
FieldTypeDescription
datarequiredarray of ScreenshotSet
nextCursorrequiredstringnullable

ScreenshotSetRetryResult

object

FieldTypeDescription
createdrequiredarray of object
created[].generationIdrequiredstringFormat: uuid
created[].positionrequiredinteger
created[].devicerequiredstring
created[].attemptrequiredinteger
skippedrequiredarray of object
skipped[].generationIdrequiredstringFormat: uuid
skipped[].reasonrequiredstringOne of: "superseded", "not_failed", "attempts_exhausted"

RetriedScreenshotSet

ScreenshotSet & object

FieldTypeDescription
idrequiredstringFormat: uuid
statusrequiredScreenshotSetStatus
environmentrequiredApiKeyEnvironment
apprequiredobject
app.namerequiredstring
app.descriptionrequiredstring
orientationrequiredOrientation
paletterequiredarray of PaletteColorThe palette of every image: as requested, or from the style (style.applied contains palette), or extracted.
paletteSourcerequiredstringauto: extracted from screen 1 when the set was created.One of: "given", "auto"
logorequiredobjectnullable
logo.uploadIdrequiredstringFormat: uuid
metadatarequiredobject
screensrequiredarray of object
screens[].positionrequiredinteger
screens[].inputrequiredobject
screens[].input.uploadIdrequiredstringFormat: uuid
screens[].captionrequiredstring
storesrequiredarray of object
stores[].storerequiredStoreTarget
stores[].devicesrequiredarray of string
stores[].featureGraphicrequiredobjectnullable
stores[].featureGraphic.screenrequiredinteger
stores[].featureGraphic.captionrequiredstring
imagesrequiredinteger
countsrequiredobject
counts.queuedrequiredinteger
counts.runningrequiredinteger
counts.succeededrequiredinteger
counts.failedrequiredinteger
counts.canceledrequiredinteger
creditsChargedrequiredintegerEvery image of the set, retries included (0 with a test key).
creditsRefundedrequiredinteger
childrenrequiredarray of objectThe current image of every slot (store, device, screen). Result URLs: GET /generations?screenshotSetId= or the archive.
children[].positionrequiredintegerThe screen (1-based).
children[].storerequiredStoreTarget
children[].devicerequiredstring
children[].sizerequiredobject
children[].size.widthrequiredinteger
children[].size.heightrequiredinteger
children[].featureGraphicrequiredboolean
children[].generationIdrequiredstringFormat: uuid
children[].attemptrequiredinteger
children[].statusrequiredGenerationStatus
children[].errorrequiredobjectnullable
children[].error.coderequiredstringOne of: "GENERATION_FAILED", "GENERATION_TIMEOUT", "NOT_A_SCREENSHOT", "UPLOAD_NOT_READY", "INTERNAL_ERROR"
children[].error.messagerequiredstring
archiveUrlrequiredstring
createdAtrequiredstringRFC 3339 UTC timestamp.
updatedAtrequiredstringRFC 3339 UTC timestamp.
finishedAtrequiredstringnullableRFC 3339 UTC timestamp.
deletedAtrequiredstringnullableRFC 3339 UTC timestamp.
previewScreenshotSetPreview
sourceGenerationSourceSince 1.15.0 (always sent; absent from screenshot_set.completed events): the source of the request that created the set.
projectProjectRefSince 1.15.0 (always sent; absent from screenshot_set.completed events): its project (POST /projects/{id}/items).
styleStyleRefSince 1.18.0 (always sent; absent from screenshot_set.completed events): the style (styleId) it was made with; null when none.
retryrequiredScreenshotSetRetryResult

RetryScreenshotSetRequest

object

FieldTypeDescription
generationIdsarray of stringImages of this set to retry. Absent: every failed or canceled image.

Project

object

Groups generations and screenshot sets of one app. Its palette and logo are stored for you; generations do not inherit them (send them in each request).
FieldTypeDescription
idrequiredstringFormat: uuid
namerequiredstring
descriptionrequiredstring
storerequiredStoreTarget
paletterequiredarray of PaletteColor
logorequiredobjectnullable
logo.urlrequiredstringSigned URL (expires at expiresAt).Format: uri
logo.expiresAtrequiredstringRFC 3339 UTC timestamp.
countsrequiredobject
counts.generationsrequiredintegerStandalone generations in the project (the images of a set count in it).
counts.screenshotSetsrequiredinteger
previewrequiredScreenshotSetPreviewThe most recently finished succeeded image (with a thumbnail) of its generations and sets; null while there is none.
createdAtrequiredstringRFC 3339 UTC timestamp.
updatedAtrequiredstringRFC 3339 UTC timestamp.

CreateProjectRequest

object

FieldTypeDescription
namerequiredstring
descriptionstring
storeStoreTargetDefault google_play.
palettearray of PaletteColor
logoobject
logo.uploadIdrequiredstringA 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

Projects, most recently updated first.
FieldTypeDescription
datarequiredarray of Project
nextCursorrequiredstringnullablePass as cursor for the next page; null on the last page.

UpdateProjectRequest

object

FieldTypeDescription
namestring
descriptionstring
storeStoreTarget
palettearray of PaletteColorReplaces the palette; [] clears it.
logoobjectnullableA new logo, or null to remove it.
logo.uploadIdrequiredstringA 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

FieldTypeDescription
projectIdrequiredstringFormat: uuid
addedrequiredintegerItems newly in this project (moved from another project or from none).

ProjectItemsRequest

object

1–100 ids in total. An API key can only use items of its own environment; an access token any.
FieldTypeDescription
generationIdsarray of stringIds of your standalone generations (an image of a set moves with its set).
screenshotSetIdsarray of stringIds of your screenshot sets.

ProjectItemsRemoved

object

FieldTypeDescription
projectIdrequiredstringFormat: uuid
removedrequiredintegerItems that left this project (items in another project are left alone).

BackgroundMood

string

The look of the background: minimal, light, dark, vibrant, gradient or textured.

One of: "minimal" , "light" , "dark" , "vibrant" , "gradient" , "textured"

CaptionTone

string

The voice of the headline: 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

A brand kit: send its 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.
FieldTypeDescription
idrequiredstringFormat: uuid
namerequiredstring
paletterequiredarray of PaletteColor
logorequiredobjectnullable
logo.urlrequiredstringSigned URL (expires at expiresAt).Format: uri
logo.expiresAtrequiredstringRFC 3339 UTC timestamp.
backgroundMoodrequiredBackgroundMood
backgroundPromptrequiredstringnullable
captionTonerequiredCaptionTone
referenceGenerationIdrequiredstringnullableThe generation the values were copied from, if any (provenance only).Format: uuid
createdAtrequiredstringRFC 3339 UTC timestamp.
updatedAtrequiredstringRFC 3339 UTC timestamp.

CreateStyleRequest

object

FieldTypeDescription
namerequiredstring
palettearray of PaletteColor1–8 colours.
logoobject
logo.uploadIdrequiredstringA 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
backgroundMoodBackgroundMood & string
backgroundPromptstringAt 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.
captionToneCaptionTone & string
referenceGenerationIdstringA 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

Styles, most recently updated first.
FieldTypeDescription
datarequiredarray of Style
nextCursorrequiredstringnullablePass as cursor for the next page; null on the last page.

UpdateStyleRequest

object

FieldTypeDescription
namestring
palettearray of PaletteColorReplaces the palette; [] clears it.
logoobjectnullableA new logo, or null to remove it.
logo.uploadIdrequiredstringA 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
backgroundMoodBackgroundMoodnull clears it.
backgroundPromptstringnullableAt most 200 characters on one line; null clears it.
captionToneCaptionTonenull clears it.
referenceGenerationIdstringnullableCopy 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

FieldTypeDescription
hexrequiredstringUppercase #RRGGBB.
namerequiredstringNearest named colour.
inputIndexintegerdominant only: index in inputs of the image this colour came from.

Palette

object

FieldTypeDescription
moderequiredstringOne of: "extract", "dominant"
sourcerequiredstringdefault: no colour could be extracted, so colors is the Storeshot default palette.One of: "extracted", "default"
colorsrequiredarray of ExtractedColor

PaletteInput

object

An image: an upload id or an https URL.

CreatePaletteRequest

object

FieldTypeDescription
inputsrequiredarray of PaletteInputextract: exactly one image. dominant: 1–10 images. At most 3 URL inputs.
modestringextract: 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"
maxColorsintegerextract only: 1–10, default 5.

StoreSummary

object

FieldTypeDescription
idrequiredStoreTarget
namerequiredstring
requirementsUrlrequiredstring

StoreList

object

FieldTypeDescription
datarequiredarray 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

FieldTypeDescription
idrequiredstring
familyrequiredstringOne of: "iphone", "ipad", "watch", "phone", "tablet", "chromebook", "xr"
labelrequiredstring
requirementrequiredstringconditional: named by a requiredGroups entry (one of its classes is needed when its condition holds); optional: never needed.One of: "required", "conditional", "optional"
countrequiredobjectScreenshots per locale when this class is provided.
count.minrequiredinteger
count.maxrequiredinteger
maxFileBytesrequiredintegernullablePer-class file limit; null when the store publishes none.
acceptedSizesrequiredarray of objectnullableApp Store: every accepted pixel size (both orientations). Null when rules apply.
acceptedSizes[].widthrequiredinteger
acceptedSizes[].heightrequiredinteger
rulesrequiredobjectnullableGoogle Play: dimension rules. Null when acceptedSizes apply.
rules.minEdgerequiredintegerShorter side, at least.
rules.maxEdgerequiredintegernullableLonger side, at most (null: no published maximum).
rules.maxAspectRatiorequirednumberLonger side ÷ shorter side, at most.
rules.exactAspectRatiorequiredstringnullablelong:short the image must match exactly, or null.
rules.recommendedAspectRatiosrequiredarray of stringAdvisory (store promotion), not enforced.
sourcesrequiredarray of string
devicesrequiredarray of objectGET /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[].idrequiredstring
devices[].compliantrequiredboolean
devices[].issuesrequiredarray of StoreRuleIssue
devices[].deprecatedbooleantrue: 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[].replacedBystringDeprecated devices only: the GET /devices id to use instead.

StoreRequirements

object

What a store needs from screenshots, from the official pages in sources (checked on checkedOn). Stores change their rules; treat this as guidance.
FieldTypeDescription
storerequiredStoreTarget
namerequiredstring
screenshotsrequiredobject
screenshots.formatsrequiredarray of string
screenshots.alpharequiredbooleanfalse: no transparency (no alpha channel).
screenshots.maxFileBytesrequiredintegernullableNull when the store publishes no limit (see a class’s own maxFileBytes).
screenshots.countrequiredobject
screenshots.count.minTotalrequiredintegerAcross all classes.
screenshots.count.maxPerDeviceClassrequiredinteger
screenshots.sourcesrequiredarray of string
deviceClassesrequiredarray of StoreDeviceClass
requiredGroupsrequiredarray of object
requiredGroups[].whenrequiredstring
requiredGroups[].anyOfrequiredarray of stringProvide at least one of these classes.
requiredGroups[].sourcesrequiredarray of string
featureGraphicrequiredobjectnullableGoogle Play only.
featureGraphic.widthrequiredinteger
featureGraphic.heightrequiredinteger
featureGraphic.formatsrequiredarray of string
featureGraphic.alpharequiredboolean
featureGraphic.maxFileBytesrequiredintegernullable
featureGraphic.requiredrequiredboolean
featureGraphic.sourcesrequiredarray of string
featureGraphic.devicerequiredstring
sourcesrequiredarray of object
sources[].idrequiredstringOne of: "apple_screenshot_specs", "play_preview_assets"
sources[].titlerequiredstring
sources[].urlrequiredstringFormat: uri
sources[].checkedOnrequiredstringDate 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

FieldTypeDescription
idrequiredstringFormat: uuid
environmentrequiredApiKeyEnvironment
urlrequiredstringMasked: scheme, host and the last 4 characters of the path.
eventsrequiredarray of WebhookEventType
descriptionrequiredstring
enabledrequiredboolean
creditsLowThresholdrequiredinteger
secretrequiredobject
secret.hintrequiredstringThe last 4 characters.
secret.rotatedAtrequiredstringnullableRFC 3339 UTC timestamp.
secret.previousExpiresAtrequiredstringnullableUntil then deliveries are also signed with the previous secret.
createdAtrequiredstringRFC 3339 UTC timestamp.
updatedAtrequiredstringRFC 3339 UTC timestamp.

WebhookWithSecret

Webhook & object

FieldTypeDescription
idrequiredstringFormat: uuid
environmentrequiredApiKeyEnvironment
urlrequiredstringMasked: scheme, host and the last 4 characters of the path.
eventsrequiredarray of WebhookEventType
descriptionrequiredstring
enabledrequiredboolean
creditsLowThresholdrequiredinteger
secretrequiredobject
secret.hintrequiredstringThe last 4 characters.
secret.rotatedAtrequiredstringnullableRFC 3339 UTC timestamp.
secret.previousExpiresAtrequiredstringnullableUntil then deliveries are also signed with the previous secret.
createdAtrequiredstringRFC 3339 UTC timestamp.
updatedAtrequiredstringRFC 3339 UTC timestamp.
secretrequiredobject
secret.hintrequiredstringThe last 4 characters.
secret.rotatedAtrequiredstringnullableRFC 3339 UTC timestamp.
secret.previousExpiresAtrequiredstringnullableUntil then deliveries are also signed with the previous secret.
secret.valuerequiredstringThe signing secret (whsec_…). Returned only in this response; store it now. Verify Storeshot-Signature with it.

CreateWebhookRequest

object

FieldTypeDescription
urlrequiredstringAn 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.
eventsrequiredarray of WebhookEventTypeThe business events to deliver (1–4, unique).
descriptionstringFree text, at most 200 characters.
enabledbooleanDefault true.
creditsLowThresholdintegerDefault 5.
environmentApiKeyEnvironmentWhich 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

Webhooks, newest first (at most 10 per environment).
FieldTypeDescription
datarequiredarray of Webhook

UpdateWebhookRequest

object

FieldTypeDescription
urlstringAn 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.
eventsarray of WebhookEventTypeThe business events to deliver (1–4, unique).
descriptionstringFree text, at most 200 characters.
enabledboolean
creditsLowThresholdintegercredits.low fires when the live balance falls below this many credits (1–10000).

RotateWebhookSecretRequest

object

FieldTypeDescription
gracePeriodSecondsintegerHow long the previous secret keeps signing deliveries next to the new one (0–604800, default 86400). 0 drops it at once.

WebhookTestResult

object

FieldTypeDescription
eventIdrequiredstring
deliveryIdrequiredstringFormat: 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

FieldTypeDescription
idrequiredstringFormat: uuid
eventIdrequiredstring
eventTyperequiredstringOne of: "generation.succeeded", "generation.failed", "screenshot_set.completed", "credits.low", "webhook.test"
statusrequiredWebhookDeliveryStatus
attemptsrequiredinteger
nextAttemptAtrequiredstringnullableWhen pending: the next attempt is due then (null while one is in flight).
createdAtrequiredstringRFC 3339 UTC timestamp.
finishedAtrequiredstringnullableRFC 3339 UTC timestamp.
logrequiredarray of object
log[].attemptrequiredinteger
log[].atrequiredstringRFC 3339 UTC timestamp.
log[].latencyMsrequiredinteger
log[].statusCoderequiredintegernullable
log[].errorClassrequiredstringnullableOne of: "http_status", "timeout", "connect_failed", "tls_error", "dns_failure", "blocked_destination", "redirect", "invalid_url", "secret_unavailable"
log[].responseSnippetrequiredstringnullableFirst 256 characters of the response body, control characters removed.

WebhookDeliveryList

object

Deliveries of this webhook, newest first.
FieldTypeDescription
datarequiredarray of WebhookDelivery
nextCursorrequiredstringnullable

ActivityEntry

object

FieldTypeDescription
idrequiredstringFormat: uuid
typerequiredstringapi_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.
createdAtrequiredstringRFC 3339 UTC timestamp.
actorrequiredobject
actor.typerequiredstringuser: you (console or access token); api_key: one of your keys; system: Storeshot (payments, plan renewals).One of: "user", "api_key", "system"
actor.apiKeyIdrequiredstringnullableFormat: uuid
actor.apiKeyPrefixrequiredstringnullable
targetrequiredobjectnullableWhat changed (api_key, webhook, polar_order, …).
target.typerequiredstring
target.idrequiredstring
detailsrequiredobjectType-specific, never secret: key name/prefix/environment, credits/bucket/reason, webhook host/events/changed fields, sign-in method.
requestIdrequiredstringnullableThe X-Request-Id of the request that made the change (null for Storeshot).

ActivityList

object

Account activity, newest first (kept 400 days).
FieldTypeDescription
datarequiredarray of ActivityEntry
nextCursorrequiredstringnullablePass as cursor for the next page; null on the last page.

ActivityFamily

string

Only one family of types (api_key, credits, webhook, console).

One of: "api_key" , "credits" , "webhook" , "console"

BillingPack

object

FieldTypeDescription
idrequiredstringPack id to send as pack.
namerequiredstring
creditsrequiredintegerPurchased credits (never expire).
priceAmountrequiredintegerList price in minor units (cents). Taxes are applied at checkout.
currencyrequiredstringISO 4217, lowercase.

BillingPackList

object

Packs on sale, cheapest first. Empty while web payments are switched off.
FieldTypeDescription
datarequiredarray of BillingPack

BillingCheckout

object

FieldTypeDescription
idrequiredstringFormat: uuid
statusrequiredstringopen (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"
packrequiredstring
creditsrequiredinteger
priceAmountrequiredintegerMinor units (cents).
currencyrequiredstring
urlrequiredstringnullableHosted checkout page (Polar). Null unless status is open.Format: uri
expiresAtrequiredstringnullableFormat: date-time
createdAtrequiredstringFormat: date-time
paidAtrequiredstringnullableFormat: date-time
creditsGrantedrequiredintegerCredits added to purchased.
creditsReversedrequiredintegerCredits taken back after a refund (spent credits are not taken twice).
kindstringSS-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"
planstringSS-012: the plan of a plan checkout (absent on pack checkouts).One of: "pro", "agency", "scale"
planNamestringSS-013: the plan name, on GET /billing/checkouts/{id} of a plan checkout only (absent on pack checkouts).
subscriptionStatusstringnullableSS-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

FieldTypeDescription
packrequiredstring
successUrlstringWhere 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
returnUrlstringWhere “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

The limits that apply on a plan.
FieldTypeDescription
requestsPerMinutePerKeyrequiredinteger
requestsPerMinutePerUserrequiredinteger
concurrentGenerationsrequiredinteger
dailyGenerationsrequiredintegerCredits per UTC day.
maxStoredUploadsrequiredinteger
maxStoredUploadMegabytesrequiredinteger

BillingPlan

object

FieldTypeDescription
idrequiredstringPlan id to send as plan.One of: "pro", "agency", "scale"
namerequiredstring
creditsrequiredintegerCredits added to subscription each paid month. They are used before any other credits and expire (reset) at renewal; pack credits never expire.
priceAmountrequiredintegerMonthly list price in minor units (cents). Taxes are applied at checkout.
currencyrequiredstringISO 4217, lowercase.
intervalrequiredstringOne of: "month"
limitsrequiredBillingPlanLimits

BillingPlanList

object

Plans on sale, cheapest first. Empty while plans are switched off.
FieldTypeDescription
datarequiredarray of BillingPlan

BillingSubscription

object

The latest subscription of the account, or null.
FieldTypeDescription
idrequiredstringFormat: uuid
planrequiredstringnullableNull when the subscription moved to a product that is not a Storeshot plan.One of: "pro", "agency", "scale"
statusrequiredstringThe payment provider status: active, trialing, past_due, incomplete, incomplete_expired, unpaid, paused or canceled.
cancelAtPeriodEndrequiredboolean
currentPeriodStartrequiredstringnullableFormat: date-time
currentPeriodEndrequiredstringnullableFormat: date-time
pendingPlanrequiredstringnullableA downgrade that takes effect at the next renewal.One of: "pro", "agency", "scale"
creditsPerPeriodrequiredinteger
subscriptionCreditsrequiredintegerThe subscription balance now (expires at renewal).

BillingSubscriptionState

object

FieldTypeDescription
planrequiredstringThe 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"
limitsrequiredBillingPlanLimits
subscriptionrequiredBillingSubscription

CreateSubscriptionCheckoutRequest

object

FieldTypeDescription
planrequiredstringOne of: "pro", "agency", "scale"
successUrlstringWhere 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
returnUrlstringWhere “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

FieldTypeDescription
planrequiredstringOne of: "pro", "agency", "scale"

BillingPortalSession

object

FieldTypeDescription
urlrequiredstringOpen it in the browser of the account owner.Format: uri
expiresAtrequiredstringnullableWhen a session link stops working; null for email_login.Format: date-time
moderequiredstringsession: 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

FieldTypeDescription
returnUrlstringWhere “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