Skip to endpoint reference

All 39 operations.

Filter by method, path, summary, or operation ID. Every endpoint has a stable deep link.

Download OpenAPI JSON

Resource

Screenshots

Create, batch, poll, retry, list, deliver, delete, and unlock retained image or PDF captures.

post/v1/screenshot-batches

Queue a screenshot batch

Atomically reserves credits and creates 1–10 independent queued captures with shared options, including fixed A4 PDF. Duplicate URLs remain separate ordered items. PDF has a two-credit base and follows the same incompatible-field and required-brand-removal rules as asynchronous single capture. Each item uses the ordinary capture queue, retry, retention, and settlement lifecycle. Webhooks, customer-storage delivery, templates, schedules, and per-item overrides are not supported. This action also has a five-requests-per-minute limit.

operationId: createScreenshotBatch

Example request
curl -X POST "https://api.capturewell.app/v1/screenshot-batches" \
  -H "Authorization: Bearer $CAPTUREWELL_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
  "urls": [
    "https://example.com",
    "https://example.org"
  ],
  "format": "webp",
  "full_page": true,
  "preset": "desktop"
}'

Request body

application/json required

Queue a screenshot batch request fields
FieldType Requirement Description
urlsarray<string>RequiredPublic HTTP or HTTPS targets in preserved request order. Duplicate URLs create separate captures.items: 1–10
formatpng | jpeg | webp | avif | pdfOptionalNo descriptiondefault: "png"
qualityintegerOptionalShared JPEG, WebP, or AVIF quality. Omit for PDF.range: 1–100
full_pagebooleanOptionalNo descriptiondefault: false
presetdesktop | desktop_hd | laptop | tablet | tablet_landscape | iphone_16 | pixel_10 | social_card | open_graphOptionalNo descriptiondefault: "desktop"
viewportRequestedViewportOptionalNo description
viewport.widthintegerOptionalNo descriptionrange: 320–3840
viewport.heightintegerOptionalNo descriptionrange: 240–2160
device_scale_factornumberOptionalNo descriptionrange: 1–3
delay_msintegerOptionalNo descriptiondefault: 0 · range: 0–10000
timeout_msintegerOptionalNo descriptiondefault: 30000 · range: 1000–60000
wait_untilload | domcontentloaded | networkidle0 | networkidle2OptionalNo descriptiondefault: "networkidle2"
wait_for_selectorstring | nullOptionalNo descriptiondefault: null · length: 0–500
dark_modebooleanOptionalNo descriptiondefault: false
reduced_motionbooleanOptionalNo descriptiondefault: true
remove_brandingbooleanOptionalFor PDF under required Capturewell branding, this must be explicitly true and adds the configured removal credit up front.default: false
watermark_idstring | nullOptionalOwned watermark public ULID shared by every item. Requires remove_branding and enabled watermarking. Omit for PDF.
recipe_idstring | nullOptionalOwned active recipe public ULID shared by every item.
{
  "urls": [
    "https://example.com",
    "https://example.org"
  ],
  "format": "webp",
  "full_page": true,
  "preset": "desktop"
}

Responses

202The complete batch was created and queued.

application/json

Queue a screenshot batch 202 response fields
FieldType Requirement Description
idstringRequiredNo description
statusqueued | processing | completed | completed_with_failures | failedRequiredNo description
totalintegerRequiredNo descriptionrange: 1–10
created_atstring | nullRequiredNo descriptionformat: date-time
countsCaptureBatchCountsRequiredNo description
counts.queuedintegerRequiredNo descriptionrange: 0–∞
counts.processingintegerRequiredNo descriptionrange: 0–∞
counts.completedintegerRequiredNo descriptionrange: 0–∞
counts.failedintegerRequiredNo descriptionrange: 0–∞
counts.deletedintegerRequiredNo descriptionrange: 0–∞
credits_reservedintegerRequiredNo descriptionrange: 0–∞
credits_usedintegerRequiredNo descriptionrange: 0–∞
capturesarray<Capture | DeletedBatchCapture>RequiredNo descriptionitems: 1–10
{
  "id": "01J00000000000000000000010",
  "status": "queued",
  "total": 1,
  "created_at": "2026-07-21T12:00:00Z",
  "counts": {
    "queued": 1,
    "processing": 0,
    "completed": 0,
    "failed": 0,
    "deleted": 0
  },
  "credits_reserved": 1,
  "credits_used": 0,
  "captures": [
    {
      "id": "01J00000000000000000000011",
      "status": "queued",
      "source": "api",
      "target_url": "https://example.com",
      "options": {
        "url": "https://example.com",
        "format": "png",
        "quality": null,
        "full_page": false,
        "preset": "desktop",
        "viewport": {
          "width": 1440,
          "height": 900,
          "device_scale_factor": 1,
          "mobile": false
        },
        "delay_ms": 0,
        "timeout_ms": 30000,
        "wait_until": "networkidle2",
        "wait_for_selector": null,
        "dark_mode": false,
        "reduced_motion": true,
        "remove_branding": false
      },
      "file_url": null,
      "image_url": null,
      "download_url": null,
      "expires_at": "2026-07-22T12:00:00Z",
      "credits_used": 1,
      "watermarked": false,
      "watermark_removal": {
        "eligible": false,
        "credits": 1,
        "removed_at": null
      },
      "recipe": null,
      "webhook": null,
      "external_delivery": null,
      "batch_id": "01J00000000000000000000010",
      "batch_position": 0,
      "created_at": "2026-07-21T12:00:00Z",
      "metadata": null,
      "error": null
    }
  ]
}
401The Bearer key is missing, malformed, revoked, or unknown.

application/json

Queue a screenshot batch 401 response fields
FieldType Requirement Description
errorErrorDetailRequiredNo description
error.codestringRequiredStable error identifier. Renderer error codes are extensible strings rather than a closed enum. Known examples include navigation_failed, renderer_unavailable, watermark_unavailable, recipe_not_configured, recipe_planning_failed, recipe_action_not_found, recipe_action_rejected, and recipe_action_limit.
error.messagestringRequiredNo description
error.retryablebooleanOptionalWhen present, retry automatically only when true.
{
  "error": {
    "code": "unauthenticated",
    "message": "A valid API key is required."
  }
}
422Laravel validation failed. Do not retry unchanged input.

application/json

Queue a screenshot batch 422 response fields
FieldType Requirement Description
messagestringRequiredSummary of the first validation error and any additional error count.
errorsobjectRequiredField names map to one or more validation messages. Nested keys use dot notation.
{
  "message": "The url field is required.",
  "errors": {
    "url": [
      "The url field is required."
    ]
  }
}
429Either an applicable request limit was exceeded or the account lacks enough credits. Authenticated v1 operations default to 60 requests per minute; specific actions may document a lower additional limit. A quota_exceeded response does not include Retry-After and is not rescued synchronously by auto recharge; retry only after the balance has actually increased.
Queue a screenshot batch 429 response headers
Header Type Example Description
X-RateLimit-Limitinteger60Maximum requests in the current window.
X-RateLimit-Remaininginteger37Requests remaining in the current window.
Retry-Afterinteger42Present only when the request limiter, rather than the credit quota, caused the response.
X-RateLimit-Resetinteger1784203242Present when the request limiter supplies a reset timestamp.

application/json

{
  "message": "Too Many Attempts."
}
503The batch was committed but one or more ordinary render jobs could not be dispatched immediately. The response is retryable for status retrieval; queued-capture recovery dispatches stale items automatically. Do not repeat creation unless a second batch is intended.

application/json

Queue a screenshot batch 503 response fields
FieldType Requirement Description
batch_idstringRequiredNo description
errorobjectRequiredNo description
error.codestringRequiredNo description
error.messagestringRequiredNo description
error.retryablebooleanRequiredNo description
{
  "batch_id": "01J00000000000000000000010",
  "error": {
    "code": "batch_dispatch_deferred",
    "message": "The batch was created and its queued captures will be retried automatically.",
    "retryable": true
  }
}
get/v1/screenshot-batches/{captureBatch}

Get a screenshot batch

Returns derived aggregate state and every item in original request order. Poll while queued or processing. Deleted items remain as minimal historical entries without signed file URLs. A batch owned by another account is indistinguishable from a missing batch.

operationId: getScreenshotBatch

Example request
curl -X GET "https://api.capturewell.app/v1/screenshot-batches/01J00000000000000000000010" \
  -H "Authorization: Bearer $CAPTUREWELL_API_KEY" \
  -H "Accept: application/json"

Parameters

Name Location Type Description
captureBatch *pathstringCapture batch ULID.

Responses

200Current batch and ordered item state.

application/json

Get a screenshot batch 200 response fields
FieldType Requirement Description
idstringRequiredNo description
statusqueued | processing | completed | completed_with_failures | failedRequiredNo description
totalintegerRequiredNo descriptionrange: 1–10
created_atstring | nullRequiredNo descriptionformat: date-time
countsCaptureBatchCountsRequiredNo description
counts.queuedintegerRequiredNo descriptionrange: 0–∞
counts.processingintegerRequiredNo descriptionrange: 0–∞
counts.completedintegerRequiredNo descriptionrange: 0–∞
counts.failedintegerRequiredNo descriptionrange: 0–∞
counts.deletedintegerRequiredNo descriptionrange: 0–∞
credits_reservedintegerRequiredNo descriptionrange: 0–∞
credits_usedintegerRequiredNo descriptionrange: 0–∞
capturesarray<Capture | DeletedBatchCapture>RequiredNo descriptionitems: 1–10
{
  "id": "01J00000000000000000000010",
  "status": "queued",
  "total": 1,
  "created_at": "2026-07-21T12:00:00Z",
  "counts": {
    "queued": 1,
    "processing": 0,
    "completed": 0,
    "failed": 0,
    "deleted": 0
  },
  "credits_reserved": 1,
  "credits_used": 0,
  "captures": [
    {
      "id": "01J00000000000000000000011",
      "status": "queued",
      "source": "api",
      "target_url": "https://example.com",
      "options": {
        "url": "https://example.com",
        "format": "png",
        "quality": null,
        "full_page": false,
        "preset": "desktop",
        "viewport": {
          "width": 1440,
          "height": 900,
          "device_scale_factor": 1,
          "mobile": false
        },
        "delay_ms": 0,
        "timeout_ms": 30000,
        "wait_until": "networkidle2",
        "wait_for_selector": null,
        "dark_mode": false,
        "reduced_motion": true,
        "remove_branding": false
      },
      "file_url": null,
      "image_url": null,
      "download_url": null,
      "expires_at": "2026-07-22T12:00:00Z",
      "credits_used": 1,
      "watermarked": false,
      "watermark_removal": {
        "eligible": false,
        "credits": 1,
        "removed_at": null
      },
      "recipe": null,
      "webhook": null,
      "external_delivery": null,
      "batch_id": "01J00000000000000000000010",
      "batch_position": 0,
      "created_at": "2026-07-21T12:00:00Z",
      "metadata": null,
      "error": null
    }
  ]
}
401The Bearer key is missing, malformed, revoked, or unknown.

application/json

Get a screenshot batch 401 response fields
FieldType Requirement Description
errorErrorDetailRequiredNo description
error.codestringRequiredStable error identifier. Renderer error codes are extensible strings rather than a closed enum. Known examples include navigation_failed, renderer_unavailable, watermark_unavailable, recipe_not_configured, recipe_planning_failed, recipe_action_not_found, recipe_action_rejected, and recipe_action_limit.
error.messagestringRequiredNo description
error.retryablebooleanOptionalWhen present, retry automatically only when true.
{
  "error": {
    "code": "unauthenticated",
    "message": "A valid API key is required."
  }
}
404The identifier was not found or is not visible to the authenticated account.

application/json

Get a screenshot batch 404 response fields
FieldType Requirement Description
messagestringRequiredNo description
{
  "message": "Not Found"
}
429An applicable request limit was exceeded. Authenticated v1 operations default to 60 requests per minute; specific actions may document a lower additional limit. Wait for Retry-After before retrying.
Get a screenshot batch 429 response headers
Header Type Example Description
X-RateLimit-Limitinteger60Maximum requests in the current window.
X-RateLimit-Remaininginteger0Requests remaining in the current window.
Retry-Afterinteger42Seconds to wait before another request.
X-RateLimit-Resetinteger1784203242Unix timestamp when the limiter resets.

application/json

Get a screenshot batch 429 response fields
FieldType Requirement Description
messagestringRequiredNo description
{
  "message": "Too Many Attempts."
}
get/v1/screenshots

List screenshots

Returns the authenticated account's captures newest first, 20 per page. A recognized status filters the collection. An unknown status is currently ignored and returns the unfiltered collection.

operationId: listScreenshots

Example request
curl -X GET "https://api.capturewell.app/v1/screenshots?page=1&status=completed" \
  -H "Authorization: Bearer $CAPTUREWELL_API_KEY" \
  -H "Accept: application/json"

Parameters

Name Location Type Description
page queryintegerOne-indexed result page. Collections contain 20 records per page.
status querystringOptional capture status filter. An unknown value is silently ignored rather than rejected.

Responses

200Paginated captures.

application/json

List screenshots 200 response fields
FieldType Requirement Description
current_pageintegerRequiredNo description
first_page_urlstringRequiredNo descriptionformat: uri
frominteger | nullRequiredNo description
last_pageintegerRequiredNo description
last_page_urlstringRequiredNo descriptionformat: uri
linksarray<PaginatorLink>RequiredNo description
next_page_urlstring | nullRequiredNo descriptionformat: uri
pathstringRequiredNo descriptionformat: uri
per_pageintegerRequiredNo description
prev_page_urlstring | nullRequiredNo descriptionformat: uri
tointeger | nullRequiredNo description
totalintegerRequiredNo description
dataarray<Capture>RequiredNo description
{
  "current_page": 1,
  "first_page_url": "https://api.example.com/v1/screenshots?page=1",
  "from": null,
  "last_page": 1,
  "last_page_url": "https://api.example.com/v1/screenshots?page=1",
  "links": [],
  "next_page_url": null,
  "path": "https://api.example.com/v1/screenshots",
  "per_page": 20,
  "prev_page_url": null,
  "to": null,
  "total": 0,
  "data": []
}
401The Bearer key is missing, malformed, revoked, or unknown.

application/json

List screenshots 401 response fields
FieldType Requirement Description
errorErrorDetailRequiredNo description
error.codestringRequiredStable error identifier. Renderer error codes are extensible strings rather than a closed enum. Known examples include navigation_failed, renderer_unavailable, watermark_unavailable, recipe_not_configured, recipe_planning_failed, recipe_action_not_found, recipe_action_rejected, and recipe_action_limit.
error.messagestringRequiredNo description
error.retryablebooleanOptionalWhen present, retry automatically only when true.
{
  "error": {
    "code": "unauthenticated",
    "message": "A valid API key is required."
  }
}
429An applicable request limit was exceeded. Authenticated v1 operations default to 60 requests per minute; specific actions may document a lower additional limit. Wait for Retry-After before retrying.
List screenshots 429 response headers
Header Type Example Description
X-RateLimit-Limitinteger60Maximum requests in the current window.
X-RateLimit-Remaininginteger0Requests remaining in the current window.
Retry-Afterinteger42Seconds to wait before another request.
X-RateLimit-Resetinteger1784203242Unix timestamp when the limiter resets.

application/json

List screenshots 429 response fields
FieldType Requirement Description
messagestringRequiredNo description
{
  "message": "Too Many Attempts."
}
post/v1/screenshots

Create a screenshot synchronously

Creates and renders an image before responding. A standard viewport capture starts at one credit; full-page mode starts at two, higher density tiers add credits, and configured watermark features may add credits. Recipe-assisted captures and format=pdf are async-only; PDF returns 422 with error.code pdf_requires_async before any capture or credit reservation is created. This operation has no idempotency key, so do not blindly replay it after an ambiguous network failure.

operationId: createScreenshot

Example request
curl -X POST "https://api.capturewell.app/v1/screenshots" \
  -H "Authorization: Bearer $CAPTUREWELL_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
  "url": "https://example.com",
  "format": "png",
  "preset": "desktop",
  "full_page": true
}'

Request body

application/json required

Create a screenshot synchronously request fields
FieldType Requirement Description
urlstringRequiredRequired public HTTP or HTTPS URL. Private, loopback, link-local, and reserved targets are rejected.format: uri · length: 0–2048
formatpng | jpeg | webp | avif | pdfOptionalOutput format. PDF is asynchronous-only and produces a fixed portrait A4 document from screen media with backgrounds and zero margins.default: "png"
qualityintegerOptionalJPEG, WebP, or AVIF quality. Those formats default to 82; PNG normalizes quality to null. Omit this field for PDF.range: 1–100
full_pagebooleanOptionalCapture the complete document height. Omit for PDF, which always paginates the full prepared document.default: false
presetdesktop | desktop_hd | laptop | tablet | tablet_landscape | iphone_16 | pixel_10 | social_card | open_graphOptionalNamed viewport preset. The preset continues to supply mobile behavior and default density when viewport dimensions are overridden.default: "desktop"
viewportRequestedViewportOptionalNo description
viewport.widthintegerOptionalNo descriptionrange: 320–3840
viewport.heightintegerOptionalNo descriptionrange: 240–2160
device_scale_factornumberOptionalPixel density. Defaults to the selected preset. Omit for PDF, which uses density 1 while preserving the responsive viewport.range: 1–3
delay_msintegerOptionalAdditional delay after page readiness.default: 0 · range: 0–10000
timeout_msintegerOptionalRenderer navigation timeout.default: 30000 · range: 1000–60000
wait_untilload | domcontentloaded | networkidle0 | networkidle2OptionalBrowser readiness event.default: "networkidle2"
wait_for_selectorstring | nullOptionalOptional CSS selector to await before capture.default: null · length: 0–500
dark_modebooleanOptionalPrefer the dark color scheme.default: false
reduced_motionbooleanOptionalPrefer reduced motion while rendering.default: true
remove_brandingbooleanOptionalRequest clean output at creation time. When image branding is required, PDF requires this field to be explicitly true and charges the configured removal credit up front.default: false
watermark_idstring | nullOptionalOwned watermark public ULID. A non-null value is allowed only when remove_branding is true and watermarking is enabled. Omit for PDF.
recipe_idstring | nullOptionalOwned active recipe public ULID. Recipe capture must be enabled and the asynchronous screenshot endpoint must be used.
{
  "url": "https://example.com",
  "format": "png",
  "preset": "desktop",
  "full_page": true
}

Responses

201The image completed. Signed file, image, and download URLs remain valid until expires_at; clients should trust that field rather than assume a fixed retention duration.

application/json

Create a screenshot synchronously 201 response fields
FieldType Requirement Description
idstringRequiredNo description
batch_idstringOptionalPresent only when this capture belongs to an API batch.
batch_positionintegerOptionalZero-based request order, present only for a batch capture.range: 0–9
statusqueued | processing | completed | failedRequiredNo description
sourceapi | dashboard | template | scheduleRequiredNo description
target_urlstringRequiredNo descriptionformat: uri
optionsCaptureOptionsRequiredNo description
options.urlstringRequiredNo descriptionformat: uri
options.formatpng | jpeg | webp | avif | pdfRequiredPDF options are normalized to quality null, full_page true, and device_scale_factor 1.
options.qualityinteger | nullRequiredAlways null for PNG and PDF.range: 1–100
options.full_pagebooleanRequiredAlways true for PDF.
options.presetdesktop | desktop_hd | laptop | tablet | tablet_landscape | iphone_16 | pixel_10 | social_card | open_graphRequiredNo description
options.viewportCaptureViewportRequiredNo description
options.delay_msintegerRequiredNo description
options.timeout_msintegerRequiredNo description
options.wait_untilload | domcontentloaded | networkidle0 | networkidle2RequiredNo description
options.wait_for_selectorstring | nullRequiredNo description
options.dark_modebooleanRequiredNo description
options.reduced_motionbooleanRequiredNo description
options.remove_brandingbooleanRequiredNo description
options.watermarkCustomWatermarkSnapshotOptionalNo description
file_urlstring | nullRequiredSigned inline URL for any retained completed output, including PDF.format: uri
image_urlstring | nullRequiredSigned inline image URL while a completed image remains retained. This is null for PDF; use file_url for format-neutral clients.format: uri
download_urlstring | nullRequiredSigned attachment URL while a completed file remains retained.format: uri
expires_atstring | nullRequiredConfigured retention expiry. The usual default is 24 hours, but clients must trust this timestamp.format: date-time
credits_usedintegerRequiredNo descriptionrange: 0–∞
watermarkedbooleanRequiredWhether the separate Capturewell watermark is currently present.
watermark_removalWatermarkRemovalRequiredNo description
watermark_removal.eligiblebooleanRequiredNo description
watermark_removal.creditsintegerRequiredNo descriptionrange: 0–∞
watermark_removal.removed_atstring | nullRequiredNo descriptionformat: date-time
recipeCaptureRecipeSummary | nullRequiredNo description
webhookCaptureWebhook | nullRequiredDelivery state when this asynchronous capture requested a webhook; otherwise null. Destination and signing secret are never returned.
external_deliveryCaptureExternalDelivery | nullRequiredCustomer-storage delivery state when a presigned URL was requested; otherwise null. The destination URL is never returned. Delivery is independent of capture success, credits, webhooks, retention, and customer-object deletion.
created_atstring | nullRequiredNo descriptionformat: date-time
metadataCaptureMetadata | nullRequiredNo description
errorCaptureStoredError | nullRequiredNo description
{
  "id": "01J00000000000000000000000",
  "status": "completed",
  "source": "api",
  "target_url": "https://example.com",
  "options": {
    "url": "https://example.com",
    "format": "png",
    "quality": null,
    "full_page": false,
    "preset": "desktop",
    "viewport": {
      "width": 1440,
      "height": 900,
      "device_scale_factor": 1,
      "mobile": false
    },
    "delay_ms": 0,
    "timeout_ms": 30000,
    "wait_until": "networkidle2",
    "wait_for_selector": null,
    "dark_mode": false,
    "reduced_motion": true,
    "remove_branding": false
  },
  "file_url": "https://example.com/captures/01J00000000000000000000000/file?expires=1784203200&signature=fake",
  "image_url": "https://example.com/captures/01J00000000000000000000000/file?expires=1784203200&signature=fake",
  "download_url": "https://example.com/captures/01J00000000000000000000000/download?expires=1784203200&signature=fake",
  "expires_at": "2026-07-17T12:00:00+00:00",
  "credits_used": 1,
  "watermarked": true,
  "watermark_removal": {
    "eligible": true,
    "credits": 1,
    "removed_at": null
  },
  "recipe": null,
  "webhook": null,
  "external_delivery": null,
  "created_at": "2026-07-16T12:00:00+00:00",
  "metadata": {
    "width": 1440,
    "height": 900,
    "format": "png",
    "bytes": 128000,
    "duration_ms": 840
  },
  "error": null
}
401The Bearer key is missing, malformed, revoked, or unknown.

application/json

Create a screenshot synchronously 401 response fields
FieldType Requirement Description
errorErrorDetailRequiredNo description
error.codestringRequiredStable error identifier. Renderer error codes are extensible strings rather than a closed enum. Known examples include navigation_failed, renderer_unavailable, watermark_unavailable, recipe_not_configured, recipe_planning_failed, recipe_action_not_found, recipe_action_rejected, and recipe_action_limit.
error.messagestringRequiredNo description
error.retryablebooleanOptionalWhen present, retry automatically only when true.
{
  "error": {
    "code": "unauthenticated",
    "message": "A valid API key is required."
  }
}
422Validation failed, a synchronous recipe was rejected, or the renderer returned a non-retryable failure.

application/json

{
  "message": "The url field is required.",
  "errors": {
    "url": [
      "The url field is required."
    ]
  }
}
429Either an applicable request limit was exceeded or the account lacks enough credits. Authenticated v1 operations default to 60 requests per minute; specific actions may document a lower additional limit. A quota_exceeded response does not include Retry-After and is not rescued synchronously by auto recharge; retry only after the balance has actually increased.
Create a screenshot synchronously 429 response headers
Header Type Example Description
X-RateLimit-Limitinteger60Maximum requests in the current window.
X-RateLimit-Remaininginteger37Requests remaining in the current window.
Retry-Afterinteger42Present only when the request limiter, rather than the credit quota, caused the response.
X-RateLimit-Resetinteger1784203242Present when the request limiter supplies a reset timestamp.

application/json

{
  "message": "Too Many Attempts."
}
503The synchronous renderer failed with a retryable error. Retry only when error.retryable is true, bearing in mind that screenshot creation has no idempotency key.

application/json

Create a screenshot synchronously 503 response fields
FieldType Requirement Description
idstringRequiredNo description
statusstringRequiredNo description
errorvalueRequiredNo description
error.codestringRequiredStable error identifier. Renderer error codes are extensible strings rather than a closed enum. Known examples include navigation_failed, renderer_unavailable, watermark_unavailable, recipe_not_configured, recipe_planning_failed, recipe_action_not_found, recipe_action_rejected, and recipe_action_limit.
error.messagestringRequiredNo description
error.retryablebooleanRequiredWhen present, retry automatically only when true.
{
  "id": "01J00000000000000000000000",
  "status": "failed",
  "error": {
    "code": "renderer_unavailable",
    "message": "The renderer is currently unavailable.",
    "retryable": true
  }
}
post/v1/screenshots/async

Queue a screenshot

Creates a queued image or fixed A4 PDF and returns immediately. Poll the capture with exponential backoff until status is completed or failed. PDF costs two base credits, uses screen media and background graphics, and requires quality, full_page, device_scale_factor, and watermark_id to be omitted. Queued and processing are non-terminal; completed and failed are terminal. Set webhook to true to snapshot the configured endpoint and signing secret. Optionally provide a short-lived public HTTPS delivery_url that accepts one PUT with Content-Type and Content-Length. Customer-storage delivery is at least once and independent of capture status, credits, webhook delivery, and local result retention.

operationId: createScreenshotAsync

Example request
curl -X POST "https://api.capturewell.app/v1/screenshots/async" \
  -H "Authorization: Bearer $CAPTUREWELL_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
  "url": "https://example.com",
  "format": "pdf",
  "preset": "desktop",
  "recipe_id": "01J00000000000000000000001",
  "remove_branding": true,
  "webhook": true,
  "delivery_url": "https://storage.example.com/captures/result.pdf?signature=replace-me"
}'

Request body

application/json required

Queue a screenshot request fields
FieldType Requirement Description
urlstringRequiredRequired public HTTP or HTTPS URL. Private, loopback, link-local, and reserved targets are rejected.format: uri · length: 0–2048
formatpng | jpeg | webp | avif | pdfOptionalOutput format. PDF is asynchronous-only and produces a fixed portrait A4 document from screen media with backgrounds and zero margins.default: "png"
qualityintegerOptionalJPEG, WebP, or AVIF quality. Those formats default to 82; PNG normalizes quality to null. Omit this field for PDF.range: 1–100
full_pagebooleanOptionalCapture the complete document height. Omit for PDF, which always paginates the full prepared document.default: false
presetdesktop | desktop_hd | laptop | tablet | tablet_landscape | iphone_16 | pixel_10 | social_card | open_graphOptionalNamed viewport preset. The preset continues to supply mobile behavior and default density when viewport dimensions are overridden.default: "desktop"
viewportRequestedViewportOptionalNo description
viewport.widthintegerOptionalNo descriptionrange: 320–3840
viewport.heightintegerOptionalNo descriptionrange: 240–2160
device_scale_factornumberOptionalPixel density. Defaults to the selected preset. Omit for PDF, which uses density 1 while preserving the responsive viewport.range: 1–3
delay_msintegerOptionalAdditional delay after page readiness.default: 0 · range: 0–10000
timeout_msintegerOptionalRenderer navigation timeout.default: 30000 · range: 1000–60000
wait_untilload | domcontentloaded | networkidle0 | networkidle2OptionalBrowser readiness event.default: "networkidle2"
wait_for_selectorstring | nullOptionalOptional CSS selector to await before capture.default: null · length: 0–500
dark_modebooleanOptionalPrefer the dark color scheme.default: false
reduced_motionbooleanOptionalPrefer reduced motion while rendering.default: true
remove_brandingbooleanOptionalRequest clean output at creation time. When image branding is required, PDF requires this field to be explicitly true and charges the configured removal credit up front.default: false
watermark_idstring | nullOptionalOwned watermark public ULID. A non-null value is allowed only when remove_branding is true and watermarking is enabled. Omit for PDF.
recipe_idstring | nullOptionalOwned active recipe public ULID. Recipe capture must be enabled and the asynchronous screenshot endpoint must be used.
webhookbooleanOptionalDeliver a signed terminal event using the endpoint configuration snapshotted when this capture is created. Requires a configured webhook endpoint.default: false
delivery_urlstringOptionalShort-lived public HTTPS presigned URL for one PUT of the final retained capture bytes. It must accept Capturewell's exact Content-Type and Content-Length headers. Credentials, fragments, custom headers, multipart uploads, and private destinations are rejected. The URL and query are encrypted at rest and never returned.format: uri · length: 0–2048
{
  "url": "https://example.com",
  "format": "pdf",
  "preset": "desktop",
  "recipe_id": "01J00000000000000000000001",
  "remove_branding": true,
  "webhook": true,
  "delivery_url": "https://storage.example.com/captures/result.pdf?signature=replace-me"
}

Responses

202The screenshot was queued.

application/json

Queue a screenshot 202 response fields
FieldType Requirement Description
idstringRequiredNo description
batch_idstringOptionalPresent only when this capture belongs to an API batch.
batch_positionintegerOptionalZero-based request order, present only for a batch capture.range: 0–9
statusqueued | processing | completed | failedRequiredNo description
sourceapi | dashboard | template | scheduleRequiredNo description
target_urlstringRequiredNo descriptionformat: uri
optionsCaptureOptionsRequiredNo description
options.urlstringRequiredNo descriptionformat: uri
options.formatpng | jpeg | webp | avif | pdfRequiredPDF options are normalized to quality null, full_page true, and device_scale_factor 1.
options.qualityinteger | nullRequiredAlways null for PNG and PDF.range: 1–100
options.full_pagebooleanRequiredAlways true for PDF.
options.presetdesktop | desktop_hd | laptop | tablet | tablet_landscape | iphone_16 | pixel_10 | social_card | open_graphRequiredNo description
options.viewportCaptureViewportRequiredNo description
options.delay_msintegerRequiredNo description
options.timeout_msintegerRequiredNo description
options.wait_untilload | domcontentloaded | networkidle0 | networkidle2RequiredNo description
options.wait_for_selectorstring | nullRequiredNo description
options.dark_modebooleanRequiredNo description
options.reduced_motionbooleanRequiredNo description
options.remove_brandingbooleanRequiredNo description
options.watermarkCustomWatermarkSnapshotOptionalNo description
file_urlstring | nullRequiredSigned inline URL for any retained completed output, including PDF.format: uri
image_urlstring | nullRequiredSigned inline image URL while a completed image remains retained. This is null for PDF; use file_url for format-neutral clients.format: uri
download_urlstring | nullRequiredSigned attachment URL while a completed file remains retained.format: uri
expires_atstring | nullRequiredConfigured retention expiry. The usual default is 24 hours, but clients must trust this timestamp.format: date-time
credits_usedintegerRequiredNo descriptionrange: 0–∞
watermarkedbooleanRequiredWhether the separate Capturewell watermark is currently present.
watermark_removalWatermarkRemovalRequiredNo description
watermark_removal.eligiblebooleanRequiredNo description
watermark_removal.creditsintegerRequiredNo descriptionrange: 0–∞
watermark_removal.removed_atstring | nullRequiredNo descriptionformat: date-time
recipeCaptureRecipeSummary | nullRequiredNo description
webhookCaptureWebhook | nullRequiredDelivery state when this asynchronous capture requested a webhook; otherwise null. Destination and signing secret are never returned.
external_deliveryCaptureExternalDelivery | nullRequiredCustomer-storage delivery state when a presigned URL was requested; otherwise null. The destination URL is never returned. Delivery is independent of capture success, credits, webhooks, retention, and customer-object deletion.
created_atstring | nullRequiredNo descriptionformat: date-time
metadataCaptureMetadata | nullRequiredNo description
errorCaptureStoredError | nullRequiredNo description
{
  "id": "01J00000000000000000000000",
  "status": "completed",
  "source": "api",
  "target_url": "https://example.com",
  "options": {
    "url": "https://example.com",
    "format": "png",
    "quality": null,
    "full_page": false,
    "preset": "desktop",
    "viewport": {
      "width": 1440,
      "height": 900,
      "device_scale_factor": 1,
      "mobile": false
    },
    "delay_ms": 0,
    "timeout_ms": 30000,
    "wait_until": "networkidle2",
    "wait_for_selector": null,
    "dark_mode": false,
    "reduced_motion": true,
    "remove_branding": false
  },
  "file_url": "https://example.com/captures/01J00000000000000000000000/file?expires=1784203200&signature=fake",
  "image_url": "https://example.com/captures/01J00000000000000000000000/file?expires=1784203200&signature=fake",
  "download_url": "https://example.com/captures/01J00000000000000000000000/download?expires=1784203200&signature=fake",
  "expires_at": "2026-07-17T12:00:00+00:00",
  "credits_used": 1,
  "watermarked": true,
  "watermark_removal": {
    "eligible": true,
    "credits": 1,
    "removed_at": null
  },
  "recipe": null,
  "webhook": null,
  "external_delivery": null,
  "created_at": "2026-07-16T12:00:00+00:00",
  "metadata": {
    "width": 1440,
    "height": 900,
    "format": "png",
    "bytes": 128000,
    "duration_ms": 840
  },
  "error": null
}
401The Bearer key is missing, malformed, revoked, or unknown.

application/json

Queue a screenshot 401 response fields
FieldType Requirement Description
errorErrorDetailRequiredNo description
error.codestringRequiredStable error identifier. Renderer error codes are extensible strings rather than a closed enum. Known examples include navigation_failed, renderer_unavailable, watermark_unavailable, recipe_not_configured, recipe_planning_failed, recipe_action_not_found, recipe_action_rejected, and recipe_action_limit.
error.messagestringRequiredNo description
error.retryablebooleanOptionalWhen present, retry automatically only when true.
{
  "error": {
    "code": "unauthenticated",
    "message": "A valid API key is required."
  }
}
422Laravel validation failed. Do not retry unchanged input.

application/json

Queue a screenshot 422 response fields
FieldType Requirement Description
messagestringRequiredSummary of the first validation error and any additional error count.
errorsobjectRequiredField names map to one or more validation messages. Nested keys use dot notation.
{
  "message": "The url field is required.",
  "errors": {
    "url": [
      "The url field is required."
    ]
  }
}
429Either an applicable request limit was exceeded or the account lacks enough credits. Authenticated v1 operations default to 60 requests per minute; specific actions may document a lower additional limit. A quota_exceeded response does not include Retry-After and is not rescued synchronously by auto recharge; retry only after the balance has actually increased.
Queue a screenshot 429 response headers
Header Type Example Description
X-RateLimit-Limitinteger60Maximum requests in the current window.
X-RateLimit-Remaininginteger37Requests remaining in the current window.
Retry-Afterinteger42Present only when the request limiter, rather than the credit quota, caused the response.
X-RateLimit-Resetinteger1784203242Present when the request limiter supplies a reset timestamp.

application/json

{
  "message": "Too Many Attempts."
}
get/v1/screenshots/{capture}

Get a screenshot

Returns one account-owned capture. Completed, unexpired captures with retained files include signed file and download URLs; image_url is populated only for image formats. Other states and expired captures return null URLs. A capture owned by another account is indistinguishable from a missing capture.

operationId: getScreenshot

Example request
curl -X GET "https://api.capturewell.app/v1/screenshots/01J00000000000000000000000" \
  -H "Authorization: Bearer $CAPTUREWELL_API_KEY" \
  -H "Accept: application/json"

Parameters

Name Location Type Description
capture *pathstringCapture string identifier.

Responses

200Capture details.

application/json

Get a screenshot 200 response fields
FieldType Requirement Description
idstringRequiredNo description
batch_idstringOptionalPresent only when this capture belongs to an API batch.
batch_positionintegerOptionalZero-based request order, present only for a batch capture.range: 0–9
statusqueued | processing | completed | failedRequiredNo description
sourceapi | dashboard | template | scheduleRequiredNo description
target_urlstringRequiredNo descriptionformat: uri
optionsCaptureOptionsRequiredNo description
options.urlstringRequiredNo descriptionformat: uri
options.formatpng | jpeg | webp | avif | pdfRequiredPDF options are normalized to quality null, full_page true, and device_scale_factor 1.
options.qualityinteger | nullRequiredAlways null for PNG and PDF.range: 1–100
options.full_pagebooleanRequiredAlways true for PDF.
options.presetdesktop | desktop_hd | laptop | tablet | tablet_landscape | iphone_16 | pixel_10 | social_card | open_graphRequiredNo description
options.viewportCaptureViewportRequiredNo description
options.delay_msintegerRequiredNo description
options.timeout_msintegerRequiredNo description
options.wait_untilload | domcontentloaded | networkidle0 | networkidle2RequiredNo description
options.wait_for_selectorstring | nullRequiredNo description
options.dark_modebooleanRequiredNo description
options.reduced_motionbooleanRequiredNo description
options.remove_brandingbooleanRequiredNo description
options.watermarkCustomWatermarkSnapshotOptionalNo description
file_urlstring | nullRequiredSigned inline URL for any retained completed output, including PDF.format: uri
image_urlstring | nullRequiredSigned inline image URL while a completed image remains retained. This is null for PDF; use file_url for format-neutral clients.format: uri
download_urlstring | nullRequiredSigned attachment URL while a completed file remains retained.format: uri
expires_atstring | nullRequiredConfigured retention expiry. The usual default is 24 hours, but clients must trust this timestamp.format: date-time
credits_usedintegerRequiredNo descriptionrange: 0–∞
watermarkedbooleanRequiredWhether the separate Capturewell watermark is currently present.
watermark_removalWatermarkRemovalRequiredNo description
watermark_removal.eligiblebooleanRequiredNo description
watermark_removal.creditsintegerRequiredNo descriptionrange: 0–∞
watermark_removal.removed_atstring | nullRequiredNo descriptionformat: date-time
recipeCaptureRecipeSummary | nullRequiredNo description
webhookCaptureWebhook | nullRequiredDelivery state when this asynchronous capture requested a webhook; otherwise null. Destination and signing secret are never returned.
external_deliveryCaptureExternalDelivery | nullRequiredCustomer-storage delivery state when a presigned URL was requested; otherwise null. The destination URL is never returned. Delivery is independent of capture success, credits, webhooks, retention, and customer-object deletion.
created_atstring | nullRequiredNo descriptionformat: date-time
metadataCaptureMetadata | nullRequiredNo description
errorCaptureStoredError | nullRequiredNo description
{
  "id": "01J00000000000000000000000",
  "status": "completed",
  "source": "api",
  "target_url": "https://example.com",
  "options": {
    "url": "https://example.com",
    "format": "png",
    "quality": null,
    "full_page": false,
    "preset": "desktop",
    "viewport": {
      "width": 1440,
      "height": 900,
      "device_scale_factor": 1,
      "mobile": false
    },
    "delay_ms": 0,
    "timeout_ms": 30000,
    "wait_until": "networkidle2",
    "wait_for_selector": null,
    "dark_mode": false,
    "reduced_motion": true,
    "remove_branding": false
  },
  "file_url": "https://example.com/captures/01J00000000000000000000000/file?expires=1784203200&signature=fake",
  "image_url": "https://example.com/captures/01J00000000000000000000000/file?expires=1784203200&signature=fake",
  "download_url": "https://example.com/captures/01J00000000000000000000000/download?expires=1784203200&signature=fake",
  "expires_at": "2026-07-17T12:00:00+00:00",
  "credits_used": 1,
  "watermarked": true,
  "watermark_removal": {
    "eligible": true,
    "credits": 1,
    "removed_at": null
  },
  "recipe": null,
  "webhook": null,
  "external_delivery": null,
  "created_at": "2026-07-16T12:00:00+00:00",
  "metadata": {
    "width": 1440,
    "height": 900,
    "format": "png",
    "bytes": 128000,
    "duration_ms": 840
  },
  "error": null
}
401The Bearer key is missing, malformed, revoked, or unknown.

application/json

Get a screenshot 401 response fields
FieldType Requirement Description
errorErrorDetailRequiredNo description
error.codestringRequiredStable error identifier. Renderer error codes are extensible strings rather than a closed enum. Known examples include navigation_failed, renderer_unavailable, watermark_unavailable, recipe_not_configured, recipe_planning_failed, recipe_action_not_found, recipe_action_rejected, and recipe_action_limit.
error.messagestringRequiredNo description
error.retryablebooleanOptionalWhen present, retry automatically only when true.
{
  "error": {
    "code": "unauthenticated",
    "message": "A valid API key is required."
  }
}
404The identifier was not found or is not visible to the authenticated account.

application/json

Get a screenshot 404 response fields
FieldType Requirement Description
messagestringRequiredNo description
{
  "message": "Not Found"
}
429An applicable request limit was exceeded. Authenticated v1 operations default to 60 requests per minute; specific actions may document a lower additional limit. Wait for Retry-After before retrying.
Get a screenshot 429 response headers
Header Type Example Description
X-RateLimit-Limitinteger60Maximum requests in the current window.
X-RateLimit-Remaininginteger0Requests remaining in the current window.
Retry-Afterinteger42Seconds to wait before another request.
X-RateLimit-Resetinteger1784203242Unix timestamp when the limiter resets.

application/json

Get a screenshot 429 response fields
FieldType Requirement Description
messagestringRequiredNo description
{
  "message": "Too Many Attempts."
}
delete/v1/screenshots/{capture}

Delete a screenshot

Cancels a queued capture or deletes a completed or failed capture and its retained files. Processing captures cannot be deleted. Historical credit usage remains. Retry a storage cleanup failure only when error.retryable is true.

operationId: deleteScreenshot

Example request
curl -X DELETE "https://api.capturewell.app/v1/screenshots/01J00000000000000000000000" \
  -H "Authorization: Bearer $CAPTUREWELL_API_KEY" \
  -H "Accept: application/json"

Parameters

Name Location Type Description
capture *pathstringCapture string identifier.

Responses

204The capture was deleted. The response has no body.
401The Bearer key is missing, malformed, revoked, or unknown.

application/json

Delete a screenshot 401 response fields
FieldType Requirement Description
errorErrorDetailRequiredNo description
error.codestringRequiredStable error identifier. Renderer error codes are extensible strings rather than a closed enum. Known examples include navigation_failed, renderer_unavailable, watermark_unavailable, recipe_not_configured, recipe_planning_failed, recipe_action_not_found, recipe_action_rejected, and recipe_action_limit.
error.messagestringRequiredNo description
error.retryablebooleanOptionalWhen present, retry automatically only when true.
{
  "error": {
    "code": "unauthenticated",
    "message": "A valid API key is required."
  }
}
404The identifier was not found or is not visible to the authenticated account.

application/json

Delete a screenshot 404 response fields
FieldType Requirement Description
messagestringRequiredNo description
{
  "message": "Not Found"
}
409The capture is processing and cannot be deleted.

application/json

Delete a screenshot 409 response fields
FieldType Requirement Description
errorErrorDetailRequiredNo description
error.codestringRequiredStable error identifier. Renderer error codes are extensible strings rather than a closed enum. Known examples include navigation_failed, renderer_unavailable, watermark_unavailable, recipe_not_configured, recipe_planning_failed, recipe_action_not_found, recipe_action_rejected, and recipe_action_limit.
error.messagestringRequiredNo description
error.retryablebooleanOptionalWhen present, retry automatically only when true.
{
  "error": {
    "code": "capture_not_deletable",
    "message": "This capture cannot be deleted while it is processing."
  }
}
429An applicable request limit was exceeded. Authenticated v1 operations default to 60 requests per minute; specific actions may document a lower additional limit. Wait for Retry-After before retrying.
Delete a screenshot 429 response headers
Header Type Example Description
X-RateLimit-Limitinteger60Maximum requests in the current window.
X-RateLimit-Remaininginteger0Requests remaining in the current window.
Retry-Afterinteger42Seconds to wait before another request.
X-RateLimit-Resetinteger1784203242Unix timestamp when the limiter resets.

application/json

Delete a screenshot 429 response fields
FieldType Requirement Description
messagestringRequiredNo description
{
  "message": "Too Many Attempts."
}
503Retained capture storage could not be cleaned up. This response is explicitly retryable.

application/json

Delete a screenshot 503 response fields
FieldType Requirement Description
errorErrorDetailRequiredNo description
error.codestringRequiredStable error identifier. Renderer error codes are extensible strings rather than a closed enum. Known examples include navigation_failed, renderer_unavailable, watermark_unavailable, recipe_not_configured, recipe_planning_failed, recipe_action_not_found, recipe_action_rejected, and recipe_action_limit.
error.messagestringRequiredNo description
error.retryablebooleanOptionalWhen present, retry automatically only when true.
{
  "error": {
    "code": "capture_storage_cleanup_failed",
    "message": "Capture storage cleanup failed.",
    "retryable": true
  }
}
post/v1/screenshots/{capture}/retry

Retry a failed screenshot

Creates a new queued capture from the saved options of an account-owned failed capture. The failed capture remains unchanged, and the new capture reserves credits at current pricing. Repeated calls create separate captures. Webhook and customer-storage delivery requests are not copied.

operationId: retryScreenshot

Example request
curl -X POST "https://api.capturewell.app/v1/screenshots/01J00000000000000000000000/retry" \
  -H "Authorization: Bearer $CAPTUREWELL_API_KEY" \
  -H "Accept: application/json"

Parameters

Name Location Type Description
capture *pathstringCapture string identifier.

Responses

202A new screenshot was queued.

application/json

Retry a failed screenshot 202 response fields
FieldType Requirement Description
idstringRequiredNo description
batch_idstringOptionalPresent only when this capture belongs to an API batch.
batch_positionintegerOptionalZero-based request order, present only for a batch capture.range: 0–9
statusqueued | processing | completed | failedRequiredNo description
sourceapi | dashboard | template | scheduleRequiredNo description
target_urlstringRequiredNo descriptionformat: uri
optionsCaptureOptionsRequiredNo description
options.urlstringRequiredNo descriptionformat: uri
options.formatpng | jpeg | webp | avif | pdfRequiredPDF options are normalized to quality null, full_page true, and device_scale_factor 1.
options.qualityinteger | nullRequiredAlways null for PNG and PDF.range: 1–100
options.full_pagebooleanRequiredAlways true for PDF.
options.presetdesktop | desktop_hd | laptop | tablet | tablet_landscape | iphone_16 | pixel_10 | social_card | open_graphRequiredNo description
options.viewportCaptureViewportRequiredNo description
options.delay_msintegerRequiredNo description
options.timeout_msintegerRequiredNo description
options.wait_untilload | domcontentloaded | networkidle0 | networkidle2RequiredNo description
options.wait_for_selectorstring | nullRequiredNo description
options.dark_modebooleanRequiredNo description
options.reduced_motionbooleanRequiredNo description
options.remove_brandingbooleanRequiredNo description
options.watermarkCustomWatermarkSnapshotOptionalNo description
file_urlstring | nullRequiredSigned inline URL for any retained completed output, including PDF.format: uri
image_urlstring | nullRequiredSigned inline image URL while a completed image remains retained. This is null for PDF; use file_url for format-neutral clients.format: uri
download_urlstring | nullRequiredSigned attachment URL while a completed file remains retained.format: uri
expires_atstring | nullRequiredConfigured retention expiry. The usual default is 24 hours, but clients must trust this timestamp.format: date-time
credits_usedintegerRequiredNo descriptionrange: 0–∞
watermarkedbooleanRequiredWhether the separate Capturewell watermark is currently present.
watermark_removalWatermarkRemovalRequiredNo description
watermark_removal.eligiblebooleanRequiredNo description
watermark_removal.creditsintegerRequiredNo descriptionrange: 0–∞
watermark_removal.removed_atstring | nullRequiredNo descriptionformat: date-time
recipeCaptureRecipeSummary | nullRequiredNo description
webhookCaptureWebhook | nullRequiredDelivery state when this asynchronous capture requested a webhook; otherwise null. Destination and signing secret are never returned.
external_deliveryCaptureExternalDelivery | nullRequiredCustomer-storage delivery state when a presigned URL was requested; otherwise null. The destination URL is never returned. Delivery is independent of capture success, credits, webhooks, retention, and customer-object deletion.
created_atstring | nullRequiredNo descriptionformat: date-time
metadataCaptureMetadata | nullRequiredNo description
errorCaptureStoredError | nullRequiredNo description
{
  "id": "01J00000000000000000000000",
  "status": "completed",
  "source": "api",
  "target_url": "https://example.com",
  "options": {
    "url": "https://example.com",
    "format": "png",
    "quality": null,
    "full_page": false,
    "preset": "desktop",
    "viewport": {
      "width": 1440,
      "height": 900,
      "device_scale_factor": 1,
      "mobile": false
    },
    "delay_ms": 0,
    "timeout_ms": 30000,
    "wait_until": "networkidle2",
    "wait_for_selector": null,
    "dark_mode": false,
    "reduced_motion": true,
    "remove_branding": false
  },
  "file_url": "https://example.com/captures/01J00000000000000000000000/file?expires=1784203200&signature=fake",
  "image_url": "https://example.com/captures/01J00000000000000000000000/file?expires=1784203200&signature=fake",
  "download_url": "https://example.com/captures/01J00000000000000000000000/download?expires=1784203200&signature=fake",
  "expires_at": "2026-07-17T12:00:00+00:00",
  "credits_used": 1,
  "watermarked": true,
  "watermark_removal": {
    "eligible": true,
    "credits": 1,
    "removed_at": null
  },
  "recipe": null,
  "webhook": null,
  "external_delivery": null,
  "created_at": "2026-07-16T12:00:00+00:00",
  "metadata": {
    "width": 1440,
    "height": 900,
    "format": "png",
    "bytes": 128000,
    "duration_ms": 840
  },
  "error": null
}
401The Bearer key is missing, malformed, revoked, or unknown.

application/json

Retry a failed screenshot 401 response fields
FieldType Requirement Description
errorErrorDetailRequiredNo description
error.codestringRequiredStable error identifier. Renderer error codes are extensible strings rather than a closed enum. Known examples include navigation_failed, renderer_unavailable, watermark_unavailable, recipe_not_configured, recipe_planning_failed, recipe_action_not_found, recipe_action_rejected, and recipe_action_limit.
error.messagestringRequiredNo description
error.retryablebooleanOptionalWhen present, retry automatically only when true.
{
  "error": {
    "code": "unauthenticated",
    "message": "A valid API key is required."
  }
}
404The identifier was not found or is not visible to the authenticated account.

application/json

Retry a failed screenshot 404 response fields
FieldType Requirement Description
messagestringRequiredNo description
{
  "message": "Not Found"
}
409The capture is not failed, or its saved watermark or recipe is no longer available under the current account configuration.

application/json

Retry a failed screenshot 409 response fields
FieldType Requirement Description
errorErrorDetailRequiredNo description
error.codestringRequiredStable error identifier. Renderer error codes are extensible strings rather than a closed enum. Known examples include navigation_failed, renderer_unavailable, watermark_unavailable, recipe_not_configured, recipe_planning_failed, recipe_action_not_found, recipe_action_rejected, and recipe_action_limit.
error.messagestringRequiredNo description
error.retryablebooleanOptionalWhen present, retry automatically only when true.
{
  "error": {
    "code": "capture_not_retryable",
    "message": "Only failed captures can be retried."
  }
}
429Either an applicable request limit was exceeded or the account lacks enough credits. Authenticated v1 operations default to 60 requests per minute; specific actions may document a lower additional limit. A quota_exceeded response does not include Retry-After and is not rescued synchronously by auto recharge; retry only after the balance has actually increased.
Retry a failed screenshot 429 response headers
Header Type Example Description
X-RateLimit-Limitinteger60Maximum requests in the current window.
X-RateLimit-Remaininginteger37Requests remaining in the current window.
Retry-Afterinteger42Present only when the request limiter, rather than the credit quota, caused the response.
X-RateLimit-Resetinteger1784203242Present when the request limiter supplies a reset timestamp.

application/json

{
  "message": "Too Many Attempts."
}
post/v1/screenshots/{capture}/delivery

Deliver a retained screenshot to customer storage

Queues a new at-least-once PUT of the current retained capture bytes to a short-lived public HTTPS URL. The capture must be owned, completed, unexpired, present locally, and not already pending delivery. Re-delivery does not re-render, consume credits, extend retention, or delete any customer-owned object. A required Capturewell watermark is included until the clean original has been unlocked.

operationId: deliverScreenshotToCustomerStorage

Example request
curl -X POST "https://api.capturewell.app/v1/screenshots/01J00000000000000000000000/delivery" \
  -H "Authorization: Bearer $CAPTUREWELL_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
  "delivery_url": "https://storage.example.com/captures/result.webp?signature=replace-me"
}'

Parameters

Name Location Type Description
capture *pathstringCapture string identifier.

Request body

application/json required

Deliver a retained screenshot to customer storage request fields
FieldType Requirement Description
delivery_urlstringRequiredReplacement short-lived public HTTPS presigned URL for one PUT of the current retained capture bytes. The value is encrypted at rest and never returned.format: uri · length: 0–2048
{
  "delivery_url": "https://storage.example.com/captures/result.webp?signature=replace-me"
}

Responses

202Customer-storage delivery was queued.

application/json

Deliver a retained screenshot to customer storage 202 response fields
FieldType Requirement Description
idstringRequiredNo description
batch_idstringOptionalPresent only when this capture belongs to an API batch.
batch_positionintegerOptionalZero-based request order, present only for a batch capture.range: 0–9
statusqueued | processing | completed | failedRequiredNo description
sourceapi | dashboard | template | scheduleRequiredNo description
target_urlstringRequiredNo descriptionformat: uri
optionsCaptureOptionsRequiredNo description
options.urlstringRequiredNo descriptionformat: uri
options.formatpng | jpeg | webp | avif | pdfRequiredPDF options are normalized to quality null, full_page true, and device_scale_factor 1.
options.qualityinteger | nullRequiredAlways null for PNG and PDF.range: 1–100
options.full_pagebooleanRequiredAlways true for PDF.
options.presetdesktop | desktop_hd | laptop | tablet | tablet_landscape | iphone_16 | pixel_10 | social_card | open_graphRequiredNo description
options.viewportCaptureViewportRequiredNo description
options.delay_msintegerRequiredNo description
options.timeout_msintegerRequiredNo description
options.wait_untilload | domcontentloaded | networkidle0 | networkidle2RequiredNo description
options.wait_for_selectorstring | nullRequiredNo description
options.dark_modebooleanRequiredNo description
options.reduced_motionbooleanRequiredNo description
options.remove_brandingbooleanRequiredNo description
options.watermarkCustomWatermarkSnapshotOptionalNo description
file_urlstring | nullRequiredSigned inline URL for any retained completed output, including PDF.format: uri
image_urlstring | nullRequiredSigned inline image URL while a completed image remains retained. This is null for PDF; use file_url for format-neutral clients.format: uri
download_urlstring | nullRequiredSigned attachment URL while a completed file remains retained.format: uri
expires_atstring | nullRequiredConfigured retention expiry. The usual default is 24 hours, but clients must trust this timestamp.format: date-time
credits_usedintegerRequiredNo descriptionrange: 0–∞
watermarkedbooleanRequiredWhether the separate Capturewell watermark is currently present.
watermark_removalWatermarkRemovalRequiredNo description
watermark_removal.eligiblebooleanRequiredNo description
watermark_removal.creditsintegerRequiredNo descriptionrange: 0–∞
watermark_removal.removed_atstring | nullRequiredNo descriptionformat: date-time
recipeCaptureRecipeSummary | nullRequiredNo description
webhookCaptureWebhook | nullRequiredDelivery state when this asynchronous capture requested a webhook; otherwise null. Destination and signing secret are never returned.
external_deliveryCaptureExternalDelivery | nullRequiredCustomer-storage delivery state when a presigned URL was requested; otherwise null. The destination URL is never returned. Delivery is independent of capture success, credits, webhooks, retention, and customer-object deletion.
created_atstring | nullRequiredNo descriptionformat: date-time
metadataCaptureMetadata | nullRequiredNo description
errorCaptureStoredError | nullRequiredNo description
{
  "id": "01J00000000000000000000000",
  "status": "completed",
  "source": "api",
  "target_url": "https://example.com",
  "options": {
    "url": "https://example.com",
    "format": "png",
    "quality": null,
    "full_page": false,
    "preset": "desktop",
    "viewport": {
      "width": 1440,
      "height": 900,
      "device_scale_factor": 1,
      "mobile": false
    },
    "delay_ms": 0,
    "timeout_ms": 30000,
    "wait_until": "networkidle2",
    "wait_for_selector": null,
    "dark_mode": false,
    "reduced_motion": true,
    "remove_branding": false
  },
  "file_url": "https://example.com/captures/01J00000000000000000000000/file?expires=1784203200&signature=fake",
  "image_url": "https://example.com/captures/01J00000000000000000000000/file?expires=1784203200&signature=fake",
  "download_url": "https://example.com/captures/01J00000000000000000000000/download?expires=1784203200&signature=fake",
  "expires_at": "2026-07-17T12:00:00+00:00",
  "credits_used": 1,
  "watermarked": true,
  "watermark_removal": {
    "eligible": true,
    "credits": 1,
    "removed_at": null
  },
  "recipe": null,
  "webhook": null,
  "external_delivery": null,
  "created_at": "2026-07-16T12:00:00+00:00",
  "metadata": {
    "width": 1440,
    "height": 900,
    "format": "png",
    "bytes": 128000,
    "duration_ms": 840
  },
  "error": null
}
401The Bearer key is missing, malformed, revoked, or unknown.

application/json

Deliver a retained screenshot to customer storage 401 response fields
FieldType Requirement Description
errorErrorDetailRequiredNo description
error.codestringRequiredStable error identifier. Renderer error codes are extensible strings rather than a closed enum. Known examples include navigation_failed, renderer_unavailable, watermark_unavailable, recipe_not_configured, recipe_planning_failed, recipe_action_not_found, recipe_action_rejected, and recipe_action_limit.
error.messagestringRequiredNo description
error.retryablebooleanOptionalWhen present, retry automatically only when true.
{
  "error": {
    "code": "unauthenticated",
    "message": "A valid API key is required."
  }
}
404The identifier was not found or is not visible to the authenticated account.

application/json

Deliver a retained screenshot to customer storage 404 response fields
FieldType Requirement Description
messagestringRequiredNo description
{
  "message": "Not Found"
}
409Customer-storage delivery is already pending for this capture.

application/json

Deliver a retained screenshot to customer storage 409 response fields
FieldType Requirement Description
errorErrorDetailRequiredNo description
error.codestringRequiredStable error identifier. Renderer error codes are extensible strings rather than a closed enum. Known examples include navigation_failed, renderer_unavailable, watermark_unavailable, recipe_not_configured, recipe_planning_failed, recipe_action_not_found, recipe_action_rejected, and recipe_action_limit.
error.messagestringRequiredNo description
error.retryablebooleanOptionalWhen present, retry automatically only when true.
{
  "error": {
    "code": "external_delivery_pending",
    "message": "This capture already has a pending external delivery."
  }
}
422Laravel validation failed. Do not retry unchanged input.

application/json

Deliver a retained screenshot to customer storage 422 response fields
FieldType Requirement Description
messagestringRequiredSummary of the first validation error and any additional error count.
errorsobjectRequiredField names map to one or more validation messages. Nested keys use dot notation.
{
  "message": "The url field is required.",
  "errors": {
    "url": [
      "The url field is required."
    ]
  }
}
429An applicable request limit was exceeded. Authenticated v1 operations default to 60 requests per minute; specific actions may document a lower additional limit. Wait for Retry-After before retrying.
Deliver a retained screenshot to customer storage 429 response headers
Header Type Example Description
X-RateLimit-Limitinteger60Maximum requests in the current window.
X-RateLimit-Remaininginteger0Requests remaining in the current window.
Retry-Afterinteger42Seconds to wait before another request.
X-RateLimit-Resetinteger1784203242Unix timestamp when the limiter resets.

application/json

Deliver a retained screenshot to customer storage 429 response fields
FieldType Requirement Description
messagestringRequiredNo description
{
  "message": "Too Many Attempts."
}
post/v1/screenshots/{capture}/remove-watermark

Unlock the clean original

Permanently switches an eligible retained capture from its Capturewell-branded file to the clean original without re-rendering or extending expiry. Repeating a successful unlock is idempotent and costs no additional credits.

operationId: removeScreenshotWatermark

Example request
curl -X POST "https://api.capturewell.app/v1/screenshots/01J00000000000000000000000/remove-watermark" \
  -H "Authorization: Bearer $CAPTUREWELL_API_KEY" \
  -H "Accept: application/json"

Parameters

Name Location Type Description
capture *pathstringCapture string identifier.

Responses

200The current capture details. watermarked is false after a successful unlock.

application/json

Unlock the clean original 200 response fields
FieldType Requirement Description
idstringRequiredNo description
batch_idstringOptionalPresent only when this capture belongs to an API batch.
batch_positionintegerOptionalZero-based request order, present only for a batch capture.range: 0–9
statusqueued | processing | completed | failedRequiredNo description
sourceapi | dashboard | template | scheduleRequiredNo description
target_urlstringRequiredNo descriptionformat: uri
optionsCaptureOptionsRequiredNo description
options.urlstringRequiredNo descriptionformat: uri
options.formatpng | jpeg | webp | avif | pdfRequiredPDF options are normalized to quality null, full_page true, and device_scale_factor 1.
options.qualityinteger | nullRequiredAlways null for PNG and PDF.range: 1–100
options.full_pagebooleanRequiredAlways true for PDF.
options.presetdesktop | desktop_hd | laptop | tablet | tablet_landscape | iphone_16 | pixel_10 | social_card | open_graphRequiredNo description
options.viewportCaptureViewportRequiredNo description
options.delay_msintegerRequiredNo description
options.timeout_msintegerRequiredNo description
options.wait_untilload | domcontentloaded | networkidle0 | networkidle2RequiredNo description
options.wait_for_selectorstring | nullRequiredNo description
options.dark_modebooleanRequiredNo description
options.reduced_motionbooleanRequiredNo description
options.remove_brandingbooleanRequiredNo description
options.watermarkCustomWatermarkSnapshotOptionalNo description
file_urlstring | nullRequiredSigned inline URL for any retained completed output, including PDF.format: uri
image_urlstring | nullRequiredSigned inline image URL while a completed image remains retained. This is null for PDF; use file_url for format-neutral clients.format: uri
download_urlstring | nullRequiredSigned attachment URL while a completed file remains retained.format: uri
expires_atstring | nullRequiredConfigured retention expiry. The usual default is 24 hours, but clients must trust this timestamp.format: date-time
credits_usedintegerRequiredNo descriptionrange: 0–∞
watermarkedbooleanRequiredWhether the separate Capturewell watermark is currently present.
watermark_removalWatermarkRemovalRequiredNo description
watermark_removal.eligiblebooleanRequiredNo description
watermark_removal.creditsintegerRequiredNo descriptionrange: 0–∞
watermark_removal.removed_atstring | nullRequiredNo descriptionformat: date-time
recipeCaptureRecipeSummary | nullRequiredNo description
webhookCaptureWebhook | nullRequiredDelivery state when this asynchronous capture requested a webhook; otherwise null. Destination and signing secret are never returned.
external_deliveryCaptureExternalDelivery | nullRequiredCustomer-storage delivery state when a presigned URL was requested; otherwise null. The destination URL is never returned. Delivery is independent of capture success, credits, webhooks, retention, and customer-object deletion.
created_atstring | nullRequiredNo descriptionformat: date-time
metadataCaptureMetadata | nullRequiredNo description
errorCaptureStoredError | nullRequiredNo description
{
  "id": "01J00000000000000000000000",
  "status": "completed",
  "source": "api",
  "target_url": "https://example.com",
  "options": {
    "url": "https://example.com",
    "format": "png",
    "quality": null,
    "full_page": false,
    "preset": "desktop",
    "viewport": {
      "width": 1440,
      "height": 900,
      "device_scale_factor": 1,
      "mobile": false
    },
    "delay_ms": 0,
    "timeout_ms": 30000,
    "wait_until": "networkidle2",
    "wait_for_selector": null,
    "dark_mode": false,
    "reduced_motion": true,
    "remove_branding": false
  },
  "file_url": "https://example.com/captures/01J00000000000000000000000/file?expires=1784203200&signature=fake",
  "image_url": "https://example.com/captures/01J00000000000000000000000/file?expires=1784203200&signature=fake",
  "download_url": "https://example.com/captures/01J00000000000000000000000/download?expires=1784203200&signature=fake",
  "expires_at": "2026-07-17T12:00:00+00:00",
  "credits_used": 1,
  "watermarked": true,
  "watermark_removal": {
    "eligible": true,
    "credits": 1,
    "removed_at": null
  },
  "recipe": null,
  "webhook": null,
  "external_delivery": null,
  "created_at": "2026-07-16T12:00:00+00:00",
  "metadata": {
    "width": 1440,
    "height": 900,
    "format": "png",
    "bytes": 128000,
    "duration_ms": 840
  },
  "error": null
}
401The Bearer key is missing, malformed, revoked, or unknown.

application/json

Unlock the clean original 401 response fields
FieldType Requirement Description
errorErrorDetailRequiredNo description
error.codestringRequiredStable error identifier. Renderer error codes are extensible strings rather than a closed enum. Known examples include navigation_failed, renderer_unavailable, watermark_unavailable, recipe_not_configured, recipe_planning_failed, recipe_action_not_found, recipe_action_rejected, and recipe_action_limit.
error.messagestringRequiredNo description
error.retryablebooleanOptionalWhen present, retry automatically only when true.
{
  "error": {
    "code": "unauthenticated",
    "message": "A valid API key is required."
  }
}
404The identifier was not found or is not visible to the authenticated account.

application/json

Unlock the clean original 404 response fields
FieldType Requirement Description
messagestringRequiredNo description
{
  "message": "Not Found"
}
409The clean original cannot be unlocked because the capture is incomplete, expired, legacy, already lacks an eligible original, or no retained original remains.

application/json

Unlock the clean original 409 response fields
FieldType Requirement Description
errorErrorDetailRequiredNo description
error.codestringRequiredStable error identifier. Renderer error codes are extensible strings rather than a closed enum. Known examples include navigation_failed, renderer_unavailable, watermark_unavailable, recipe_not_configured, recipe_planning_failed, recipe_action_not_found, recipe_action_rejected, and recipe_action_limit.
error.messagestringRequiredNo description
error.retryablebooleanOptionalWhen present, retry automatically only when true.
{
  "error": {
    "code": "capture_watermark_not_removable",
    "message": "This capture does not have an eligible retained clean original."
  }
}
429Either an applicable request limit was exceeded or the account lacks enough credits. Authenticated v1 operations default to 60 requests per minute; specific actions may document a lower additional limit. A quota_exceeded response does not include Retry-After and is not rescued synchronously by auto recharge; retry only after the balance has actually increased.
Unlock the clean original 429 response headers
Header Type Example Description
X-RateLimit-Limitinteger60Maximum requests in the current window.
X-RateLimit-Remaininginteger37Requests remaining in the current window.
Retry-Afterinteger42Present only when the request limiter, rather than the credit quota, caused the response.
X-RateLimit-Resetinteger1784203242Present when the request limiter supplies a reset timestamp.

application/json

{
  "message": "Too Many Attempts."
}

Resource

Webhooks

Configure the account endpoint that receives signed terminal capture events and dashboard test delivery.

get/v1/webhook-endpoint

Get the webhook endpoint

Returns the account's configured endpoint. The signing secret is never returned after creation or rotation.

operationId: getWebhookEndpoint

Example request
curl -X GET "https://api.capturewell.app/v1/webhook-endpoint" \
  -H "Authorization: Bearer $CAPTUREWELL_API_KEY" \
  -H "Accept: application/json"

Responses

200Configured endpoint.

application/json

Get the webhook endpoint 200 response fields
FieldType Requirement Description
idstringRequiredNo description
urlstringRequiredNo descriptionformat: uri · pattern: ^[Hh][Tt][Tt][Pp][Ss]://
{
  "id": "01J00000000000000000000009",
  "url": "https://hooks.example.com/capturewell"
}
401The Bearer key is missing, malformed, revoked, or unknown.

application/json

Get the webhook endpoint 401 response fields
FieldType Requirement Description
errorErrorDetailRequiredNo description
error.codestringRequiredStable error identifier. Renderer error codes are extensible strings rather than a closed enum. Known examples include navigation_failed, renderer_unavailable, watermark_unavailable, recipe_not_configured, recipe_planning_failed, recipe_action_not_found, recipe_action_rejected, and recipe_action_limit.
error.messagestringRequiredNo description
error.retryablebooleanOptionalWhen present, retry automatically only when true.
{
  "error": {
    "code": "unauthenticated",
    "message": "A valid API key is required."
  }
}
404The identifier was not found or is not visible to the authenticated account.

application/json

Get the webhook endpoint 404 response fields
FieldType Requirement Description
messagestringRequiredNo description
{
  "message": "Not Found"
}
429An applicable request limit was exceeded. Authenticated v1 operations default to 60 requests per minute; specific actions may document a lower additional limit. Wait for Retry-After before retrying.
Get the webhook endpoint 429 response headers
Header Type Example Description
X-RateLimit-Limitinteger60Maximum requests in the current window.
X-RateLimit-Remaininginteger0Requests remaining in the current window.
Retry-Afterinteger42Seconds to wait before another request.
X-RateLimit-Resetinteger1784203242Unix timestamp when the limiter resets.

application/json

Get the webhook endpoint 429 response fields
FieldType Requirement Description
messagestringRequiredNo description
{
  "message": "Too Many Attempts."
}
put/v1/webhook-endpoint

Create or replace the webhook endpoint

Stores one public HTTPS endpoint and rotates its signing secret. The returned base64url secret is shown exactly once; replacing the endpoint affects new captures only.

operationId: putWebhookEndpoint

Example request
curl -X PUT "https://api.capturewell.app/v1/webhook-endpoint" \
  -H "Authorization: Bearer $CAPTUREWELL_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
  "url": "https://hooks.example.com/capturewell"
}'

Request body

application/json required

Create or replace the webhook endpoint request fields
FieldType Requirement Description
urlstringRequiredResolvable public HTTPS destination without credentials or a fragment. Every resolved address must be public. Query parameters are encrypted at rest and treated as secrets.format: uri · length: 0–2048 · pattern: ^[Hh][Tt][Tt][Pp][Ss]://
{
  "url": "https://hooks.example.com/capturewell"
}

Responses

200Endpoint saved and a new signing secret issued.

application/json

Create or replace the webhook endpoint 200 response fields
FieldType Requirement Description
idstringRequiredNo description
urlstringRequiredNo descriptionformat: uri · pattern: ^[Hh][Tt][Tt][Pp][Ss]://
signing_secretstringRequiredNew 32-byte base64url signing secret. This value is returned once and cannot be retrieved later.length: 43–43 · pattern: ^[A-Za-z0-9_-]{43}$
{
  "id": "01J00000000000000000000009",
  "url": "https://hooks.example.com/capturewell",
  "signing_secret": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
}
401The Bearer key is missing, malformed, revoked, or unknown.

application/json

Create or replace the webhook endpoint 401 response fields
FieldType Requirement Description
errorErrorDetailRequiredNo description
error.codestringRequiredStable error identifier. Renderer error codes are extensible strings rather than a closed enum. Known examples include navigation_failed, renderer_unavailable, watermark_unavailable, recipe_not_configured, recipe_planning_failed, recipe_action_not_found, recipe_action_rejected, and recipe_action_limit.
error.messagestringRequiredNo description
error.retryablebooleanOptionalWhen present, retry automatically only when true.
{
  "error": {
    "code": "unauthenticated",
    "message": "A valid API key is required."
  }
}
422Laravel validation failed. Do not retry unchanged input.

application/json

Create or replace the webhook endpoint 422 response fields
FieldType Requirement Description
messagestringRequiredSummary of the first validation error and any additional error count.
errorsobjectRequiredField names map to one or more validation messages. Nested keys use dot notation.
{
  "message": "The url field is required.",
  "errors": {
    "url": [
      "The url field is required."
    ]
  }
}
429An applicable request limit was exceeded. Authenticated v1 operations default to 60 requests per minute; specific actions may document a lower additional limit. Wait for Retry-After before retrying.
Create or replace the webhook endpoint 429 response headers
Header Type Example Description
X-RateLimit-Limitinteger60Maximum requests in the current window.
X-RateLimit-Remaininginteger0Requests remaining in the current window.
Retry-Afterinteger42Seconds to wait before another request.
X-RateLimit-Resetinteger1784203242Unix timestamp when the limiter resets.

application/json

Create or replace the webhook endpoint 429 response fields
FieldType Requirement Description
messagestringRequiredNo description
{
  "message": "Too Many Attempts."
}
delete/v1/webhook-endpoint

Delete the webhook endpoint

Removes the current endpoint. Existing captures retain their encrypted snapshot until delivery reaches a terminal state.

operationId: deleteWebhookEndpoint

Example request
curl -X DELETE "https://api.capturewell.app/v1/webhook-endpoint" \
  -H "Authorization: Bearer $CAPTUREWELL_API_KEY" \
  -H "Accept: application/json"

Responses

204Endpoint removed or already absent.
401The Bearer key is missing, malformed, revoked, or unknown.

application/json

Delete the webhook endpoint 401 response fields
FieldType Requirement Description
errorErrorDetailRequiredNo description
error.codestringRequiredStable error identifier. Renderer error codes are extensible strings rather than a closed enum. Known examples include navigation_failed, renderer_unavailable, watermark_unavailable, recipe_not_configured, recipe_planning_failed, recipe_action_not_found, recipe_action_rejected, and recipe_action_limit.
error.messagestringRequiredNo description
error.retryablebooleanOptionalWhen present, retry automatically only when true.
{
  "error": {
    "code": "unauthenticated",
    "message": "A valid API key is required."
  }
}
429An applicable request limit was exceeded. Authenticated v1 operations default to 60 requests per minute; specific actions may document a lower additional limit. Wait for Retry-After before retrying.
Delete the webhook endpoint 429 response headers
Header Type Example Description
X-RateLimit-Limitinteger60Maximum requests in the current window.
X-RateLimit-Remaininginteger0Requests remaining in the current window.
Retry-Afterinteger42Seconds to wait before another request.
X-RateLimit-Resetinteger1784203242Unix timestamp when the limiter resets.

application/json

Delete the webhook endpoint 429 response fields
FieldType Requirement Description
messagestringRequiredNo description
{
  "message": "Too Many Attempts."
}

Resource

Recipes

Manage account-owned natural-language browser-action recipes.

get/v1/recipes

List recipes

Returns the authenticated account's active recipes ordered by most recently updated, 20 per page.

operationId: listRecipes

Example request
curl -X GET "https://api.capturewell.app/v1/recipes?page=1" \
  -H "Authorization: Bearer $CAPTUREWELL_API_KEY" \
  -H "Accept: application/json"

Parameters

Name Location Type Description
page queryintegerOne-indexed result page. Collections contain 20 records per page.

Responses

200Paginated recipes.

application/json

List recipes 200 response fields
FieldType Requirement Description
current_pageintegerRequiredNo description
first_page_urlstringRequiredNo descriptionformat: uri
frominteger | nullRequiredNo description
last_pageintegerRequiredNo description
last_page_urlstringRequiredNo descriptionformat: uri
linksarray<PaginatorLink>RequiredNo description
next_page_urlstring | nullRequiredNo descriptionformat: uri
pathstringRequiredNo descriptionformat: uri
per_pageintegerRequiredNo description
prev_page_urlstring | nullRequiredNo descriptionformat: uri
tointeger | nullRequiredNo description
totalintegerRequiredNo description
dataarray<Recipe>RequiredNo description
{
  "current_page": 1,
  "first_page_url": "https://api.example.com/v1/recipes?page=1",
  "from": null,
  "last_page": 1,
  "last_page_url": "https://api.example.com/v1/recipes?page=1",
  "links": [],
  "next_page_url": null,
  "path": "https://api.example.com/v1/recipes",
  "per_page": 20,
  "prev_page_url": null,
  "to": null,
  "total": 0,
  "data": []
}
401The Bearer key is missing, malformed, revoked, or unknown.

application/json

List recipes 401 response fields
FieldType Requirement Description
errorErrorDetailRequiredNo description
error.codestringRequiredStable error identifier. Renderer error codes are extensible strings rather than a closed enum. Known examples include navigation_failed, renderer_unavailable, watermark_unavailable, recipe_not_configured, recipe_planning_failed, recipe_action_not_found, recipe_action_rejected, and recipe_action_limit.
error.messagestringRequiredNo description
error.retryablebooleanOptionalWhen present, retry automatically only when true.
{
  "error": {
    "code": "unauthenticated",
    "message": "A valid API key is required."
  }
}
429An applicable request limit was exceeded. Authenticated v1 operations default to 60 requests per minute; specific actions may document a lower additional limit. Wait for Retry-After before retrying.
List recipes 429 response headers
Header Type Example Description
X-RateLimit-Limitinteger60Maximum requests in the current window.
X-RateLimit-Remaininginteger0Requests remaining in the current window.
Retry-Afterinteger42Seconds to wait before another request.
X-RateLimit-Resetinteger1784203242Unix timestamp when the limiter resets.

application/json

List recipes 429 response fields
FieldType Requirement Description
messagestringRequiredNo description
{
  "message": "Too Many Attempts."
}
post/v1/recipes

Create a recipe

Creates an account-owned natural-language recipe. Recipe-assisted screenshots must use the asynchronous screenshot endpoint and may be subject to a feature gate.

operationId: createRecipe

Example request
curl -X POST "https://api.capturewell.app/v1/recipes" \
  -H "Authorization: Bearer $CAPTUREWELL_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Dismiss cookie banner",
  "instructions": "Accept the cookie banner, then finish."
}'

Request body

application/json required

Create a recipe request fields
FieldType Requirement Description
namestringRequiredNo descriptionlength: 0–80
instructionsstringRequiredNo descriptionlength: 0–2000
{
  "name": "Dismiss cookie banner",
  "instructions": "Accept the cookie banner, then finish."
}

Responses

201The recipe was created.

application/json

Create a recipe 201 response fields
FieldType Requirement Description
idstringRequiredPublic ULID.
namestringRequiredNo description
instructionsstringRequiredNo description
created_atstring | nullRequiredNo descriptionformat: date-time
updated_atstring | nullRequiredNo descriptionformat: date-time
{
  "id": "01J00000000000000000000001",
  "name": "Dismiss cookie banner",
  "instructions": "Accept the cookie banner, then finish.",
  "created_at": "2026-07-16T12:00:00+00:00",
  "updated_at": "2026-07-16T12:00:00+00:00"
}
401The Bearer key is missing, malformed, revoked, or unknown.

application/json

Create a recipe 401 response fields
FieldType Requirement Description
errorErrorDetailRequiredNo description
error.codestringRequiredStable error identifier. Renderer error codes are extensible strings rather than a closed enum. Known examples include navigation_failed, renderer_unavailable, watermark_unavailable, recipe_not_configured, recipe_planning_failed, recipe_action_not_found, recipe_action_rejected, and recipe_action_limit.
error.messagestringRequiredNo description
error.retryablebooleanOptionalWhen present, retry automatically only when true.
{
  "error": {
    "code": "unauthenticated",
    "message": "A valid API key is required."
  }
}
422Laravel validation failed. Do not retry unchanged input.

application/json

Create a recipe 422 response fields
FieldType Requirement Description
messagestringRequiredSummary of the first validation error and any additional error count.
errorsobjectRequiredField names map to one or more validation messages. Nested keys use dot notation.
{
  "message": "The url field is required.",
  "errors": {
    "url": [
      "The url field is required."
    ]
  }
}
429An applicable request limit was exceeded. Authenticated v1 operations default to 60 requests per minute; specific actions may document a lower additional limit. Wait for Retry-After before retrying.
Create a recipe 429 response headers
Header Type Example Description
X-RateLimit-Limitinteger60Maximum requests in the current window.
X-RateLimit-Remaininginteger0Requests remaining in the current window.
Retry-Afterinteger42Seconds to wait before another request.
X-RateLimit-Resetinteger1784203242Unix timestamp when the limiter resets.

application/json

Create a recipe 429 response fields
FieldType Requirement Description
messagestringRequiredNo description
{
  "message": "Too Many Attempts."
}
get/v1/recipes/{recipe}

Get a recipe

Returns one account-owned recipe. Recipes owned by other accounts return 404.

operationId: getRecipe

Example request
curl -X GET "https://api.capturewell.app/v1/recipes/01J00000000000000000000001" \
  -H "Authorization: Bearer $CAPTUREWELL_API_KEY" \
  -H "Accept: application/json"

Parameters

Name Location Type Description
recipe *pathstringRecipe public ULID.

Responses

200Recipe details.

application/json

Get a recipe 200 response fields
FieldType Requirement Description
idstringRequiredPublic ULID.
namestringRequiredNo description
instructionsstringRequiredNo description
created_atstring | nullRequiredNo descriptionformat: date-time
updated_atstring | nullRequiredNo descriptionformat: date-time
{
  "id": "01J00000000000000000000001",
  "name": "Dismiss cookie banner",
  "instructions": "Accept the cookie banner, then finish.",
  "created_at": "2026-07-16T12:00:00+00:00",
  "updated_at": "2026-07-16T12:00:00+00:00"
}
401The Bearer key is missing, malformed, revoked, or unknown.

application/json

Get a recipe 401 response fields
FieldType Requirement Description
errorErrorDetailRequiredNo description
error.codestringRequiredStable error identifier. Renderer error codes are extensible strings rather than a closed enum. Known examples include navigation_failed, renderer_unavailable, watermark_unavailable, recipe_not_configured, recipe_planning_failed, recipe_action_not_found, recipe_action_rejected, and recipe_action_limit.
error.messagestringRequiredNo description
error.retryablebooleanOptionalWhen present, retry automatically only when true.
{
  "error": {
    "code": "unauthenticated",
    "message": "A valid API key is required."
  }
}
404The identifier was not found or is not visible to the authenticated account.

application/json

Get a recipe 404 response fields
FieldType Requirement Description
messagestringRequiredNo description
{
  "message": "Not Found"
}
429An applicable request limit was exceeded. Authenticated v1 operations default to 60 requests per minute; specific actions may document a lower additional limit. Wait for Retry-After before retrying.
Get a recipe 429 response headers
Header Type Example Description
X-RateLimit-Limitinteger60Maximum requests in the current window.
X-RateLimit-Remaininginteger0Requests remaining in the current window.
Retry-Afterinteger42Seconds to wait before another request.
X-RateLimit-Resetinteger1784203242Unix timestamp when the limiter resets.

application/json

Get a recipe 429 response fields
FieldType Requirement Description
messagestringRequiredNo description
{
  "message": "Too Many Attempts."
}
put/v1/recipes/{recipe}

Replace a recipe

Replaces the writable recipe fields. Both name and instructions are required. Updating a recipe owned by another account currently returns 403, while an unknown identifier returns 404.

operationId: replaceRecipe

Example request
curl -X PUT "https://api.capturewell.app/v1/recipes/01J00000000000000000000001" \
  -H "Authorization: Bearer $CAPTUREWELL_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Open pricing details",
  "instructions": "Open the annual pricing disclosure, then finish."
}'

Parameters

Name Location Type Description
recipe *pathstringRecipe public ULID.

Request body

application/json required

Replace a recipe request fields
FieldType Requirement Description
namestringRequiredNo descriptionlength: 0–80
instructionsstringRequiredNo descriptionlength: 0–2000
{
  "name": "Open pricing details",
  "instructions": "Open the annual pricing disclosure, then finish."
}

Responses

200The updated recipe.

application/json

Replace a recipe 200 response fields
FieldType Requirement Description
idstringRequiredPublic ULID.
namestringRequiredNo description
instructionsstringRequiredNo description
created_atstring | nullRequiredNo descriptionformat: date-time
updated_atstring | nullRequiredNo descriptionformat: date-time
{
  "id": "01J00000000000000000000001",
  "name": "Dismiss cookie banner",
  "instructions": "Accept the cookie banner, then finish.",
  "created_at": "2026-07-16T12:00:00+00:00",
  "updated_at": "2026-07-16T12:00:00+00:00"
}
401The Bearer key is missing, malformed, revoked, or unknown.

application/json

Replace a recipe 401 response fields
FieldType Requirement Description
errorErrorDetailRequiredNo description
error.codestringRequiredStable error identifier. Renderer error codes are extensible strings rather than a closed enum. Known examples include navigation_failed, renderer_unavailable, watermark_unavailable, recipe_not_configured, recipe_planning_failed, recipe_action_not_found, recipe_action_rejected, and recipe_action_limit.
error.messagestringRequiredNo description
error.retryablebooleanOptionalWhen present, retry automatically only when true.
{
  "error": {
    "code": "unauthenticated",
    "message": "A valid API key is required."
  }
}
403The authenticated account is not authorized for this operation. Cross-account resource updates currently use this response.

application/json

Replace a recipe 403 response fields
FieldType Requirement Description
messagestringRequiredNo description
{
  "message": "This action is unauthorized."
}
404The identifier was not found or is not visible to the authenticated account.

application/json

Replace a recipe 404 response fields
FieldType Requirement Description
messagestringRequiredNo description
{
  "message": "Not Found"
}
422Laravel validation failed. Do not retry unchanged input.

application/json

Replace a recipe 422 response fields
FieldType Requirement Description
messagestringRequiredSummary of the first validation error and any additional error count.
errorsobjectRequiredField names map to one or more validation messages. Nested keys use dot notation.
{
  "message": "The url field is required.",
  "errors": {
    "url": [
      "The url field is required."
    ]
  }
}
429An applicable request limit was exceeded. Authenticated v1 operations default to 60 requests per minute; specific actions may document a lower additional limit. Wait for Retry-After before retrying.
Replace a recipe 429 response headers
Header Type Example Description
X-RateLimit-Limitinteger60Maximum requests in the current window.
X-RateLimit-Remaininginteger0Requests remaining in the current window.
Retry-Afterinteger42Seconds to wait before another request.
X-RateLimit-Resetinteger1784203242Unix timestamp when the limiter resets.

application/json

Replace a recipe 429 response fields
FieldType Requirement Description
messagestringRequiredNo description
{
  "message": "Too Many Attempts."
}
patch/v1/recipes/{recipe}

Update a recipe with a complete payload

PATCH currently has the same complete-payload validation as PUT: both name and instructions are required. Updating a recipe owned by another account currently returns 403, while an unknown identifier returns 404.

operationId: updateRecipe

Example request
curl -X PATCH "https://api.capturewell.app/v1/recipes/01J00000000000000000000001" \
  -H "Authorization: Bearer $CAPTUREWELL_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Open pricing details",
  "instructions": "Open the annual pricing disclosure, then finish."
}'

Parameters

Name Location Type Description
recipe *pathstringRecipe public ULID.

Request body

application/json required

Update a recipe with a complete payload request fields
FieldType Requirement Description
namestringRequiredNo descriptionlength: 0–80
instructionsstringRequiredNo descriptionlength: 0–2000
{
  "name": "Open pricing details",
  "instructions": "Open the annual pricing disclosure, then finish."
}

Responses

200The updated recipe.

application/json

Update a recipe with a complete payload 200 response fields
FieldType Requirement Description
idstringRequiredPublic ULID.
namestringRequiredNo description
instructionsstringRequiredNo description
created_atstring | nullRequiredNo descriptionformat: date-time
updated_atstring | nullRequiredNo descriptionformat: date-time
{
  "id": "01J00000000000000000000001",
  "name": "Dismiss cookie banner",
  "instructions": "Accept the cookie banner, then finish.",
  "created_at": "2026-07-16T12:00:00+00:00",
  "updated_at": "2026-07-16T12:00:00+00:00"
}
401The Bearer key is missing, malformed, revoked, or unknown.

application/json

Update a recipe with a complete payload 401 response fields
FieldType Requirement Description
errorErrorDetailRequiredNo description
error.codestringRequiredStable error identifier. Renderer error codes are extensible strings rather than a closed enum. Known examples include navigation_failed, renderer_unavailable, watermark_unavailable, recipe_not_configured, recipe_planning_failed, recipe_action_not_found, recipe_action_rejected, and recipe_action_limit.
error.messagestringRequiredNo description
error.retryablebooleanOptionalWhen present, retry automatically only when true.
{
  "error": {
    "code": "unauthenticated",
    "message": "A valid API key is required."
  }
}
403The authenticated account is not authorized for this operation. Cross-account resource updates currently use this response.

application/json

Update a recipe with a complete payload 403 response fields
FieldType Requirement Description
messagestringRequiredNo description
{
  "message": "This action is unauthorized."
}
404The identifier was not found or is not visible to the authenticated account.

application/json

Update a recipe with a complete payload 404 response fields
FieldType Requirement Description
messagestringRequiredNo description
{
  "message": "Not Found"
}
422Laravel validation failed. Do not retry unchanged input.

application/json

Update a recipe with a complete payload 422 response fields
FieldType Requirement Description
messagestringRequiredSummary of the first validation error and any additional error count.
errorsobjectRequiredField names map to one or more validation messages. Nested keys use dot notation.
{
  "message": "The url field is required.",
  "errors": {
    "url": [
      "The url field is required."
    ]
  }
}
429An applicable request limit was exceeded. Authenticated v1 operations default to 60 requests per minute; specific actions may document a lower additional limit. Wait for Retry-After before retrying.
Update a recipe with a complete payload 429 response headers
Header Type Example Description
X-RateLimit-Limitinteger60Maximum requests in the current window.
X-RateLimit-Remaininginteger0Requests remaining in the current window.
Retry-Afterinteger42Seconds to wait before another request.
X-RateLimit-Resetinteger1784203242Unix timestamp when the limiter resets.

application/json

Update a recipe with a complete payload 429 response fields
FieldType Requirement Description
messagestringRequiredNo description
{
  "message": "Too Many Attempts."
}
delete/v1/recipes/{recipe}

Delete a recipe

Soft-deletes an account-owned recipe. Existing capture snapshots remain unchanged. Recipes owned by other accounts return 404.

operationId: deleteRecipe

Example request
curl -X DELETE "https://api.capturewell.app/v1/recipes/01J00000000000000000000001" \
  -H "Authorization: Bearer $CAPTUREWELL_API_KEY" \
  -H "Accept: application/json"

Parameters

Name Location Type Description
recipe *pathstringRecipe public ULID.

Responses

204The recipe was deleted. The response has no body.
401The Bearer key is missing, malformed, revoked, or unknown.

application/json

Delete a recipe 401 response fields
FieldType Requirement Description
errorErrorDetailRequiredNo description
error.codestringRequiredStable error identifier. Renderer error codes are extensible strings rather than a closed enum. Known examples include navigation_failed, renderer_unavailable, watermark_unavailable, recipe_not_configured, recipe_planning_failed, recipe_action_not_found, recipe_action_rejected, and recipe_action_limit.
error.messagestringRequiredNo description
error.retryablebooleanOptionalWhen present, retry automatically only when true.
{
  "error": {
    "code": "unauthenticated",
    "message": "A valid API key is required."
  }
}
404The identifier was not found or is not visible to the authenticated account.

application/json

Delete a recipe 404 response fields
FieldType Requirement Description
messagestringRequiredNo description
{
  "message": "Not Found"
}
429An applicable request limit was exceeded. Authenticated v1 operations default to 60 requests per minute; specific actions may document a lower additional limit. Wait for Retry-After before retrying.
Delete a recipe 429 response headers
Header Type Example Description
X-RateLimit-Limitinteger60Maximum requests in the current window.
X-RateLimit-Remaininginteger0Requests remaining in the current window.
Retry-Afterinteger42Seconds to wait before another request.
X-RateLimit-Resetinteger1784203242Unix timestamp when the limiter resets.

application/json

Delete a recipe 429 response fields
FieldType Requirement Description
messagestringRequiredNo description
{
  "message": "Too Many Attempts."
}

Resource

Watermarks

Manage account-owned image watermarks and their placement settings.

get/v1/watermarks

List watermarks

Returns the authenticated account's image watermarks newest first, 20 per page.

operationId: listWatermarks

Example request
curl -X GET "https://api.capturewell.app/v1/watermarks?page=1" \
  -H "Authorization: Bearer $CAPTUREWELL_API_KEY" \
  -H "Accept: application/json"

Parameters

Name Location Type Description
page queryintegerOne-indexed result page. Collections contain 20 records per page.

Responses

200Paginated watermarks.

application/json

List watermarks 200 response fields
FieldType Requirement Description
current_pageintegerRequiredNo description
first_page_urlstringRequiredNo descriptionformat: uri
frominteger | nullRequiredNo description
last_pageintegerRequiredNo description
last_page_urlstringRequiredNo descriptionformat: uri
linksarray<PaginatorLink>RequiredNo description
next_page_urlstring | nullRequiredNo descriptionformat: uri
pathstringRequiredNo descriptionformat: uri
per_pageintegerRequiredNo description
prev_page_urlstring | nullRequiredNo descriptionformat: uri
tointeger | nullRequiredNo description
totalintegerRequiredNo description
dataarray<Watermark>RequiredNo description
{
  "current_page": 1,
  "first_page_url": "https://api.example.com/v1/watermarks?page=1",
  "from": null,
  "last_page": 1,
  "last_page_url": "https://api.example.com/v1/watermarks?page=1",
  "links": [],
  "next_page_url": null,
  "path": "https://api.example.com/v1/watermarks",
  "per_page": 20,
  "prev_page_url": null,
  "to": null,
  "total": 0,
  "data": []
}
401The Bearer key is missing, malformed, revoked, or unknown.

application/json

List watermarks 401 response fields
FieldType Requirement Description
errorErrorDetailRequiredNo description
error.codestringRequiredStable error identifier. Renderer error codes are extensible strings rather than a closed enum. Known examples include navigation_failed, renderer_unavailable, watermark_unavailable, recipe_not_configured, recipe_planning_failed, recipe_action_not_found, recipe_action_rejected, and recipe_action_limit.
error.messagestringRequiredNo description
error.retryablebooleanOptionalWhen present, retry automatically only when true.
{
  "error": {
    "code": "unauthenticated",
    "message": "A valid API key is required."
  }
}
429An applicable request limit was exceeded. Authenticated v1 operations default to 60 requests per minute; specific actions may document a lower additional limit. Wait for Retry-After before retrying.
List watermarks 429 response headers
Header Type Example Description
X-RateLimit-Limitinteger60Maximum requests in the current window.
X-RateLimit-Remaininginteger0Requests remaining in the current window.
Retry-Afterinteger42Seconds to wait before another request.
X-RateLimit-Resetinteger1784203242Unix timestamp when the limiter resets.

application/json

List watermarks 429 response fields
FieldType Requirement Description
messagestringRequiredNo description
{
  "message": "Too Many Attempts."
}
post/v1/watermarks

Create a watermark

Uploads an account-owned image watermark. Send multipart/form-data. Images may be JPG/JPEG, PNG, or WebP, at most 512 KiB and 4096 by 4096 pixels.

operationId: createWatermark

Example request
curl -X POST "https://api.capturewell.app/v1/watermarks" \
  -H "Authorization: Bearer $CAPTUREWELL_API_KEY" \
  -H "Accept: application/json" \
  -F "name=Product logo" \
  -F "[email protected]" \
  -F "position=bottom-right" \
  -F "opacity_percent=80" \
  -F "scale_percent=20" \
  -F "margin=24"

Request body

multipart/form-data required

Create a watermark request fields
FieldType Requirement Description
namestringRequiredNo descriptionlength: 0–80
imagestringRequiredJPG/JPEG, PNG, or WebP image, at most 512 KiB and 4096 by 4096 pixels.format: binary
positiontop-left | top-center | top-right | center-left | center | center-right | bottom-left | bottom-center | bottom-rightRequiredNo description
opacity_percentintegerRequiredNo descriptionrange: 10–100
scale_percentintegerRequiredNo descriptionrange: 5–50
marginintegerRequiredNo descriptionrange: 0–200
{
  "name": "Product logo",
  "image": "@product-logo.png",
  "position": "bottom-right",
  "opacity_percent": 80,
  "scale_percent": 20,
  "margin": 24
}

Responses

201The watermark was created.

application/json

Create a watermark 201 response fields
FieldType Requirement Description
idstringRequiredPublic ULID.
namestringRequiredNo description
positiontop-left | top-center | top-right | center-left | center | center-right | bottom-left | bottom-center | bottom-rightRequiredNo description
opacity_percentintegerRequiredNo description
scale_percentintegerRequiredNo description
marginintegerRequiredNo description
preview_urlstringRequiredAuthenticated binary image endpoint.format: uri
created_atstring | nullRequiredNo descriptionformat: date-time
updated_atstring | nullRequiredNo descriptionformat: date-time
{
  "id": "01J00000000000000000000002",
  "name": "Product logo",
  "position": "bottom-right",
  "opacity_percent": 80,
  "scale_percent": 20,
  "margin": 24,
  "preview_url": "https://api.example.com/v1/watermarks/01J00000000000000000000002/image",
  "created_at": "2026-07-16T12:00:00+00:00",
  "updated_at": "2026-07-16T12:00:00+00:00"
}
401The Bearer key is missing, malformed, revoked, or unknown.

application/json

Create a watermark 401 response fields
FieldType Requirement Description
errorErrorDetailRequiredNo description
error.codestringRequiredStable error identifier. Renderer error codes are extensible strings rather than a closed enum. Known examples include navigation_failed, renderer_unavailable, watermark_unavailable, recipe_not_configured, recipe_planning_failed, recipe_action_not_found, recipe_action_rejected, and recipe_action_limit.
error.messagestringRequiredNo description
error.retryablebooleanOptionalWhen present, retry automatically only when true.
{
  "error": {
    "code": "unauthenticated",
    "message": "A valid API key is required."
  }
}
422Laravel validation failed. Do not retry unchanged input.

application/json

Create a watermark 422 response fields
FieldType Requirement Description
messagestringRequiredSummary of the first validation error and any additional error count.
errorsobjectRequiredField names map to one or more validation messages. Nested keys use dot notation.
{
  "message": "The url field is required.",
  "errors": {
    "url": [
      "The url field is required."
    ]
  }
}
429An applicable request limit was exceeded. Authenticated v1 operations default to 60 requests per minute; specific actions may document a lower additional limit. Wait for Retry-After before retrying.
Create a watermark 429 response headers
Header Type Example Description
X-RateLimit-Limitinteger60Maximum requests in the current window.
X-RateLimit-Remaininginteger0Requests remaining in the current window.
Retry-Afterinteger42Seconds to wait before another request.
X-RateLimit-Resetinteger1784203242Unix timestamp when the limiter resets.

application/json

Create a watermark 429 response fields
FieldType Requirement Description
messagestringRequiredNo description
{
  "message": "Too Many Attempts."
}
get/v1/watermarks/{watermark}

Get a watermark

Returns one account-owned watermark and its authenticated image URL. Watermarks owned by other accounts return 404.

operationId: getWatermark

Example request
curl -X GET "https://api.capturewell.app/v1/watermarks/01J00000000000000000000002" \
  -H "Authorization: Bearer $CAPTUREWELL_API_KEY" \
  -H "Accept: application/json"

Parameters

Name Location Type Description
watermark *pathstringWatermark public ULID.

Responses

200Watermark details.

application/json

Get a watermark 200 response fields
FieldType Requirement Description
idstringRequiredPublic ULID.
namestringRequiredNo description
positiontop-left | top-center | top-right | center-left | center | center-right | bottom-left | bottom-center | bottom-rightRequiredNo description
opacity_percentintegerRequiredNo description
scale_percentintegerRequiredNo description
marginintegerRequiredNo description
preview_urlstringRequiredAuthenticated binary image endpoint.format: uri
created_atstring | nullRequiredNo descriptionformat: date-time
updated_atstring | nullRequiredNo descriptionformat: date-time
{
  "id": "01J00000000000000000000002",
  "name": "Product logo",
  "position": "bottom-right",
  "opacity_percent": 80,
  "scale_percent": 20,
  "margin": 24,
  "preview_url": "https://api.example.com/v1/watermarks/01J00000000000000000000002/image",
  "created_at": "2026-07-16T12:00:00+00:00",
  "updated_at": "2026-07-16T12:00:00+00:00"
}
401The Bearer key is missing, malformed, revoked, or unknown.

application/json

Get a watermark 401 response fields
FieldType Requirement Description
errorErrorDetailRequiredNo description
error.codestringRequiredStable error identifier. Renderer error codes are extensible strings rather than a closed enum. Known examples include navigation_failed, renderer_unavailable, watermark_unavailable, recipe_not_configured, recipe_planning_failed, recipe_action_not_found, recipe_action_rejected, and recipe_action_limit.
error.messagestringRequiredNo description
error.retryablebooleanOptionalWhen present, retry automatically only when true.
{
  "error": {
    "code": "unauthenticated",
    "message": "A valid API key is required."
  }
}
404The identifier was not found or is not visible to the authenticated account.

application/json

Get a watermark 404 response fields
FieldType Requirement Description
messagestringRequiredNo description
{
  "message": "Not Found"
}
429An applicable request limit was exceeded. Authenticated v1 operations default to 60 requests per minute; specific actions may document a lower additional limit. Wait for Retry-After before retrying.
Get a watermark 429 response headers
Header Type Example Description
X-RateLimit-Limitinteger60Maximum requests in the current window.
X-RateLimit-Remaininginteger0Requests remaining in the current window.
Retry-Afterinteger42Seconds to wait before another request.
X-RateLimit-Resetinteger1784203242Unix timestamp when the limiter resets.

application/json

Get a watermark 429 response fields
FieldType Requirement Description
messagestringRequiredNo description
{
  "message": "Too Many Attempts."
}
put/v1/watermarks/{watermark}

Replace watermark settings

Replaces every writable setting. The image cannot be replaced. Updating a watermark owned by another account currently returns 403, while an unknown identifier returns 404.

operationId: replaceWatermark

Example request
curl -X PUT "https://api.capturewell.app/v1/watermarks/01J00000000000000000000002" \
  -H "Authorization: Bearer $CAPTUREWELL_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Product logo",
  "position": "bottom-right",
  "opacity_percent": 80,
  "scale_percent": 20,
  "margin": 24
}'

Parameters

Name Location Type Description
watermark *pathstringWatermark public ULID.

Request body

application/json required

Replace watermark settings request fields
FieldType Requirement Description
namestringRequiredNo descriptionlength: 0–80
positiontop-left | top-center | top-right | center-left | center | center-right | bottom-left | bottom-center | bottom-rightRequiredNo description
opacity_percentintegerRequiredNo descriptionrange: 10–100
scale_percentintegerRequiredNo descriptionrange: 5–50
marginintegerRequiredNo descriptionrange: 0–200
{
  "name": "Product logo",
  "position": "bottom-right",
  "opacity_percent": 80,
  "scale_percent": 20,
  "margin": 24
}

Responses

200The updated watermark.

application/json

Replace watermark settings 200 response fields
FieldType Requirement Description
idstringRequiredPublic ULID.
namestringRequiredNo description
positiontop-left | top-center | top-right | center-left | center | center-right | bottom-left | bottom-center | bottom-rightRequiredNo description
opacity_percentintegerRequiredNo description
scale_percentintegerRequiredNo description
marginintegerRequiredNo description
preview_urlstringRequiredAuthenticated binary image endpoint.format: uri
created_atstring | nullRequiredNo descriptionformat: date-time
updated_atstring | nullRequiredNo descriptionformat: date-time
{
  "id": "01J00000000000000000000002",
  "name": "Product logo",
  "position": "bottom-right",
  "opacity_percent": 80,
  "scale_percent": 20,
  "margin": 24,
  "preview_url": "https://api.example.com/v1/watermarks/01J00000000000000000000002/image",
  "created_at": "2026-07-16T12:00:00+00:00",
  "updated_at": "2026-07-16T12:00:00+00:00"
}
401The Bearer key is missing, malformed, revoked, or unknown.

application/json

Replace watermark settings 401 response fields
FieldType Requirement Description
errorErrorDetailRequiredNo description
error.codestringRequiredStable error identifier. Renderer error codes are extensible strings rather than a closed enum. Known examples include navigation_failed, renderer_unavailable, watermark_unavailable, recipe_not_configured, recipe_planning_failed, recipe_action_not_found, recipe_action_rejected, and recipe_action_limit.
error.messagestringRequiredNo description
error.retryablebooleanOptionalWhen present, retry automatically only when true.
{
  "error": {
    "code": "unauthenticated",
    "message": "A valid API key is required."
  }
}
403The authenticated account is not authorized for this operation. Cross-account resource updates currently use this response.

application/json

Replace watermark settings 403 response fields
FieldType Requirement Description
messagestringRequiredNo description
{
  "message": "This action is unauthorized."
}
404The identifier was not found or is not visible to the authenticated account.

application/json

Replace watermark settings 404 response fields
FieldType Requirement Description
messagestringRequiredNo description
{
  "message": "Not Found"
}
422Laravel validation failed. Do not retry unchanged input.

application/json

Replace watermark settings 422 response fields
FieldType Requirement Description
messagestringRequiredSummary of the first validation error and any additional error count.
errorsobjectRequiredField names map to one or more validation messages. Nested keys use dot notation.
{
  "message": "The url field is required.",
  "errors": {
    "url": [
      "The url field is required."
    ]
  }
}
429An applicable request limit was exceeded. Authenticated v1 operations default to 60 requests per minute; specific actions may document a lower additional limit. Wait for Retry-After before retrying.
Replace watermark settings 429 response headers
Header Type Example Description
X-RateLimit-Limitinteger60Maximum requests in the current window.
X-RateLimit-Remaininginteger0Requests remaining in the current window.
Retry-Afterinteger42Seconds to wait before another request.
X-RateLimit-Resetinteger1784203242Unix timestamp when the limiter resets.

application/json

Replace watermark settings 429 response fields
FieldType Requirement Description
messagestringRequiredNo description
{
  "message": "Too Many Attempts."
}
patch/v1/watermarks/{watermark}

Update watermark settings with a complete payload

PATCH currently has the same complete-payload validation as PUT. Send name, position, opacity_percent, scale_percent, and margin; image replacement is prohibited. Cross-account updates currently return 403.

operationId: updateWatermark

Example request
curl -X PATCH "https://api.capturewell.app/v1/watermarks/01J00000000000000000000002" \
  -H "Authorization: Bearer $CAPTUREWELL_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Product logo",
  "position": "bottom-right",
  "opacity_percent": 80,
  "scale_percent": 20,
  "margin": 24
}'

Parameters

Name Location Type Description
watermark *pathstringWatermark public ULID.

Request body

application/json required

Update watermark settings with a complete payload request fields
FieldType Requirement Description
namestringRequiredNo descriptionlength: 0–80
positiontop-left | top-center | top-right | center-left | center | center-right | bottom-left | bottom-center | bottom-rightRequiredNo description
opacity_percentintegerRequiredNo descriptionrange: 10–100
scale_percentintegerRequiredNo descriptionrange: 5–50
marginintegerRequiredNo descriptionrange: 0–200
{
  "name": "Product logo",
  "position": "bottom-right",
  "opacity_percent": 80,
  "scale_percent": 20,
  "margin": 24
}

Responses

200The updated watermark.

application/json

Update watermark settings with a complete payload 200 response fields
FieldType Requirement Description
idstringRequiredPublic ULID.
namestringRequiredNo description
positiontop-left | top-center | top-right | center-left | center | center-right | bottom-left | bottom-center | bottom-rightRequiredNo description
opacity_percentintegerRequiredNo description
scale_percentintegerRequiredNo description
marginintegerRequiredNo description
preview_urlstringRequiredAuthenticated binary image endpoint.format: uri
created_atstring | nullRequiredNo descriptionformat: date-time
updated_atstring | nullRequiredNo descriptionformat: date-time
{
  "id": "01J00000000000000000000002",
  "name": "Product logo",
  "position": "bottom-right",
  "opacity_percent": 80,
  "scale_percent": 20,
  "margin": 24,
  "preview_url": "https://api.example.com/v1/watermarks/01J00000000000000000000002/image",
  "created_at": "2026-07-16T12:00:00+00:00",
  "updated_at": "2026-07-16T12:00:00+00:00"
}
401The Bearer key is missing, malformed, revoked, or unknown.

application/json

Update watermark settings with a complete payload 401 response fields
FieldType Requirement Description
errorErrorDetailRequiredNo description
error.codestringRequiredStable error identifier. Renderer error codes are extensible strings rather than a closed enum. Known examples include navigation_failed, renderer_unavailable, watermark_unavailable, recipe_not_configured, recipe_planning_failed, recipe_action_not_found, recipe_action_rejected, and recipe_action_limit.
error.messagestringRequiredNo description
error.retryablebooleanOptionalWhen present, retry automatically only when true.
{
  "error": {
    "code": "unauthenticated",
    "message": "A valid API key is required."
  }
}
403The authenticated account is not authorized for this operation. Cross-account resource updates currently use this response.

application/json

Update watermark settings with a complete payload 403 response fields
FieldType Requirement Description
messagestringRequiredNo description
{
  "message": "This action is unauthorized."
}
404The identifier was not found or is not visible to the authenticated account.

application/json

Update watermark settings with a complete payload 404 response fields
FieldType Requirement Description
messagestringRequiredNo description
{
  "message": "Not Found"
}
422Laravel validation failed. Do not retry unchanged input.

application/json

Update watermark settings with a complete payload 422 response fields
FieldType Requirement Description
messagestringRequiredSummary of the first validation error and any additional error count.
errorsobjectRequiredField names map to one or more validation messages. Nested keys use dot notation.
{
  "message": "The url field is required.",
  "errors": {
    "url": [
      "The url field is required."
    ]
  }
}
429An applicable request limit was exceeded. Authenticated v1 operations default to 60 requests per minute; specific actions may document a lower additional limit. Wait for Retry-After before retrying.
Update watermark settings with a complete payload 429 response headers
Header Type Example Description
X-RateLimit-Limitinteger60Maximum requests in the current window.
X-RateLimit-Remaininginteger0Requests remaining in the current window.
Retry-Afterinteger42Seconds to wait before another request.
X-RateLimit-Resetinteger1784203242Unix timestamp when the limiter resets.

application/json

Update watermark settings with a complete payload 429 response fields
FieldType Requirement Description
messagestringRequiredNo description
{
  "message": "Too Many Attempts."
}
delete/v1/watermarks/{watermark}

Delete a watermark

Deletes an account-owned watermark unless it is referenced by a template or an active queued or processing capture.

operationId: deleteWatermark

Example request
curl -X DELETE "https://api.capturewell.app/v1/watermarks/01J00000000000000000000002" \
  -H "Authorization: Bearer $CAPTUREWELL_API_KEY" \
  -H "Accept: application/json"

Parameters

Name Location Type Description
watermark *pathstringWatermark public ULID.

Responses

204The watermark was deleted. The response has no body.
401The Bearer key is missing, malformed, revoked, or unknown.

application/json

Delete a watermark 401 response fields
FieldType Requirement Description
errorErrorDetailRequiredNo description
error.codestringRequiredStable error identifier. Renderer error codes are extensible strings rather than a closed enum. Known examples include navigation_failed, renderer_unavailable, watermark_unavailable, recipe_not_configured, recipe_planning_failed, recipe_action_not_found, recipe_action_rejected, and recipe_action_limit.
error.messagestringRequiredNo description
error.retryablebooleanOptionalWhen present, retry automatically only when true.
{
  "error": {
    "code": "unauthenticated",
    "message": "A valid API key is required."
  }
}
404The identifier was not found or is not visible to the authenticated account.

application/json

Delete a watermark 404 response fields
FieldType Requirement Description
messagestringRequiredNo description
{
  "message": "Not Found"
}
409The watermark is referenced by a template or an active queued or processing capture.

application/json

Delete a watermark 409 response fields
FieldType Requirement Description
errorErrorDetailRequiredNo description
error.codestringRequiredStable error identifier. Renderer error codes are extensible strings rather than a closed enum. Known examples include navigation_failed, renderer_unavailable, watermark_unavailable, recipe_not_configured, recipe_planning_failed, recipe_action_not_found, recipe_action_rejected, and recipe_action_limit.
error.messagestringRequiredNo description
error.retryablebooleanOptionalWhen present, retry automatically only when true.
{
  "error": {
    "code": "watermark_not_deletable",
    "message": "Remove this watermark from templates before deleting it."
  }
}
429An applicable request limit was exceeded. Authenticated v1 operations default to 60 requests per minute; specific actions may document a lower additional limit. Wait for Retry-After before retrying.
Delete a watermark 429 response headers
Header Type Example Description
X-RateLimit-Limitinteger60Maximum requests in the current window.
X-RateLimit-Remaininginteger0Requests remaining in the current window.
Retry-Afterinteger42Seconds to wait before another request.
X-RateLimit-Resetinteger1784203242Unix timestamp when the limiter resets.

application/json

Delete a watermark 429 response fields
FieldType Requirement Description
messagestringRequiredNo description
{
  "message": "Too Many Attempts."
}
get/v1/watermarks/{watermark}/image

Download a watermark image

Returns the authenticated account-owned watermark image as binary data. The response is privately cacheable for five minutes.

operationId: getWatermarkImage

Example request
curl -X GET "https://api.capturewell.app/v1/watermarks/01J00000000000000000000002/image" \
  -H "Authorization: Bearer $CAPTUREWELL_API_KEY" \
  -H "Accept: application/json"

Parameters

Name Location Type Description
watermark *pathstringWatermark public ULID.

Responses

200The stored watermark image.
Download a watermark image 200 response headers
Header Type Example Description
Cache-Controlstringprivate, max-age=300Private five-minute cache policy.
X-Content-Type-OptionsstringNot availablePrevents MIME sniffing.

image/jpeg

image/png

image/webp

application/octet-stream

401The Bearer key is missing, malformed, revoked, or unknown.

application/json

Download a watermark image 401 response fields
FieldType Requirement Description
errorErrorDetailRequiredNo description
error.codestringRequiredStable error identifier. Renderer error codes are extensible strings rather than a closed enum. Known examples include navigation_failed, renderer_unavailable, watermark_unavailable, recipe_not_configured, recipe_planning_failed, recipe_action_not_found, recipe_action_rejected, and recipe_action_limit.
error.messagestringRequiredNo description
error.retryablebooleanOptionalWhen present, retry automatically only when true.
{
  "error": {
    "code": "unauthenticated",
    "message": "A valid API key is required."
  }
}
404The identifier was not found or is not visible to the authenticated account.

application/json

Download a watermark image 404 response fields
FieldType Requirement Description
messagestringRequiredNo description
{
  "message": "Not Found"
}
429An applicable request limit was exceeded. Authenticated v1 operations default to 60 requests per minute; specific actions may document a lower additional limit. Wait for Retry-After before retrying.
Download a watermark image 429 response headers
Header Type Example Description
X-RateLimit-Limitinteger60Maximum requests in the current window.
X-RateLimit-Remaininginteger0Requests remaining in the current window.
Retry-Afterinteger42Seconds to wait before another request.
X-RateLimit-Resetinteger1784203242Unix timestamp when the limiter resets.

application/json

Download a watermark image 429 response fields
FieldType Requirement Description
messagestringRequiredNo description
{
  "message": "Too Many Attempts."
}

Resource

Templates

Manage reusable screenshot settings and queue captures from them.

get/v1/templates

List templates

Returns the authenticated account's templates ordered by most recently updated, 20 per page.

operationId: listTemplates

Example request
curl -X GET "https://api.capturewell.app/v1/templates?page=1" \
  -H "Authorization: Bearer $CAPTUREWELL_API_KEY" \
  -H "Accept: application/json"

Parameters

Name Location Type Description
page queryintegerOne-indexed result page. Collections contain 20 records per page.

Responses

200Paginated templates.

application/json

List templates 200 response fields
FieldType Requirement Description
current_pageintegerRequiredNo description
first_page_urlstringRequiredNo descriptionformat: uri
frominteger | nullRequiredNo description
last_pageintegerRequiredNo description
last_page_urlstringRequiredNo descriptionformat: uri
linksarray<PaginatorLink>RequiredNo description
next_page_urlstring | nullRequiredNo descriptionformat: uri
pathstringRequiredNo descriptionformat: uri
per_pageintegerRequiredNo description
prev_page_urlstring | nullRequiredNo descriptionformat: uri
tointeger | nullRequiredNo description
totalintegerRequiredNo description
dataarray<Template>RequiredNo description
{
  "current_page": 1,
  "first_page_url": "https://api.example.com/v1/templates?page=1",
  "from": null,
  "last_page": 1,
  "last_page_url": "https://api.example.com/v1/templates?page=1",
  "links": [],
  "next_page_url": null,
  "path": "https://api.example.com/v1/templates",
  "per_page": 20,
  "prev_page_url": null,
  "to": null,
  "total": 0,
  "data": []
}
401The Bearer key is missing, malformed, revoked, or unknown.

application/json

List templates 401 response fields
FieldType Requirement Description
errorErrorDetailRequiredNo description
error.codestringRequiredStable error identifier. Renderer error codes are extensible strings rather than a closed enum. Known examples include navigation_failed, renderer_unavailable, watermark_unavailable, recipe_not_configured, recipe_planning_failed, recipe_action_not_found, recipe_action_rejected, and recipe_action_limit.
error.messagestringRequiredNo description
error.retryablebooleanOptionalWhen present, retry automatically only when true.
{
  "error": {
    "code": "unauthenticated",
    "message": "A valid API key is required."
  }
}
429An applicable request limit was exceeded. Authenticated v1 operations default to 60 requests per minute; specific actions may document a lower additional limit. Wait for Retry-After before retrying.
List templates 429 response headers
Header Type Example Description
X-RateLimit-Limitinteger60Maximum requests in the current window.
X-RateLimit-Remaininginteger0Requests remaining in the current window.
Retry-Afterinteger42Seconds to wait before another request.
X-RateLimit-Resetinteger1784203242Unix timestamp when the limiter resets.

application/json

List templates 429 response fields
FieldType Requirement Description
messagestringRequiredNo description
{
  "message": "Too Many Attempts."
}
post/v1/templates

Create a template

Creates a reusable screenshot template. The owned watermark_id and recipe_id fields are subject to the same feature gates and ownership rules as screenshot creation. capture_options stores normalized options without url.

operationId: createTemplate

Example request
curl -X POST "https://api.capturewell.app/v1/templates" \
  -H "Authorization: Bearer $CAPTUREWELL_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Homepage desktop",
  "url": "https://example.com",
  "format": "png",
  "preset": "desktop",
  "full_page": true
}'

Request body

application/json required

Create a template request fields
FieldType Requirement Description
namestringRequiredNo descriptionlength: 0–80
urlstringRequiredRequired public HTTP or HTTPS URL.format: uri · length: 0–2048
formatpng | jpeg | webp | avif | pdfOptionalPDF stores a fixed asynchronous paginated A4 template.default: "png"
qualityintegerOptionalJPEG, WebP, and AVIF default to 82; PNG normalizes quality to null. Omit for PDF.range: 1–100
full_pagebooleanOptionalNo descriptiondefault: false
presetdesktop | desktop_hd | laptop | tablet | tablet_landscape | iphone_16 | pixel_10 | social_card | open_graphOptionalNo descriptiondefault: "desktop"
viewportRequestedViewportOptionalNo description
viewport.widthintegerOptionalNo descriptionrange: 320–3840
viewport.heightintegerOptionalNo descriptionrange: 240–2160
device_scale_factornumberOptionalNo descriptionrange: 1–3
delay_msintegerOptionalNo descriptiondefault: 0 · range: 0–10000
timeout_msintegerOptionalNo descriptiondefault: 30000 · range: 1000–60000
wait_untilload | domcontentloaded | networkidle0 | networkidle2OptionalNo descriptiondefault: "networkidle2"
wait_for_selectorstring | nullOptionalNo descriptiondefault: null · length: 0–500
dark_modebooleanOptionalNo descriptiondefault: false
reduced_motionbooleanOptionalNo descriptiondefault: true
remove_brandingbooleanOptionalRequired explicitly for PDF when Capturewell image branding is configured as required.default: false
watermark_idstring | nullOptionalOwned watermark public ULID. Requires remove_branding=true and the watermark feature. Omit for PDF.
recipe_idstring | nullOptionalOwned recipe public ULID. Subject to the recipe feature gate.
{
  "name": "Homepage desktop",
  "url": "https://example.com",
  "format": "png",
  "preset": "desktop",
  "full_page": true
}

Responses

201The template was created.

application/json

Create a template 201 response fields
FieldType Requirement Description
idintegerRequiredNo descriptionformat: int64
namestringRequiredNo description
urlstringRequiredNo descriptionformat: uri
capture_optionsTemplateCaptureOptionsRequiredNo description
capture_options.formatpng | jpeg | webp | avif | pdfRequiredPDF templates retain the normalized fixed A4 document contract.
capture_options.qualityinteger | nullRequiredNull for PNG and PDF.
capture_options.full_pagebooleanRequiredAlways true for PDF.
capture_options.presetdesktop | desktop_hd | laptop | tablet | tablet_landscape | iphone_16 | pixel_10 | social_card | open_graphRequiredNo description
capture_options.viewportCaptureViewportRequiredNo description
capture_options.delay_msintegerRequiredNo description
capture_options.timeout_msintegerRequiredNo description
capture_options.wait_untilload | domcontentloaded | networkidle0 | networkidle2RequiredNo description
capture_options.wait_for_selectorstring | nullRequiredNo description
capture_options.dark_modebooleanRequiredNo description
capture_options.reduced_motionbooleanRequiredNo description
capture_options.remove_brandingbooleanRequiredNo description
capture_options.watermark_idstringOptionalStored public ULID when a custom image watermark is selected. Never present for PDF.
recipeTemplateRecipeSummary | nullRequiredNo description
latest_captureCaptureHistoryItem | nullRequiredNo description
{
  "id": 42,
  "name": "Homepage desktop",
  "url": "https://example.com",
  "capture_options": {
    "format": "png",
    "quality": null,
    "full_page": true,
    "preset": "desktop",
    "viewport": {
      "width": 1440,
      "height": 900,
      "device_scale_factor": 1,
      "mobile": false
    },
    "delay_ms": 0,
    "timeout_ms": 30000,
    "wait_until": "networkidle2",
    "wait_for_selector": null,
    "dark_mode": false,
    "reduced_motion": true,
    "remove_branding": false
  },
  "recipe": null,
  "latest_capture": null
}
401The Bearer key is missing, malformed, revoked, or unknown.

application/json

Create a template 401 response fields
FieldType Requirement Description
errorErrorDetailRequiredNo description
error.codestringRequiredStable error identifier. Renderer error codes are extensible strings rather than a closed enum. Known examples include navigation_failed, renderer_unavailable, watermark_unavailable, recipe_not_configured, recipe_planning_failed, recipe_action_not_found, recipe_action_rejected, and recipe_action_limit.
error.messagestringRequiredNo description
error.retryablebooleanOptionalWhen present, retry automatically only when true.
{
  "error": {
    "code": "unauthenticated",
    "message": "A valid API key is required."
  }
}
422Laravel validation failed. Do not retry unchanged input.

application/json

Create a template 422 response fields
FieldType Requirement Description
messagestringRequiredSummary of the first validation error and any additional error count.
errorsobjectRequiredField names map to one or more validation messages. Nested keys use dot notation.
{
  "message": "The url field is required.",
  "errors": {
    "url": [
      "The url field is required."
    ]
  }
}
429An applicable request limit was exceeded. Authenticated v1 operations default to 60 requests per minute; specific actions may document a lower additional limit. Wait for Retry-After before retrying.
Create a template 429 response headers
Header Type Example Description
X-RateLimit-Limitinteger60Maximum requests in the current window.
X-RateLimit-Remaininginteger0Requests remaining in the current window.
Retry-Afterinteger42Seconds to wait before another request.
X-RateLimit-Resetinteger1784203242Unix timestamp when the limiter resets.

application/json

Create a template 429 response fields
FieldType Requirement Description
messagestringRequiredNo description
{
  "message": "Too Many Attempts."
}
get/v1/templates/{template}

Get a template

Returns one account-owned template. Templates owned by other accounts return 404.

operationId: getTemplate

Example request
curl -X GET "https://api.capturewell.app/v1/templates/42" \
  -H "Authorization: Bearer $CAPTUREWELL_API_KEY" \
  -H "Accept: application/json"

Parameters

Name Location Type Description
template *pathintegerTemplate integer identifier.

Responses

200Template details.

application/json

Get a template 200 response fields
FieldType Requirement Description
idintegerRequiredNo descriptionformat: int64
namestringRequiredNo description
urlstringRequiredNo descriptionformat: uri
capture_optionsTemplateCaptureOptionsRequiredNo description
capture_options.formatpng | jpeg | webp | avif | pdfRequiredPDF templates retain the normalized fixed A4 document contract.
capture_options.qualityinteger | nullRequiredNull for PNG and PDF.
capture_options.full_pagebooleanRequiredAlways true for PDF.
capture_options.presetdesktop | desktop_hd | laptop | tablet | tablet_landscape | iphone_16 | pixel_10 | social_card | open_graphRequiredNo description
capture_options.viewportCaptureViewportRequiredNo description
capture_options.delay_msintegerRequiredNo description
capture_options.timeout_msintegerRequiredNo description
capture_options.wait_untilload | domcontentloaded | networkidle0 | networkidle2RequiredNo description
capture_options.wait_for_selectorstring | nullRequiredNo description
capture_options.dark_modebooleanRequiredNo description
capture_options.reduced_motionbooleanRequiredNo description
capture_options.remove_brandingbooleanRequiredNo description
capture_options.watermark_idstringOptionalStored public ULID when a custom image watermark is selected. Never present for PDF.
recipeTemplateRecipeSummary | nullRequiredNo description
latest_captureCaptureHistoryItem | nullRequiredNo description
{
  "id": 42,
  "name": "Homepage desktop",
  "url": "https://example.com",
  "capture_options": {
    "format": "png",
    "quality": null,
    "full_page": true,
    "preset": "desktop",
    "viewport": {
      "width": 1440,
      "height": 900,
      "device_scale_factor": 1,
      "mobile": false
    },
    "delay_ms": 0,
    "timeout_ms": 30000,
    "wait_until": "networkidle2",
    "wait_for_selector": null,
    "dark_mode": false,
    "reduced_motion": true,
    "remove_branding": false
  },
  "recipe": null,
  "latest_capture": null
}
401The Bearer key is missing, malformed, revoked, or unknown.

application/json

Get a template 401 response fields
FieldType Requirement Description
errorErrorDetailRequiredNo description
error.codestringRequiredStable error identifier. Renderer error codes are extensible strings rather than a closed enum. Known examples include navigation_failed, renderer_unavailable, watermark_unavailable, recipe_not_configured, recipe_planning_failed, recipe_action_not_found, recipe_action_rejected, and recipe_action_limit.
error.messagestringRequiredNo description
error.retryablebooleanOptionalWhen present, retry automatically only when true.
{
  "error": {
    "code": "unauthenticated",
    "message": "A valid API key is required."
  }
}
404The identifier was not found or is not visible to the authenticated account.

application/json

Get a template 404 response fields
FieldType Requirement Description
messagestringRequiredNo description
{
  "message": "Not Found"
}
429An applicable request limit was exceeded. Authenticated v1 operations default to 60 requests per minute; specific actions may document a lower additional limit. Wait for Retry-After before retrying.
Get a template 429 response headers
Header Type Example Description
X-RateLimit-Limitinteger60Maximum requests in the current window.
X-RateLimit-Remaininginteger0Requests remaining in the current window.
Retry-Afterinteger42Seconds to wait before another request.
X-RateLimit-Resetinteger1784203242Unix timestamp when the limiter resets.

application/json

Get a template 429 response fields
FieldType Requirement Description
messagestringRequiredNo description
{
  "message": "Too Many Attempts."
}
put/v1/templates/{template}

Replace a template

Replaces the template's writable representation. name and url are required; omitted optional capture settings are normalized back to defaults. Updating a template owned by another account currently returns 403.

operationId: replaceTemplate

Example request
curl -X PUT "https://api.capturewell.app/v1/templates/42" \
  -H "Authorization: Bearer $CAPTUREWELL_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Homepage mobile",
  "url": "https://example.com",
  "format": "png",
  "preset": "iphone_16",
  "full_page": true
}'

Parameters

Name Location Type Description
template *pathintegerTemplate integer identifier.

Request body

application/json required

Replace a template request fields
FieldType Requirement Description
namestringRequiredNo descriptionlength: 0–80
urlstringRequiredRequired public HTTP or HTTPS URL.format: uri · length: 0–2048
formatpng | jpeg | webp | avif | pdfOptionalPDF stores a fixed asynchronous paginated A4 template.default: "png"
qualityintegerOptionalJPEG, WebP, and AVIF default to 82; PNG normalizes quality to null. Omit for PDF.range: 1–100
full_pagebooleanOptionalNo descriptiondefault: false
presetdesktop | desktop_hd | laptop | tablet | tablet_landscape | iphone_16 | pixel_10 | social_card | open_graphOptionalNo descriptiondefault: "desktop"
viewportRequestedViewportOptionalNo description
viewport.widthintegerOptionalNo descriptionrange: 320–3840
viewport.heightintegerOptionalNo descriptionrange: 240–2160
device_scale_factornumberOptionalNo descriptionrange: 1–3
delay_msintegerOptionalNo descriptiondefault: 0 · range: 0–10000
timeout_msintegerOptionalNo descriptiondefault: 30000 · range: 1000–60000
wait_untilload | domcontentloaded | networkidle0 | networkidle2OptionalNo descriptiondefault: "networkidle2"
wait_for_selectorstring | nullOptionalNo descriptiondefault: null · length: 0–500
dark_modebooleanOptionalNo descriptiondefault: false
reduced_motionbooleanOptionalNo descriptiondefault: true
remove_brandingbooleanOptionalRequired explicitly for PDF when Capturewell image branding is configured as required.default: false
watermark_idstring | nullOptionalOwned watermark public ULID. Requires remove_branding=true and the watermark feature. Omit for PDF.
recipe_idstring | nullOptionalOwned recipe public ULID. Subject to the recipe feature gate.
{
  "name": "Homepage mobile",
  "url": "https://example.com",
  "format": "png",
  "preset": "iphone_16",
  "full_page": true
}

Responses

200The updated template.

application/json

Replace a template 200 response fields
FieldType Requirement Description
idintegerRequiredNo descriptionformat: int64
namestringRequiredNo description
urlstringRequiredNo descriptionformat: uri
capture_optionsTemplateCaptureOptionsRequiredNo description
capture_options.formatpng | jpeg | webp | avif | pdfRequiredPDF templates retain the normalized fixed A4 document contract.
capture_options.qualityinteger | nullRequiredNull for PNG and PDF.
capture_options.full_pagebooleanRequiredAlways true for PDF.
capture_options.presetdesktop | desktop_hd | laptop | tablet | tablet_landscape | iphone_16 | pixel_10 | social_card | open_graphRequiredNo description
capture_options.viewportCaptureViewportRequiredNo description
capture_options.delay_msintegerRequiredNo description
capture_options.timeout_msintegerRequiredNo description
capture_options.wait_untilload | domcontentloaded | networkidle0 | networkidle2RequiredNo description
capture_options.wait_for_selectorstring | nullRequiredNo description
capture_options.dark_modebooleanRequiredNo description
capture_options.reduced_motionbooleanRequiredNo description
capture_options.remove_brandingbooleanRequiredNo description
capture_options.watermark_idstringOptionalStored public ULID when a custom image watermark is selected. Never present for PDF.
recipeTemplateRecipeSummary | nullRequiredNo description
latest_captureCaptureHistoryItem | nullRequiredNo description
{
  "id": 42,
  "name": "Homepage desktop",
  "url": "https://example.com",
  "capture_options": {
    "format": "png",
    "quality": null,
    "full_page": true,
    "preset": "desktop",
    "viewport": {
      "width": 1440,
      "height": 900,
      "device_scale_factor": 1,
      "mobile": false
    },
    "delay_ms": 0,
    "timeout_ms": 30000,
    "wait_until": "networkidle2",
    "wait_for_selector": null,
    "dark_mode": false,
    "reduced_motion": true,
    "remove_branding": false
  },
  "recipe": null,
  "latest_capture": null
}
401The Bearer key is missing, malformed, revoked, or unknown.

application/json

Replace a template 401 response fields
FieldType Requirement Description
errorErrorDetailRequiredNo description
error.codestringRequiredStable error identifier. Renderer error codes are extensible strings rather than a closed enum. Known examples include navigation_failed, renderer_unavailable, watermark_unavailable, recipe_not_configured, recipe_planning_failed, recipe_action_not_found, recipe_action_rejected, and recipe_action_limit.
error.messagestringRequiredNo description
error.retryablebooleanOptionalWhen present, retry automatically only when true.
{
  "error": {
    "code": "unauthenticated",
    "message": "A valid API key is required."
  }
}
403The authenticated account is not authorized for this operation. Cross-account resource updates currently use this response.

application/json

Replace a template 403 response fields
FieldType Requirement Description
messagestringRequiredNo description
{
  "message": "This action is unauthorized."
}
404The identifier was not found or is not visible to the authenticated account.

application/json

Replace a template 404 response fields
FieldType Requirement Description
messagestringRequiredNo description
{
  "message": "Not Found"
}
422Laravel validation failed. Do not retry unchanged input.

application/json

Replace a template 422 response fields
FieldType Requirement Description
messagestringRequiredSummary of the first validation error and any additional error count.
errorsobjectRequiredField names map to one or more validation messages. Nested keys use dot notation.
{
  "message": "The url field is required.",
  "errors": {
    "url": [
      "The url field is required."
    ]
  }
}
429An applicable request limit was exceeded. Authenticated v1 operations default to 60 requests per minute; specific actions may document a lower additional limit. Wait for Retry-After before retrying.
Replace a template 429 response headers
Header Type Example Description
X-RateLimit-Limitinteger60Maximum requests in the current window.
X-RateLimit-Remaininginteger0Requests remaining in the current window.
Retry-Afterinteger42Seconds to wait before another request.
X-RateLimit-Resetinteger1784203242Unix timestamp when the limiter resets.

application/json

Replace a template 429 response fields
FieldType Requirement Description
messagestringRequiredNo description
{
  "message": "Too Many Attempts."
}
patch/v1/templates/{template}

Update a template with a complete payload

PATCH currently has the same complete-payload behavior as PUT. Send name, url, and every optional setting that should remain non-default; omitted optional settings reset to defaults. Cross-account updates currently return 403.

operationId: updateTemplate

Example request
curl -X PATCH "https://api.capturewell.app/v1/templates/42" \
  -H "Authorization: Bearer $CAPTUREWELL_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Homepage mobile",
  "url": "https://example.com",
  "format": "png",
  "preset": "iphone_16",
  "full_page": true
}'

Parameters

Name Location Type Description
template *pathintegerTemplate integer identifier.

Request body

application/json required

Update a template with a complete payload request fields
FieldType Requirement Description
namestringRequiredNo descriptionlength: 0–80
urlstringRequiredRequired public HTTP or HTTPS URL.format: uri · length: 0–2048
formatpng | jpeg | webp | avif | pdfOptionalPDF stores a fixed asynchronous paginated A4 template.default: "png"
qualityintegerOptionalJPEG, WebP, and AVIF default to 82; PNG normalizes quality to null. Omit for PDF.range: 1–100
full_pagebooleanOptionalNo descriptiondefault: false
presetdesktop | desktop_hd | laptop | tablet | tablet_landscape | iphone_16 | pixel_10 | social_card | open_graphOptionalNo descriptiondefault: "desktop"
viewportRequestedViewportOptionalNo description
viewport.widthintegerOptionalNo descriptionrange: 320–3840
viewport.heightintegerOptionalNo descriptionrange: 240–2160
device_scale_factornumberOptionalNo descriptionrange: 1–3
delay_msintegerOptionalNo descriptiondefault: 0 · range: 0–10000
timeout_msintegerOptionalNo descriptiondefault: 30000 · range: 1000–60000
wait_untilload | domcontentloaded | networkidle0 | networkidle2OptionalNo descriptiondefault: "networkidle2"
wait_for_selectorstring | nullOptionalNo descriptiondefault: null · length: 0–500
dark_modebooleanOptionalNo descriptiondefault: false
reduced_motionbooleanOptionalNo descriptiondefault: true
remove_brandingbooleanOptionalRequired explicitly for PDF when Capturewell image branding is configured as required.default: false
watermark_idstring | nullOptionalOwned watermark public ULID. Requires remove_branding=true and the watermark feature. Omit for PDF.
recipe_idstring | nullOptionalOwned recipe public ULID. Subject to the recipe feature gate.
{
  "name": "Homepage mobile",
  "url": "https://example.com",
  "format": "png",
  "preset": "iphone_16",
  "full_page": true
}

Responses

200The updated template.

application/json

Update a template with a complete payload 200 response fields
FieldType Requirement Description
idintegerRequiredNo descriptionformat: int64
namestringRequiredNo description
urlstringRequiredNo descriptionformat: uri
capture_optionsTemplateCaptureOptionsRequiredNo description
capture_options.formatpng | jpeg | webp | avif | pdfRequiredPDF templates retain the normalized fixed A4 document contract.
capture_options.qualityinteger | nullRequiredNull for PNG and PDF.
capture_options.full_pagebooleanRequiredAlways true for PDF.
capture_options.presetdesktop | desktop_hd | laptop | tablet | tablet_landscape | iphone_16 | pixel_10 | social_card | open_graphRequiredNo description
capture_options.viewportCaptureViewportRequiredNo description
capture_options.delay_msintegerRequiredNo description
capture_options.timeout_msintegerRequiredNo description
capture_options.wait_untilload | domcontentloaded | networkidle0 | networkidle2RequiredNo description
capture_options.wait_for_selectorstring | nullRequiredNo description
capture_options.dark_modebooleanRequiredNo description
capture_options.reduced_motionbooleanRequiredNo description
capture_options.remove_brandingbooleanRequiredNo description
capture_options.watermark_idstringOptionalStored public ULID when a custom image watermark is selected. Never present for PDF.
recipeTemplateRecipeSummary | nullRequiredNo description
latest_captureCaptureHistoryItem | nullRequiredNo description
{
  "id": 42,
  "name": "Homepage desktop",
  "url": "https://example.com",
  "capture_options": {
    "format": "png",
    "quality": null,
    "full_page": true,
    "preset": "desktop",
    "viewport": {
      "width": 1440,
      "height": 900,
      "device_scale_factor": 1,
      "mobile": false
    },
    "delay_ms": 0,
    "timeout_ms": 30000,
    "wait_until": "networkidle2",
    "wait_for_selector": null,
    "dark_mode": false,
    "reduced_motion": true,
    "remove_branding": false
  },
  "recipe": null,
  "latest_capture": null
}
401The Bearer key is missing, malformed, revoked, or unknown.

application/json

Update a template with a complete payload 401 response fields
FieldType Requirement Description
errorErrorDetailRequiredNo description
error.codestringRequiredStable error identifier. Renderer error codes are extensible strings rather than a closed enum. Known examples include navigation_failed, renderer_unavailable, watermark_unavailable, recipe_not_configured, recipe_planning_failed, recipe_action_not_found, recipe_action_rejected, and recipe_action_limit.
error.messagestringRequiredNo description
error.retryablebooleanOptionalWhen present, retry automatically only when true.
{
  "error": {
    "code": "unauthenticated",
    "message": "A valid API key is required."
  }
}
403The authenticated account is not authorized for this operation. Cross-account resource updates currently use this response.

application/json

Update a template with a complete payload 403 response fields
FieldType Requirement Description
messagestringRequiredNo description
{
  "message": "This action is unauthorized."
}
404The identifier was not found or is not visible to the authenticated account.

application/json

Update a template with a complete payload 404 response fields
FieldType Requirement Description
messagestringRequiredNo description
{
  "message": "Not Found"
}
422Laravel validation failed. Do not retry unchanged input.

application/json

Update a template with a complete payload 422 response fields
FieldType Requirement Description
messagestringRequiredSummary of the first validation error and any additional error count.
errorsobjectRequiredField names map to one or more validation messages. Nested keys use dot notation.
{
  "message": "The url field is required.",
  "errors": {
    "url": [
      "The url field is required."
    ]
  }
}
429An applicable request limit was exceeded. Authenticated v1 operations default to 60 requests per minute; specific actions may document a lower additional limit. Wait for Retry-After before retrying.
Update a template with a complete payload 429 response headers
Header Type Example Description
X-RateLimit-Limitinteger60Maximum requests in the current window.
X-RateLimit-Remaininginteger0Requests remaining in the current window.
Retry-Afterinteger42Seconds to wait before another request.
X-RateLimit-Resetinteger1784203242Unix timestamp when the limiter resets.

application/json

Update a template with a complete payload 429 response fields
FieldType Requirement Description
messagestringRequiredNo description
{
  "message": "Too Many Attempts."
}
delete/v1/templates/{template}

Delete a template

Deletes an account-owned template. Existing captures remain and their template_id becomes null.

operationId: deleteTemplate

Example request
curl -X DELETE "https://api.capturewell.app/v1/templates/42" \
  -H "Authorization: Bearer $CAPTUREWELL_API_KEY" \
  -H "Accept: application/json"

Parameters

Name Location Type Description
template *pathintegerTemplate integer identifier.

Responses

204The template was deleted. The response has no body.
401The Bearer key is missing, malformed, revoked, or unknown.

application/json

Delete a template 401 response fields
FieldType Requirement Description
errorErrorDetailRequiredNo description
error.codestringRequiredStable error identifier. Renderer error codes are extensible strings rather than a closed enum. Known examples include navigation_failed, renderer_unavailable, watermark_unavailable, recipe_not_configured, recipe_planning_failed, recipe_action_not_found, recipe_action_rejected, and recipe_action_limit.
error.messagestringRequiredNo description
error.retryablebooleanOptionalWhen present, retry automatically only when true.
{
  "error": {
    "code": "unauthenticated",
    "message": "A valid API key is required."
  }
}
404The identifier was not found or is not visible to the authenticated account.

application/json

Delete a template 404 response fields
FieldType Requirement Description
messagestringRequiredNo description
{
  "message": "Not Found"
}
429An applicable request limit was exceeded. Authenticated v1 operations default to 60 requests per minute; specific actions may document a lower additional limit. Wait for Retry-After before retrying.
Delete a template 429 response headers
Header Type Example Description
X-RateLimit-Limitinteger60Maximum requests in the current window.
X-RateLimit-Remaininginteger0Requests remaining in the current window.
Retry-Afterinteger42Seconds to wait before another request.
X-RateLimit-Resetinteger1784203242Unix timestamp when the limiter resets.

application/json

Delete a template 429 response fields
FieldType Requirement Description
messagestringRequiredNo description
{
  "message": "Too Many Attempts."
}
post/v1/templates/{template}/screenshots

Queue a screenshot from a template

Queues an asynchronous screenshot using the template's normalized settings and current owned recipe or watermark snapshot. Poll the returned capture through the screenshots endpoint.

operationId: createTemplateScreenshot

Example request
curl -X POST "https://api.capturewell.app/v1/templates/42/screenshots" \
  -H "Authorization: Bearer $CAPTUREWELL_API_KEY" \
  -H "Accept: application/json"

Parameters

Name Location Type Description
template *pathintegerTemplate integer identifier.

Responses

202The template screenshot was queued.

application/json

Queue a screenshot from a template 202 response fields
FieldType Requirement Description
idstringRequiredNo description
batch_idstringOptionalPresent only when this capture belongs to an API batch.
batch_positionintegerOptionalZero-based request order, present only for a batch capture.range: 0–9
statusqueued | processing | completed | failedRequiredNo description
sourceapi | dashboard | template | scheduleRequiredNo description
target_urlstringRequiredNo descriptionformat: uri
optionsCaptureOptionsRequiredNo description
options.urlstringRequiredNo descriptionformat: uri
options.formatpng | jpeg | webp | avif | pdfRequiredPDF options are normalized to quality null, full_page true, and device_scale_factor 1.
options.qualityinteger | nullRequiredAlways null for PNG and PDF.range: 1–100
options.full_pagebooleanRequiredAlways true for PDF.
options.presetdesktop | desktop_hd | laptop | tablet | tablet_landscape | iphone_16 | pixel_10 | social_card | open_graphRequiredNo description
options.viewportCaptureViewportRequiredNo description
options.delay_msintegerRequiredNo description
options.timeout_msintegerRequiredNo description
options.wait_untilload | domcontentloaded | networkidle0 | networkidle2RequiredNo description
options.wait_for_selectorstring | nullRequiredNo description
options.dark_modebooleanRequiredNo description
options.reduced_motionbooleanRequiredNo description
options.remove_brandingbooleanRequiredNo description
options.watermarkCustomWatermarkSnapshotOptionalNo description
file_urlstring | nullRequiredSigned inline URL for any retained completed output, including PDF.format: uri
image_urlstring | nullRequiredSigned inline image URL while a completed image remains retained. This is null for PDF; use file_url for format-neutral clients.format: uri
download_urlstring | nullRequiredSigned attachment URL while a completed file remains retained.format: uri
expires_atstring | nullRequiredConfigured retention expiry. The usual default is 24 hours, but clients must trust this timestamp.format: date-time
credits_usedintegerRequiredNo descriptionrange: 0–∞
watermarkedbooleanRequiredWhether the separate Capturewell watermark is currently present.
watermark_removalWatermarkRemovalRequiredNo description
watermark_removal.eligiblebooleanRequiredNo description
watermark_removal.creditsintegerRequiredNo descriptionrange: 0–∞
watermark_removal.removed_atstring | nullRequiredNo descriptionformat: date-time
recipeCaptureRecipeSummary | nullRequiredNo description
webhookCaptureWebhook | nullRequiredDelivery state when this asynchronous capture requested a webhook; otherwise null. Destination and signing secret are never returned.
external_deliveryCaptureExternalDelivery | nullRequiredCustomer-storage delivery state when a presigned URL was requested; otherwise null. The destination URL is never returned. Delivery is independent of capture success, credits, webhooks, retention, and customer-object deletion.
created_atstring | nullRequiredNo descriptionformat: date-time
metadataCaptureMetadata | nullRequiredNo description
errorCaptureStoredError | nullRequiredNo description
{
  "id": "01J00000000000000000000000",
  "status": "completed",
  "source": "api",
  "target_url": "https://example.com",
  "options": {
    "url": "https://example.com",
    "format": "png",
    "quality": null,
    "full_page": false,
    "preset": "desktop",
    "viewport": {
      "width": 1440,
      "height": 900,
      "device_scale_factor": 1,
      "mobile": false
    },
    "delay_ms": 0,
    "timeout_ms": 30000,
    "wait_until": "networkidle2",
    "wait_for_selector": null,
    "dark_mode": false,
    "reduced_motion": true,
    "remove_branding": false
  },
  "file_url": "https://example.com/captures/01J00000000000000000000000/file?expires=1784203200&signature=fake",
  "image_url": "https://example.com/captures/01J00000000000000000000000/file?expires=1784203200&signature=fake",
  "download_url": "https://example.com/captures/01J00000000000000000000000/download?expires=1784203200&signature=fake",
  "expires_at": "2026-07-17T12:00:00+00:00",
  "credits_used": 1,
  "watermarked": true,
  "watermark_removal": {
    "eligible": true,
    "credits": 1,
    "removed_at": null
  },
  "recipe": null,
  "webhook": null,
  "external_delivery": null,
  "created_at": "2026-07-16T12:00:00+00:00",
  "metadata": {
    "width": 1440,
    "height": 900,
    "format": "png",
    "bytes": 128000,
    "duration_ms": 840
  },
  "error": null
}
401The Bearer key is missing, malformed, revoked, or unknown.

application/json

Queue a screenshot from a template 401 response fields
FieldType Requirement Description
errorErrorDetailRequiredNo description
error.codestringRequiredStable error identifier. Renderer error codes are extensible strings rather than a closed enum. Known examples include navigation_failed, renderer_unavailable, watermark_unavailable, recipe_not_configured, recipe_planning_failed, recipe_action_not_found, recipe_action_rejected, and recipe_action_limit.
error.messagestringRequiredNo description
error.retryablebooleanOptionalWhen present, retry automatically only when true.
{
  "error": {
    "code": "unauthenticated",
    "message": "A valid API key is required."
  }
}
404The identifier was not found or is not visible to the authenticated account.

application/json

Queue a screenshot from a template 404 response fields
FieldType Requirement Description
messagestringRequiredNo description
{
  "message": "Not Found"
}
422Laravel validation failed. Do not retry unchanged input.

application/json

Queue a screenshot from a template 422 response fields
FieldType Requirement Description
messagestringRequiredSummary of the first validation error and any additional error count.
errorsobjectRequiredField names map to one or more validation messages. Nested keys use dot notation.
{
  "message": "The url field is required.",
  "errors": {
    "url": [
      "The url field is required."
    ]
  }
}
429Either an applicable request limit was exceeded or the account lacks enough credits. Authenticated v1 operations default to 60 requests per minute; specific actions may document a lower additional limit. A quota_exceeded response does not include Retry-After and is not rescued synchronously by auto recharge; retry only after the balance has actually increased.
Queue a screenshot from a template 429 response headers
Header Type Example Description
X-RateLimit-Limitinteger60Maximum requests in the current window.
X-RateLimit-Remaininginteger37Requests remaining in the current window.
Retry-Afterinteger42Present only when the request limiter, rather than the credit quota, caused the response.
X-RateLimit-Resetinteger1784203242Present when the request limiter supplies a reset timestamp.

application/json

{
  "message": "Too Many Attempts."
}

Resource

Schedules

Manage recurring capture schedules for templates.

get/v1/schedules

List schedules

Returns the authenticated account's schedules ordered by most recently updated, 20 per page.

operationId: listSchedules

Example request
curl -X GET "https://api.capturewell.app/v1/schedules?page=1" \
  -H "Authorization: Bearer $CAPTUREWELL_API_KEY" \
  -H "Accept: application/json"

Parameters

Name Location Type Description
page queryintegerOne-indexed result page. Collections contain 20 records per page.

Responses

200Paginated schedules.

application/json

List schedules 200 response fields
FieldType Requirement Description
current_pageintegerRequiredNo description
first_page_urlstringRequiredNo descriptionformat: uri
frominteger | nullRequiredNo description
last_pageintegerRequiredNo description
last_page_urlstringRequiredNo descriptionformat: uri
linksarray<PaginatorLink>RequiredNo description
next_page_urlstring | nullRequiredNo descriptionformat: uri
pathstringRequiredNo descriptionformat: uri
per_pageintegerRequiredNo description
prev_page_urlstring | nullRequiredNo descriptionformat: uri
tointeger | nullRequiredNo description
totalintegerRequiredNo description
dataarray<Schedule>RequiredNo description
{
  "current_page": 1,
  "first_page_url": "https://api.example.com/v1/schedules?page=1",
  "from": null,
  "last_page": 1,
  "last_page_url": "https://api.example.com/v1/schedules?page=1",
  "links": [],
  "next_page_url": null,
  "path": "https://api.example.com/v1/schedules",
  "per_page": 20,
  "prev_page_url": null,
  "to": null,
  "total": 0,
  "data": []
}
401The Bearer key is missing, malformed, revoked, or unknown.

application/json

List schedules 401 response fields
FieldType Requirement Description
errorErrorDetailRequiredNo description
error.codestringRequiredStable error identifier. Renderer error codes are extensible strings rather than a closed enum. Known examples include navigation_failed, renderer_unavailable, watermark_unavailable, recipe_not_configured, recipe_planning_failed, recipe_action_not_found, recipe_action_rejected, and recipe_action_limit.
error.messagestringRequiredNo description
error.retryablebooleanOptionalWhen present, retry automatically only when true.
{
  "error": {
    "code": "unauthenticated",
    "message": "A valid API key is required."
  }
}
429An applicable request limit was exceeded. Authenticated v1 operations default to 60 requests per minute; specific actions may document a lower additional limit. Wait for Retry-After before retrying.
List schedules 429 response headers
Header Type Example Description
X-RateLimit-Limitinteger60Maximum requests in the current window.
X-RateLimit-Remaininginteger0Requests remaining in the current window.
Retry-Afterinteger42Seconds to wait before another request.
X-RateLimit-Resetinteger1784203242Unix timestamp when the limiter resets.

application/json

List schedules 429 response fields
FieldType Requirement Description
messagestringRequiredNo description
{
  "message": "Too Many Attempts."
}
post/v1/schedules

Create a schedule

Creates a recurring schedule for an owned template. daily, weekly, and monthly schedules require time; weekly also requires weekday 1 through 7, and monthly requires month_day 1 through 28.

operationId: createSchedule

Example request
curl -X POST "https://api.capturewell.app/v1/schedules" \
  -H "Authorization: Bearer $CAPTUREWELL_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
  "template_id": 42,
  "enabled": true,
  "frequency": "weekly",
  "time": "09:00",
  "timezone": "Europe/London",
  "weekday": 1,
  "month_day": null
}'

Request body

application/json required

Create a schedule request fields
FieldType Requirement Description
template_idintegerRequiredOwned template identifier.format: int64 · range: 1–∞
enabledbooleanRequiredNo description
frequencyhourly | daily | weekly | monthlyRequiredNo description
timestring | nullRequired when frequency = "daily", frequency = "weekly", or frequency = "monthly"Required for daily, weekly, and monthly schedules. Omit or send null for hourly.pattern: ^([01][0-9]|2[0-3]):[0-5][0-9]$
timezonestringRequiredValid timezone identifier, for example Europe/London.
weekdayinteger | nullRequired when frequency = "weekly"ISO weekday 1 through 7. Required only for weekly schedules.range: 1–7
month_dayinteger | nullRequired when frequency = "monthly"Required only for monthly schedules.range: 1–28
{
  "template_id": 42,
  "enabled": true,
  "frequency": "weekly",
  "time": "09:00",
  "timezone": "Europe/London",
  "weekday": 1,
  "month_day": null
}

Responses

201The schedule was created.

application/json

Create a schedule 201 response fields
FieldType Requirement Description
idintegerRequiredNo descriptionformat: int64
enabledbooleanRequiredNo description
frequencyhourly | daily | weekly | monthlyRequiredNo description
timestring | nullRequiredNo descriptionpattern: ^([01][0-9]|2[0-3]):[0-5][0-9]$
timezonestringRequiredNo description
weekdayinteger | nullRequiredNo descriptionrange: 1–7
month_dayinteger | nullRequiredNo descriptionrange: 1–28
next_run_atstring | nullRequiredNo descriptionformat: date-time
last_run_atstring | nullRequiredNo descriptionformat: date-time
last_errorstring | nullRequiredNo description
templateScheduleTemplateSummary | nullRequiredNo description
latest_captureCaptureHistoryItem | nullRequiredNo description
{
  "id": 84,
  "enabled": true,
  "frequency": "daily",
  "time": "09:00",
  "timezone": "Europe/London",
  "weekday": null,
  "month_day": null,
  "next_run_at": "2026-07-17T08:00:00+00:00",
  "last_run_at": null,
  "last_error": null,
  "template": {
    "id": 42,
    "name": "Homepage desktop",
    "url": "https://example.com"
  },
  "latest_capture": null
}
401The Bearer key is missing, malformed, revoked, or unknown.

application/json

Create a schedule 401 response fields
FieldType Requirement Description
errorErrorDetailRequiredNo description
error.codestringRequiredStable error identifier. Renderer error codes are extensible strings rather than a closed enum. Known examples include navigation_failed, renderer_unavailable, watermark_unavailable, recipe_not_configured, recipe_planning_failed, recipe_action_not_found, recipe_action_rejected, and recipe_action_limit.
error.messagestringRequiredNo description
error.retryablebooleanOptionalWhen present, retry automatically only when true.
{
  "error": {
    "code": "unauthenticated",
    "message": "A valid API key is required."
  }
}
422Laravel validation failed. Do not retry unchanged input.

application/json

Create a schedule 422 response fields
FieldType Requirement Description
messagestringRequiredSummary of the first validation error and any additional error count.
errorsobjectRequiredField names map to one or more validation messages. Nested keys use dot notation.
{
  "message": "The url field is required.",
  "errors": {
    "url": [
      "The url field is required."
    ]
  }
}
429An applicable request limit was exceeded. Authenticated v1 operations default to 60 requests per minute; specific actions may document a lower additional limit. Wait for Retry-After before retrying.
Create a schedule 429 response headers
Header Type Example Description
X-RateLimit-Limitinteger60Maximum requests in the current window.
X-RateLimit-Remaininginteger0Requests remaining in the current window.
Retry-Afterinteger42Seconds to wait before another request.
X-RateLimit-Resetinteger1784203242Unix timestamp when the limiter resets.

application/json

Create a schedule 429 response fields
FieldType Requirement Description
messagestringRequiredNo description
{
  "message": "Too Many Attempts."
}
get/v1/schedules/{schedule}

Get a schedule

Returns one account-owned schedule. Schedules owned by other accounts return 404.

operationId: getSchedule

Example request
curl -X GET "https://api.capturewell.app/v1/schedules/84" \
  -H "Authorization: Bearer $CAPTUREWELL_API_KEY" \
  -H "Accept: application/json"

Parameters

Name Location Type Description
schedule *pathintegerSchedule integer identifier.

Responses

200Schedule details.

application/json

Get a schedule 200 response fields
FieldType Requirement Description
idintegerRequiredNo descriptionformat: int64
enabledbooleanRequiredNo description
frequencyhourly | daily | weekly | monthlyRequiredNo description
timestring | nullRequiredNo descriptionpattern: ^([01][0-9]|2[0-3]):[0-5][0-9]$
timezonestringRequiredNo description
weekdayinteger | nullRequiredNo descriptionrange: 1–7
month_dayinteger | nullRequiredNo descriptionrange: 1–28
next_run_atstring | nullRequiredNo descriptionformat: date-time
last_run_atstring | nullRequiredNo descriptionformat: date-time
last_errorstring | nullRequiredNo description
templateScheduleTemplateSummary | nullRequiredNo description
latest_captureCaptureHistoryItem | nullRequiredNo description
{
  "id": 84,
  "enabled": true,
  "frequency": "daily",
  "time": "09:00",
  "timezone": "Europe/London",
  "weekday": null,
  "month_day": null,
  "next_run_at": "2026-07-17T08:00:00+00:00",
  "last_run_at": null,
  "last_error": null,
  "template": {
    "id": 42,
    "name": "Homepage desktop",
    "url": "https://example.com"
  },
  "latest_capture": null
}
401The Bearer key is missing, malformed, revoked, or unknown.

application/json

Get a schedule 401 response fields
FieldType Requirement Description
errorErrorDetailRequiredNo description
error.codestringRequiredStable error identifier. Renderer error codes are extensible strings rather than a closed enum. Known examples include navigation_failed, renderer_unavailable, watermark_unavailable, recipe_not_configured, recipe_planning_failed, recipe_action_not_found, recipe_action_rejected, and recipe_action_limit.
error.messagestringRequiredNo description
error.retryablebooleanOptionalWhen present, retry automatically only when true.
{
  "error": {
    "code": "unauthenticated",
    "message": "A valid API key is required."
  }
}
404The identifier was not found or is not visible to the authenticated account.

application/json

Get a schedule 404 response fields
FieldType Requirement Description
messagestringRequiredNo description
{
  "message": "Not Found"
}
429An applicable request limit was exceeded. Authenticated v1 operations default to 60 requests per minute; specific actions may document a lower additional limit. Wait for Retry-After before retrying.
Get a schedule 429 response headers
Header Type Example Description
X-RateLimit-Limitinteger60Maximum requests in the current window.
X-RateLimit-Remaininginteger0Requests remaining in the current window.
Retry-Afterinteger42Seconds to wait before another request.
X-RateLimit-Resetinteger1784203242Unix timestamp when the limiter resets.

application/json

Get a schedule 429 response fields
FieldType Requirement Description
messagestringRequiredNo description
{
  "message": "Too Many Attempts."
}
put/v1/schedules/{schedule}

Replace a schedule

Replaces every writable schedule field, including conditional fields for the selected frequency. Updating a schedule owned by another account currently returns 403.

operationId: replaceSchedule

Example request
curl -X PUT "https://api.capturewell.app/v1/schedules/84" \
  -H "Authorization: Bearer $CAPTUREWELL_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
  "template_id": 42,
  "enabled": true,
  "frequency": "daily",
  "time": "09:00",
  "timezone": "Europe/London",
  "weekday": null,
  "month_day": null
}'

Parameters

Name Location Type Description
schedule *pathintegerSchedule integer identifier.

Request body

application/json required

Replace a schedule request fields
FieldType Requirement Description
template_idintegerRequiredOwned template identifier.format: int64 · range: 1–∞
enabledbooleanRequiredNo description
frequencyhourly | daily | weekly | monthlyRequiredNo description
timestring | nullRequired when frequency = "daily", frequency = "weekly", or frequency = "monthly"Required for daily, weekly, and monthly schedules. Omit or send null for hourly.pattern: ^([01][0-9]|2[0-3]):[0-5][0-9]$
timezonestringRequiredValid timezone identifier, for example Europe/London.
weekdayinteger | nullRequired when frequency = "weekly"ISO weekday 1 through 7. Required only for weekly schedules.range: 1–7
month_dayinteger | nullRequired when frequency = "monthly"Required only for monthly schedules.range: 1–28
{
  "template_id": 42,
  "enabled": true,
  "frequency": "daily",
  "time": "09:00",
  "timezone": "Europe/London",
  "weekday": null,
  "month_day": null
}

Responses

200The updated schedule.

application/json

Replace a schedule 200 response fields
FieldType Requirement Description
idintegerRequiredNo descriptionformat: int64
enabledbooleanRequiredNo description
frequencyhourly | daily | weekly | monthlyRequiredNo description
timestring | nullRequiredNo descriptionpattern: ^([01][0-9]|2[0-3]):[0-5][0-9]$
timezonestringRequiredNo description
weekdayinteger | nullRequiredNo descriptionrange: 1–7
month_dayinteger | nullRequiredNo descriptionrange: 1–28
next_run_atstring | nullRequiredNo descriptionformat: date-time
last_run_atstring | nullRequiredNo descriptionformat: date-time
last_errorstring | nullRequiredNo description
templateScheduleTemplateSummary | nullRequiredNo description
latest_captureCaptureHistoryItem | nullRequiredNo description
{
  "id": 84,
  "enabled": true,
  "frequency": "daily",
  "time": "09:00",
  "timezone": "Europe/London",
  "weekday": null,
  "month_day": null,
  "next_run_at": "2026-07-17T08:00:00+00:00",
  "last_run_at": null,
  "last_error": null,
  "template": {
    "id": 42,
    "name": "Homepage desktop",
    "url": "https://example.com"
  },
  "latest_capture": null
}
401The Bearer key is missing, malformed, revoked, or unknown.

application/json

Replace a schedule 401 response fields
FieldType Requirement Description
errorErrorDetailRequiredNo description
error.codestringRequiredStable error identifier. Renderer error codes are extensible strings rather than a closed enum. Known examples include navigation_failed, renderer_unavailable, watermark_unavailable, recipe_not_configured, recipe_planning_failed, recipe_action_not_found, recipe_action_rejected, and recipe_action_limit.
error.messagestringRequiredNo description
error.retryablebooleanOptionalWhen present, retry automatically only when true.
{
  "error": {
    "code": "unauthenticated",
    "message": "A valid API key is required."
  }
}
403The authenticated account is not authorized for this operation. Cross-account resource updates currently use this response.

application/json

Replace a schedule 403 response fields
FieldType Requirement Description
messagestringRequiredNo description
{
  "message": "This action is unauthorized."
}
404The identifier was not found or is not visible to the authenticated account.

application/json

Replace a schedule 404 response fields
FieldType Requirement Description
messagestringRequiredNo description
{
  "message": "Not Found"
}
422Laravel validation failed. Do not retry unchanged input.

application/json

Replace a schedule 422 response fields
FieldType Requirement Description
messagestringRequiredSummary of the first validation error and any additional error count.
errorsobjectRequiredField names map to one or more validation messages. Nested keys use dot notation.
{
  "message": "The url field is required.",
  "errors": {
    "url": [
      "The url field is required."
    ]
  }
}
429An applicable request limit was exceeded. Authenticated v1 operations default to 60 requests per minute; specific actions may document a lower additional limit. Wait for Retry-After before retrying.
Replace a schedule 429 response headers
Header Type Example Description
X-RateLimit-Limitinteger60Maximum requests in the current window.
X-RateLimit-Remaininginteger0Requests remaining in the current window.
Retry-Afterinteger42Seconds to wait before another request.
X-RateLimit-Resetinteger1784203242Unix timestamp when the limiter resets.

application/json

Replace a schedule 429 response fields
FieldType Requirement Description
messagestringRequiredNo description
{
  "message": "Too Many Attempts."
}
patch/v1/schedules/{schedule}

Update a schedule with a complete payload

PATCH currently has the same complete-payload validation as PUT. Send template_id, enabled, frequency, timezone, and the conditional time, weekday, or month_day fields required by that frequency. Cross-account updates currently return 403.

operationId: updateSchedule

Example request
curl -X PATCH "https://api.capturewell.app/v1/schedules/84" \
  -H "Authorization: Bearer $CAPTUREWELL_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
  "template_id": 42,
  "enabled": true,
  "frequency": "daily",
  "time": "09:00",
  "timezone": "Europe/London",
  "weekday": null,
  "month_day": null
}'

Parameters

Name Location Type Description
schedule *pathintegerSchedule integer identifier.

Request body

application/json required

Update a schedule with a complete payload request fields
FieldType Requirement Description
template_idintegerRequiredOwned template identifier.format: int64 · range: 1–∞
enabledbooleanRequiredNo description
frequencyhourly | daily | weekly | monthlyRequiredNo description
timestring | nullRequired when frequency = "daily", frequency = "weekly", or frequency = "monthly"Required for daily, weekly, and monthly schedules. Omit or send null for hourly.pattern: ^([01][0-9]|2[0-3]):[0-5][0-9]$
timezonestringRequiredValid timezone identifier, for example Europe/London.
weekdayinteger | nullRequired when frequency = "weekly"ISO weekday 1 through 7. Required only for weekly schedules.range: 1–7
month_dayinteger | nullRequired when frequency = "monthly"Required only for monthly schedules.range: 1–28
{
  "template_id": 42,
  "enabled": true,
  "frequency": "daily",
  "time": "09:00",
  "timezone": "Europe/London",
  "weekday": null,
  "month_day": null
}

Responses

200The updated schedule.

application/json

Update a schedule with a complete payload 200 response fields
FieldType Requirement Description
idintegerRequiredNo descriptionformat: int64
enabledbooleanRequiredNo description
frequencyhourly | daily | weekly | monthlyRequiredNo description
timestring | nullRequiredNo descriptionpattern: ^([01][0-9]|2[0-3]):[0-5][0-9]$
timezonestringRequiredNo description
weekdayinteger | nullRequiredNo descriptionrange: 1–7
month_dayinteger | nullRequiredNo descriptionrange: 1–28
next_run_atstring | nullRequiredNo descriptionformat: date-time
last_run_atstring | nullRequiredNo descriptionformat: date-time
last_errorstring | nullRequiredNo description
templateScheduleTemplateSummary | nullRequiredNo description
latest_captureCaptureHistoryItem | nullRequiredNo description
{
  "id": 84,
  "enabled": true,
  "frequency": "daily",
  "time": "09:00",
  "timezone": "Europe/London",
  "weekday": null,
  "month_day": null,
  "next_run_at": "2026-07-17T08:00:00+00:00",
  "last_run_at": null,
  "last_error": null,
  "template": {
    "id": 42,
    "name": "Homepage desktop",
    "url": "https://example.com"
  },
  "latest_capture": null
}
401The Bearer key is missing, malformed, revoked, or unknown.

application/json

Update a schedule with a complete payload 401 response fields
FieldType Requirement Description
errorErrorDetailRequiredNo description
error.codestringRequiredStable error identifier. Renderer error codes are extensible strings rather than a closed enum. Known examples include navigation_failed, renderer_unavailable, watermark_unavailable, recipe_not_configured, recipe_planning_failed, recipe_action_not_found, recipe_action_rejected, and recipe_action_limit.
error.messagestringRequiredNo description
error.retryablebooleanOptionalWhen present, retry automatically only when true.
{
  "error": {
    "code": "unauthenticated",
    "message": "A valid API key is required."
  }
}
403The authenticated account is not authorized for this operation. Cross-account resource updates currently use this response.

application/json

Update a schedule with a complete payload 403 response fields
FieldType Requirement Description
messagestringRequiredNo description
{
  "message": "This action is unauthorized."
}
404The identifier was not found or is not visible to the authenticated account.

application/json

Update a schedule with a complete payload 404 response fields
FieldType Requirement Description
messagestringRequiredNo description
{
  "message": "Not Found"
}
422Laravel validation failed. Do not retry unchanged input.

application/json

Update a schedule with a complete payload 422 response fields
FieldType Requirement Description
messagestringRequiredSummary of the first validation error and any additional error count.
errorsobjectRequiredField names map to one or more validation messages. Nested keys use dot notation.
{
  "message": "The url field is required.",
  "errors": {
    "url": [
      "The url field is required."
    ]
  }
}
429An applicable request limit was exceeded. Authenticated v1 operations default to 60 requests per minute; specific actions may document a lower additional limit. Wait for Retry-After before retrying.
Update a schedule with a complete payload 429 response headers
Header Type Example Description
X-RateLimit-Limitinteger60Maximum requests in the current window.
X-RateLimit-Remaininginteger0Requests remaining in the current window.
Retry-Afterinteger42Seconds to wait before another request.
X-RateLimit-Resetinteger1784203242Unix timestamp when the limiter resets.

application/json

Update a schedule with a complete payload 429 response fields
FieldType Requirement Description
messagestringRequiredNo description
{
  "message": "Too Many Attempts."
}
delete/v1/schedules/{schedule}

Delete a schedule

Deletes an account-owned schedule without deleting its template.

operationId: deleteSchedule

Example request
curl -X DELETE "https://api.capturewell.app/v1/schedules/84" \
  -H "Authorization: Bearer $CAPTUREWELL_API_KEY" \
  -H "Accept: application/json"

Parameters

Name Location Type Description
schedule *pathintegerSchedule integer identifier.

Responses

204The schedule was deleted. The response has no body.
401The Bearer key is missing, malformed, revoked, or unknown.

application/json

Delete a schedule 401 response fields
FieldType Requirement Description
errorErrorDetailRequiredNo description
error.codestringRequiredStable error identifier. Renderer error codes are extensible strings rather than a closed enum. Known examples include navigation_failed, renderer_unavailable, watermark_unavailable, recipe_not_configured, recipe_planning_failed, recipe_action_not_found, recipe_action_rejected, and recipe_action_limit.
error.messagestringRequiredNo description
error.retryablebooleanOptionalWhen present, retry automatically only when true.
{
  "error": {
    "code": "unauthenticated",
    "message": "A valid API key is required."
  }
}
404The identifier was not found or is not visible to the authenticated account.

application/json

Delete a schedule 404 response fields
FieldType Requirement Description
messagestringRequiredNo description
{
  "message": "Not Found"
}
429An applicable request limit was exceeded. Authenticated v1 operations default to 60 requests per minute; specific actions may document a lower additional limit. Wait for Retry-After before retrying.
Delete a schedule 429 response headers
Header Type Example Description
X-RateLimit-Limitinteger60Maximum requests in the current window.
X-RateLimit-Remaininginteger0Requests remaining in the current window.
Retry-Afterinteger42Seconds to wait before another request.
X-RateLimit-Resetinteger1784203242Unix timestamp when the limiter resets.

application/json

Delete a schedule 429 response fields
FieldType Requirement Description
messagestringRequiredNo description
{
  "message": "Too Many Attempts."
}
Back to top