{"openapi":"3.1.2","jsonSchemaDialect":"https:\/\/json-schema.org\/draft\/2020-12\/schema","info":{"title":"Capturewell API","version":"1.0.0","description":"Create and manage browser screenshots, recipes, image watermarks, templates, and schedules. All authenticated v1 operations require a server-side Capturewell API key and are limited to 60 requests per minute. Request throttling and credit quota exhaustion both use HTTP 429 but have different response bodies. Retry only responses that explicitly set error.retryable to true, or wait for Retry-After after request throttling. Screenshot creation has no idempotency key, so do not blindly replay an ambiguous request."},"servers":[{"url":"https:\/\/api.capturewell.app","description":"Capturewell API"}],"tags":[{"name":"Screenshots","description":"Create, poll, list, delete, and unlock retained screenshots."},{"name":"Recipes","description":"Manage account-owned natural-language browser-action recipes."},{"name":"Watermarks","description":"Manage account-owned image watermarks and their placement settings."},{"name":"Templates","description":"Manage reusable screenshot settings and queue captures from them."},{"name":"Schedules","description":"Manage recurring capture schedules for templates."}],"security":[{"bearerAuth":[]}],"paths":{"\/v1\/screenshots":{"get":{"tags":["Screenshots"],"summary":"List screenshots","description":"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","security":[{"bearerAuth":[]}],"parameters":[{"$ref":"#\/components\/parameters\/Page"},{"$ref":"#\/components\/parameters\/CaptureStatus"}],"responses":{"200":{"description":"Paginated captures.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/CapturePaginator"}}}},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"429":{"$ref":"#\/components\/responses\/Throttled"}}},"post":{"tags":["Screenshots"],"summary":"Create a screenshot synchronously","description":"Creates and renders a screenshot before responding. A standard viewport capture starts at one credit; full-page mode starts at two, higher density tiers add credits, and configured recipe or watermark features may add credits. Recipe-assisted captures are async-only. This operation has no idempotency key, so do not blindly replay it after an ambiguous network failure.","operationId":"createScreenshot","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ScreenshotRequest"},"example":{"url":"https:\/\/example.com","format":"png","preset":"desktop","full_page":true}}}},"responses":{"201":{"description":"The screenshot completed. Signed image and download URLs remain valid until expires_at; clients should trust that field rather than assume a fixed retention duration.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Capture"}}}},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"422":{"$ref":"#\/components\/responses\/ValidationOrRendererFailure"},"429":{"$ref":"#\/components\/responses\/ThrottledOrQuota"},"503":{"$ref":"#\/components\/responses\/RendererUnavailable"}}}},"\/v1\/screenshots\/async":{"post":{"tags":["Screenshots"],"summary":"Queue a screenshot","description":"Creates a queued capture and returns immediately. Poll the capture with exponential backoff until status is completed or failed. Queued and processing are non-terminal; completed and failed are terminal. Capturewell does not provide a completion webhook.","operationId":"createScreenshotAsync","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ScreenshotRequest"},"example":{"url":"https:\/\/example.com","format":"webp","preset":"desktop","recipe_id":"01J00000000000000000000001"}}}},"responses":{"202":{"description":"The screenshot was queued.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Capture"}}}},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"422":{"$ref":"#\/components\/responses\/ValidationFailed"},"429":{"$ref":"#\/components\/responses\/ThrottledOrQuota"}}}},"\/v1\/screenshots\/{capture}":{"parameters":[{"$ref":"#\/components\/parameters\/CaptureId"}],"get":{"tags":["Screenshots"],"summary":"Get a screenshot","description":"Returns one account-owned capture. Completed, unexpired captures with retained files include signed image and download URLs. Other states and expired captures return null URLs. A capture owned by another account is indistinguishable from a missing capture.","operationId":"getScreenshot","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Capture details.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Capture"}}}},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/Throttled"}}},"delete":{"tags":["Screenshots"],"summary":"Delete a screenshot","description":"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","security":[{"bearerAuth":[]}],"responses":{"204":{"description":"The capture was deleted. The response has no body."},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"404":{"$ref":"#\/components\/responses\/NotFound"},"409":{"$ref":"#\/components\/responses\/CaptureConflict"},"429":{"$ref":"#\/components\/responses\/Throttled"},"503":{"$ref":"#\/components\/responses\/CaptureCleanupUnavailable"}}}},"\/v1\/screenshots\/{capture}\/remove-watermark":{"parameters":[{"$ref":"#\/components\/parameters\/CaptureId"}],"post":{"tags":["Screenshots"],"summary":"Unlock the clean original","description":"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","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"The current capture details. watermarked is false after a successful unlock.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Capture"}}}},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"404":{"$ref":"#\/components\/responses\/NotFound"},"409":{"$ref":"#\/components\/responses\/CaptureWatermarkConflict"},"429":{"$ref":"#\/components\/responses\/ThrottledOrQuota"}}}},"\/v1\/recipes":{"get":{"tags":["Recipes"],"summary":"List recipes","description":"Returns the authenticated account's active recipes ordered by most recently updated, 20 per page.","operationId":"listRecipes","security":[{"bearerAuth":[]}],"parameters":[{"$ref":"#\/components\/parameters\/Page"}],"responses":{"200":{"description":"Paginated recipes.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/RecipePaginator"}}}},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"429":{"$ref":"#\/components\/responses\/Throttled"}}},"post":{"tags":["Recipes"],"summary":"Create a recipe","description":"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","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/RecipeWriteRequest"},"example":{"name":"Dismiss cookie banner","instructions":"Accept the cookie banner, then finish."}}}},"responses":{"201":{"description":"The recipe was created.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Recipe"}}}},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"422":{"$ref":"#\/components\/responses\/ValidationFailed"},"429":{"$ref":"#\/components\/responses\/Throttled"}}}},"\/v1\/recipes\/{recipe}":{"parameters":[{"$ref":"#\/components\/parameters\/RecipeId"}],"get":{"tags":["Recipes"],"summary":"Get a recipe","description":"Returns one account-owned recipe. Recipes owned by other accounts return 404.","operationId":"getRecipe","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Recipe details.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Recipe"}}}},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/Throttled"}}},"put":{"tags":["Recipes"],"summary":"Replace a recipe","description":"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","security":[{"bearerAuth":[]}],"requestBody":{"$ref":"#\/components\/requestBodies\/RecipeWrite"},"responses":{"200":{"$ref":"#\/components\/responses\/RecipeOk"},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"422":{"$ref":"#\/components\/responses\/ValidationFailed"},"429":{"$ref":"#\/components\/responses\/Throttled"}}},"patch":{"tags":["Recipes"],"summary":"Update a recipe with a complete payload","description":"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","security":[{"bearerAuth":[]}],"requestBody":{"$ref":"#\/components\/requestBodies\/RecipeWrite"},"responses":{"200":{"$ref":"#\/components\/responses\/RecipeOk"},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"422":{"$ref":"#\/components\/responses\/ValidationFailed"},"429":{"$ref":"#\/components\/responses\/Throttled"}}},"delete":{"tags":["Recipes"],"summary":"Delete a recipe","description":"Soft-deletes an account-owned recipe. Existing capture snapshots remain unchanged. Recipes owned by other accounts return 404.","operationId":"deleteRecipe","security":[{"bearerAuth":[]}],"responses":{"204":{"description":"The recipe was deleted. The response has no body."},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/Throttled"}}}},"\/v1\/watermarks":{"get":{"tags":["Watermarks"],"summary":"List watermarks","description":"Returns the authenticated account's image watermarks newest first, 20 per page.","operationId":"listWatermarks","security":[{"bearerAuth":[]}],"parameters":[{"$ref":"#\/components\/parameters\/Page"}],"responses":{"200":{"description":"Paginated watermarks.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/WatermarkPaginator"}}}},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"429":{"$ref":"#\/components\/responses\/Throttled"}}},"post":{"tags":["Watermarks"],"summary":"Create a watermark","description":"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","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"multipart\/form-data":{"schema":{"$ref":"#\/components\/schemas\/WatermarkCreateRequest"},"encoding":{"image":{"contentType":"image\/jpeg, image\/png, image\/webp"}}}}},"responses":{"201":{"description":"The watermark was created.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Watermark"}}}},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"422":{"$ref":"#\/components\/responses\/ValidationFailed"},"429":{"$ref":"#\/components\/responses\/Throttled"}}}},"\/v1\/watermarks\/{watermark}":{"parameters":[{"$ref":"#\/components\/parameters\/WatermarkId"}],"get":{"tags":["Watermarks"],"summary":"Get a watermark","description":"Returns one account-owned watermark and its authenticated image URL. Watermarks owned by other accounts return 404.","operationId":"getWatermark","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Watermark details.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Watermark"}}}},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/Throttled"}}},"put":{"tags":["Watermarks"],"summary":"Replace watermark settings","description":"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","security":[{"bearerAuth":[]}],"requestBody":{"$ref":"#\/components\/requestBodies\/WatermarkUpdate"},"responses":{"200":{"$ref":"#\/components\/responses\/WatermarkOk"},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"422":{"$ref":"#\/components\/responses\/ValidationFailed"},"429":{"$ref":"#\/components\/responses\/Throttled"}}},"patch":{"tags":["Watermarks"],"summary":"Update watermark settings with a complete payload","description":"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","security":[{"bearerAuth":[]}],"requestBody":{"$ref":"#\/components\/requestBodies\/WatermarkUpdate"},"responses":{"200":{"$ref":"#\/components\/responses\/WatermarkOk"},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"422":{"$ref":"#\/components\/responses\/ValidationFailed"},"429":{"$ref":"#\/components\/responses\/Throttled"}}},"delete":{"tags":["Watermarks"],"summary":"Delete a watermark","description":"Deletes an account-owned watermark unless it is referenced by a template or an active queued or processing capture.","operationId":"deleteWatermark","security":[{"bearerAuth":[]}],"responses":{"204":{"description":"The watermark was deleted. The response has no body."},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"404":{"$ref":"#\/components\/responses\/NotFound"},"409":{"$ref":"#\/components\/responses\/WatermarkConflict"},"429":{"$ref":"#\/components\/responses\/Throttled"}}}},"\/v1\/watermarks\/{watermark}\/image":{"parameters":[{"$ref":"#\/components\/parameters\/WatermarkId"}],"get":{"tags":["Watermarks"],"summary":"Download a watermark image","description":"Returns the authenticated account-owned watermark image as binary data. The response is privately cacheable for five minutes.","operationId":"getWatermarkImage","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"The stored watermark image.","headers":{"Cache-Control":{"description":"Private five-minute cache policy.","schema":{"type":"string","example":"private, max-age=300"}},"X-Content-Type-Options":{"description":"Prevents MIME sniffing.","schema":{"type":"string","const":"nosniff"}}},"content":{"image\/jpeg":{"schema":{"type":"string","format":"binary"}},"image\/png":{"schema":{"type":"string","format":"binary"}},"image\/webp":{"schema":{"type":"string","format":"binary"}},"application\/octet-stream":{"schema":{"type":"string","format":"binary"}}}},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/Throttled"}}}},"\/v1\/templates":{"get":{"tags":["Templates"],"summary":"List templates","description":"Returns the authenticated account's templates ordered by most recently updated, 20 per page.","operationId":"listTemplates","security":[{"bearerAuth":[]}],"parameters":[{"$ref":"#\/components\/parameters\/Page"}],"responses":{"200":{"description":"Paginated templates.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/TemplatePaginator"}}}},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"429":{"$ref":"#\/components\/responses\/Throttled"}}},"post":{"tags":["Templates"],"summary":"Create a template","description":"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","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/TemplateWriteRequest"},"example":{"name":"Homepage desktop","url":"https:\/\/example.com","format":"png","preset":"desktop","full_page":true}}}},"responses":{"201":{"description":"The template was created.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Template"}}}},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"422":{"$ref":"#\/components\/responses\/ValidationFailed"},"429":{"$ref":"#\/components\/responses\/Throttled"}}}},"\/v1\/templates\/{template}":{"parameters":[{"$ref":"#\/components\/parameters\/TemplateId"}],"get":{"tags":["Templates"],"summary":"Get a template","description":"Returns one account-owned template. Templates owned by other accounts return 404.","operationId":"getTemplate","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Template details.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Template"}}}},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/Throttled"}}},"put":{"tags":["Templates"],"summary":"Replace a template","description":"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","security":[{"bearerAuth":[]}],"requestBody":{"$ref":"#\/components\/requestBodies\/TemplateWrite"},"responses":{"200":{"$ref":"#\/components\/responses\/TemplateOk"},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"422":{"$ref":"#\/components\/responses\/ValidationFailed"},"429":{"$ref":"#\/components\/responses\/Throttled"}}},"patch":{"tags":["Templates"],"summary":"Update a template with a complete payload","description":"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","security":[{"bearerAuth":[]}],"requestBody":{"$ref":"#\/components\/requestBodies\/TemplateWrite"},"responses":{"200":{"$ref":"#\/components\/responses\/TemplateOk"},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"422":{"$ref":"#\/components\/responses\/ValidationFailed"},"429":{"$ref":"#\/components\/responses\/Throttled"}}},"delete":{"tags":["Templates"],"summary":"Delete a template","description":"Deletes an account-owned template. Existing captures remain and their template_id becomes null.","operationId":"deleteTemplate","security":[{"bearerAuth":[]}],"responses":{"204":{"description":"The template was deleted. The response has no body."},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/Throttled"}}}},"\/v1\/templates\/{template}\/screenshots":{"parameters":[{"$ref":"#\/components\/parameters\/TemplateId"}],"post":{"tags":["Templates"],"summary":"Queue a screenshot from a template","description":"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","security":[{"bearerAuth":[]}],"responses":{"202":{"description":"The template screenshot was queued.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Capture"}}}},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"404":{"$ref":"#\/components\/responses\/NotFound"},"422":{"$ref":"#\/components\/responses\/ValidationFailed"},"429":{"$ref":"#\/components\/responses\/ThrottledOrQuota"}}}},"\/v1\/schedules":{"get":{"tags":["Schedules"],"summary":"List schedules","description":"Returns the authenticated account's schedules ordered by most recently updated, 20 per page.","operationId":"listSchedules","security":[{"bearerAuth":[]}],"parameters":[{"$ref":"#\/components\/parameters\/Page"}],"responses":{"200":{"description":"Paginated schedules.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/SchedulePaginator"}}}},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"429":{"$ref":"#\/components\/responses\/Throttled"}}},"post":{"tags":["Schedules"],"summary":"Create a schedule","description":"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","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ScheduleWriteRequest"},"example":{"template_id":42,"enabled":true,"frequency":"weekly","time":"09:00","timezone":"Europe\/London","weekday":1,"month_day":null}}}},"responses":{"201":{"description":"The schedule was created.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Schedule"}}}},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"422":{"$ref":"#\/components\/responses\/ValidationFailed"},"429":{"$ref":"#\/components\/responses\/Throttled"}}}},"\/v1\/schedules\/{schedule}":{"parameters":[{"$ref":"#\/components\/parameters\/ScheduleId"}],"get":{"tags":["Schedules"],"summary":"Get a schedule","description":"Returns one account-owned schedule. Schedules owned by other accounts return 404.","operationId":"getSchedule","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Schedule details.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Schedule"}}}},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/Throttled"}}},"put":{"tags":["Schedules"],"summary":"Replace a schedule","description":"Replaces every writable schedule field, including conditional fields for the selected frequency. Updating a schedule owned by another account currently returns 403.","operationId":"replaceSchedule","security":[{"bearerAuth":[]}],"requestBody":{"$ref":"#\/components\/requestBodies\/ScheduleWrite"},"responses":{"200":{"$ref":"#\/components\/responses\/ScheduleOk"},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"422":{"$ref":"#\/components\/responses\/ValidationFailed"},"429":{"$ref":"#\/components\/responses\/Throttled"}}},"patch":{"tags":["Schedules"],"summary":"Update a schedule with a complete payload","description":"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","security":[{"bearerAuth":[]}],"requestBody":{"$ref":"#\/components\/requestBodies\/ScheduleWrite"},"responses":{"200":{"$ref":"#\/components\/responses\/ScheduleOk"},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"403":{"$ref":"#\/components\/responses\/Forbidden"},"404":{"$ref":"#\/components\/responses\/NotFound"},"422":{"$ref":"#\/components\/responses\/ValidationFailed"},"429":{"$ref":"#\/components\/responses\/Throttled"}}},"delete":{"tags":["Schedules"],"summary":"Delete a schedule","description":"Deletes an account-owned schedule without deleting its template.","operationId":"deleteSchedule","security":[{"bearerAuth":[]}],"responses":{"204":{"description":"The schedule was deleted. The response has no body."},"401":{"$ref":"#\/components\/responses\/Unauthenticated"},"404":{"$ref":"#\/components\/responses\/NotFound"},"429":{"$ref":"#\/components\/responses\/Throttled"}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"cw_\u2026","description":"Send a server-side Capturewell API key as Authorization: Bearer $CAPTUREWELL_API_KEY. Missing, malformed, revoked, and unknown keys return the same unauthenticated response."}},"parameters":{"Page":{"name":"page","in":"query","description":"One-indexed result page. Collections contain 20 records per page.","required":false,"schema":{"type":"integer","minimum":1,"default":1},"example":1},"CaptureStatus":{"name":"status","in":"query","description":"Optional capture status filter. An unknown value is silently ignored rather than rejected.","required":false,"schema":{"type":"string","enum":["queued","processing","completed","failed"]},"example":"completed"},"CaptureId":{"name":"capture","in":"path","description":"Capture string identifier.","required":true,"schema":{"type":"string"},"example":"01J00000000000000000000000"},"RecipeId":{"name":"recipe","in":"path","description":"Recipe public ULID.","required":true,"schema":{"type":"string"},"example":"01J00000000000000000000001"},"WatermarkId":{"name":"watermark","in":"path","description":"Watermark public ULID.","required":true,"schema":{"type":"string"},"example":"01J00000000000000000000002"},"TemplateId":{"name":"template","in":"path","description":"Template integer identifier.","required":true,"schema":{"type":"integer","format":"int64","minimum":1},"example":42},"ScheduleId":{"name":"schedule","in":"path","description":"Schedule integer identifier.","required":true,"schema":{"type":"integer","format":"int64","minimum":1},"example":84}},"requestBodies":{"RecipeWrite":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/RecipeWriteRequest"},"example":{"name":"Open pricing details","instructions":"Open the annual pricing disclosure, then finish."}}}},"WatermarkUpdate":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/WatermarkUpdateRequest"},"example":{"name":"Product logo","position":"bottom-right","opacity_percent":80,"scale_percent":20,"margin":24}}}},"TemplateWrite":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/TemplateWriteRequest"},"example":{"name":"Homepage mobile","url":"https:\/\/example.com","format":"png","preset":"iphone_16","full_page":true}}}},"ScheduleWrite":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ScheduleWriteRequest"},"example":{"template_id":42,"enabled":true,"frequency":"daily","time":"09:00","timezone":"Europe\/London","weekday":null,"month_day":null}}}}},"responses":{"Unauthenticated":{"description":"The Bearer key is missing, malformed, revoked, or unknown.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorEnvelope"},"example":{"error":{"code":"unauthenticated","message":"A valid API key is required."}}}}},"Forbidden":{"description":"The authenticated account is not authorized for this operation. Cross-account resource updates currently use this response.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/FrameworkError"},"example":{"message":"This action is unauthorized."}}}},"NotFound":{"description":"The identifier was not found or is not visible to the authenticated account.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/FrameworkError"},"example":{"message":"Not Found"}}}},"ValidationFailed":{"description":"Laravel validation failed. Do not retry unchanged input.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ValidationError"},"example":{"message":"The url field is required.","errors":{"url":["The url field is required."]}}}}},"ValidationOrRendererFailure":{"description":"Validation failed, a synchronous recipe was rejected, or the renderer returned a non-retryable failure.","content":{"application\/json":{"schema":{"oneOf":[{"$ref":"#\/components\/schemas\/ValidationError"},{"$ref":"#\/components\/schemas\/ErrorEnvelope"},{"$ref":"#\/components\/schemas\/SynchronousRendererFailure"}]},"examples":{"validation":{"value":{"message":"The url field is required.","errors":{"url":["The url field is required."]}}},"recipe_requires_async":{"value":{"error":{"code":"recipe_requires_async","message":"Recipe captures must use the asynchronous endpoint."}}},"renderer_failure":{"value":{"id":"01J00000000000000000000000","status":"failed","error":{"code":"navigation_failed","message":"The target page could not be rendered.","retryable":false}}}}}}},"Throttled":{"description":"The 60 requests-per-minute limit was exceeded. Wait for Retry-After before retrying.","headers":{"X-RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer","example":0}},"Retry-After":{"description":"Seconds to wait before another request.","schema":{"type":"integer","minimum":0,"example":42}},"X-RateLimit-Reset":{"description":"Unix timestamp when the limiter resets.","schema":{"type":"integer","example":1784203242}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/FrameworkError"},"example":{"message":"Too Many Attempts."}}}},"ThrottledOrQuota":{"description":"Either the request rate limit was exceeded or the account lacks enough credits. 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.","headers":{"X-RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer","example":37}},"Retry-After":{"description":"Present only when the request limiter, rather than the credit quota, caused the response.","schema":{"type":"integer","minimum":0,"example":42}},"X-RateLimit-Reset":{"description":"Present when the request limiter supplies a reset timestamp.","schema":{"type":"integer","example":1784203242}}},"content":{"application\/json":{"schema":{"oneOf":[{"$ref":"#\/components\/schemas\/FrameworkError"},{"$ref":"#\/components\/schemas\/QuotaErrorEnvelope"}]},"examples":{"request_throttled":{"value":{"message":"Too Many Attempts."}},"quota_exceeded":{"value":{"error":{"code":"quota_exceeded","message":"This capture needs more credits than are currently available.","limit":100,"used":100,"requested":2,"monthly_available":0,"purchased_available":1,"available":1}}}}}}},"RendererUnavailable":{"description":"The synchronous renderer failed with a retryable error. Retry only when error.retryable is true, bearing in mind that screenshot creation has no idempotency key.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/SynchronousRendererFailure"},"example":{"id":"01J00000000000000000000000","status":"failed","error":{"code":"renderer_unavailable","message":"The renderer is currently unavailable.","retryable":true}}}}},"CaptureConflict":{"description":"The capture is processing and cannot be deleted.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorEnvelope"},"example":{"error":{"code":"capture_not_deletable","message":"This capture cannot be deleted while it is processing."}}}}},"CaptureWatermarkConflict":{"description":"The clean original cannot be unlocked because the capture is incomplete, expired, legacy, already lacks an eligible original, or no retained original remains.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorEnvelope"},"example":{"error":{"code":"capture_watermark_not_removable","message":"This capture does not have an eligible retained clean original."}}}}},"CaptureCleanupUnavailable":{"description":"Retained capture storage could not be cleaned up. This response is explicitly retryable.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorEnvelope"},"example":{"error":{"code":"capture_storage_cleanup_failed","message":"Capture storage cleanup failed.","retryable":true}}}}},"WatermarkConflict":{"description":"The watermark is referenced by a template or an active queued or processing capture.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorEnvelope"},"example":{"error":{"code":"watermark_not_deletable","message":"Remove this watermark from templates before deleting it."}}}}},"RecipeOk":{"description":"The updated recipe.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Recipe"}}}},"WatermarkOk":{"description":"The updated watermark.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Watermark"}}}},"TemplateOk":{"description":"The updated template.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Template"}}}},"ScheduleOk":{"description":"The updated schedule.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Schedule"}}}}},"schemas":{"FrameworkError":{"type":"object","required":["message"],"properties":{"message":{"type":"string"}}},"ValidationError":{"type":"object","required":["message","errors"],"properties":{"message":{"type":"string","description":"Summary of the first validation error and any additional error count."},"errors":{"type":"object","description":"Field names map to one or more validation messages. Nested keys use dot notation.","additionalProperties":{"type":"array","items":{"type":"string"}}}}},"ErrorEnvelope":{"type":"object","required":["error"],"properties":{"error":{"$ref":"#\/components\/schemas\/ErrorDetail"}}},"ErrorDetail":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Stable 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."},"message":{"type":"string"},"retryable":{"type":"boolean","description":"When present, retry automatically only when true."}}},"QuotaErrorEnvelope":{"type":"object","required":["error"],"properties":{"error":{"$ref":"#\/components\/schemas\/QuotaErrorDetail"}}},"QuotaErrorDetail":{"type":"object","required":["code","message","limit","used","requested","monthly_available","purchased_available","available"],"properties":{"code":{"type":"string","const":"quota_exceeded"},"message":{"type":"string"},"limit":{"type":"integer"},"used":{"type":"integer"},"requested":{"type":"integer","minimum":0},"monthly_available":{"type":"integer","minimum":0},"purchased_available":{"type":"integer","minimum":0},"available":{"type":"integer","minimum":0}}},"SynchronousRendererFailure":{"type":"object","required":["id","status","error"],"properties":{"id":{"type":"string"},"status":{"type":"string","const":"failed"},"error":{"allOf":[{"$ref":"#\/components\/schemas\/ErrorDetail"},{"type":"object","required":["retryable"]}]}}},"ScreenshotRequest":{"type":"object","required":["url"],"properties":{"url":{"type":"string","format":"uri","maxLength":2048,"description":"Required public HTTP or HTTPS URL. Private, loopback, link-local, and reserved targets are rejected."},"format":{"type":"string","enum":["png","jpeg","webp","avif"],"default":"png","description":"Output format. PNG, JPEG, WebP, and AVIF are supported with or without required Capturewell branding."},"quality":{"type":"integer","minimum":1,"maximum":100,"description":"JPEG, WebP, or AVIF quality. Non-PNG output defaults to 82. PNG accepts this field but normalizes it to null."},"full_page":{"type":"boolean","default":false,"description":"Capture the complete document height."},"preset":{"type":"string","enum":["desktop","desktop_hd","laptop","tablet","tablet_landscape","iphone_16","pixel_10","social_card","open_graph"],"default":"desktop","description":"Named viewport preset. The preset continues to supply mobile behavior and default density when viewport dimensions are overridden."},"viewport":{"$ref":"#\/components\/schemas\/RequestedViewport"},"device_scale_factor":{"type":"number","minimum":1,"maximum":3,"description":"Pixel density. Defaults to the selected preset."},"delay_ms":{"type":"integer","minimum":0,"maximum":10000,"default":0,"description":"Additional delay after page readiness."},"timeout_ms":{"type":"integer","minimum":1000,"maximum":60000,"default":30000,"description":"Renderer navigation timeout."},"wait_until":{"type":"string","enum":["load","domcontentloaded","networkidle0","networkidle2"],"default":"networkidle2","description":"Browser readiness event."},"wait_for_selector":{"type":["string","null"],"maxLength":500,"default":null,"description":"Optional CSS selector to await before capture."},"dark_mode":{"type":"boolean","default":false,"description":"Prefer the dark color scheme."},"reduced_motion":{"type":"boolean","default":true,"description":"Prefer reduced motion while rendering."},"remove_branding":{"type":"boolean","default":false,"description":"Request clean output at creation time. The configured Capturewell watermark-removal cost is included when required branding is active."},"watermark_id":{"type":["string","null"],"description":"Owned watermark public ULID. A non-null value is allowed only when remove_branding is true and watermarking is enabled."},"recipe_id":{"type":["string","null"],"description":"Owned active recipe public ULID. Recipe capture must be enabled and the asynchronous screenshot endpoint must be used."}},"example":{"url":"https:\/\/example.com","format":"png","preset":"desktop","full_page":true}},"RequestedViewport":{"type":"object","description":"Optional custom dimensions. Either dimension may be supplied; omitted dimensions retain the selected preset value.","additionalProperties":false,"properties":{"width":{"type":"integer","minimum":320,"maximum":3840},"height":{"type":"integer","minimum":240,"maximum":2160}}},"Capture":{"type":"object","required":["id","status","source","target_url","options","image_url","download_url","expires_at","credits_used","watermarked","watermark_removal","recipe","created_at","metadata","error"],"properties":{"id":{"type":"string"},"status":{"type":"string","enum":["queued","processing","completed","failed"]},"source":{"type":"string","enum":["api","dashboard","template","schedule"]},"target_url":{"type":"string","format":"uri"},"options":{"$ref":"#\/components\/schemas\/CaptureOptions"},"image_url":{"type":["string","null"],"format":"uri","description":"Signed inline image URL while a completed file remains retained."},"download_url":{"type":["string","null"],"format":"uri","description":"Signed attachment URL while a completed file remains retained."},"expires_at":{"type":["string","null"],"format":"date-time","description":"Configured retention expiry. The usual default is 24 hours, but clients must trust this timestamp."},"credits_used":{"type":"integer","minimum":0},"watermarked":{"type":"boolean","description":"Whether the separate Capturewell watermark is currently present."},"watermark_removal":{"$ref":"#\/components\/schemas\/WatermarkRemoval"},"recipe":{"oneOf":[{"$ref":"#\/components\/schemas\/CaptureRecipeSummary"},{"type":"null"}]},"created_at":{"type":["string","null"],"format":"date-time"},"metadata":{"oneOf":[{"$ref":"#\/components\/schemas\/CaptureMetadata"},{"type":"null"}]},"error":{"oneOf":[{"$ref":"#\/components\/schemas\/CaptureStoredError"},{"type":"null"}]}},"example":{"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},"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,"created_at":"2026-07-16T12:00:00+00:00","metadata":{"width":1440,"height":900,"format":"png","bytes":128000,"duration_ms":840},"error":null}},"CaptureOptions":{"type":"object","required":["url","format","quality","full_page","preset","viewport","delay_ms","timeout_ms","wait_until","wait_for_selector","dark_mode","reduced_motion","remove_branding"],"properties":{"url":{"type":"string","format":"uri"},"format":{"type":"string","enum":["png","jpeg","webp","avif"]},"quality":{"type":["integer","null"],"minimum":1,"maximum":100},"full_page":{"type":"boolean"},"preset":{"type":"string","enum":["desktop","desktop_hd","laptop","tablet","tablet_landscape","iphone_16","pixel_10","social_card","open_graph"]},"viewport":{"$ref":"#\/components\/schemas\/CaptureViewport"},"delay_ms":{"type":"integer"},"timeout_ms":{"type":"integer"},"wait_until":{"type":"string","enum":["load","domcontentloaded","networkidle0","networkidle2"]},"wait_for_selector":{"type":["string","null"]},"dark_mode":{"type":"boolean"},"reduced_motion":{"type":"boolean"},"remove_branding":{"type":"boolean"},"watermark":{"$ref":"#\/components\/schemas\/CustomWatermarkSnapshot"}}},"CaptureViewport":{"type":"object","required":["width","height","device_scale_factor","mobile"],"properties":{"width":{"type":"integer"},"height":{"type":"integer"},"device_scale_factor":{"type":"number"},"mobile":{"type":"boolean"}}},"CustomWatermarkSnapshot":{"type":"object","required":["id","name","position","opacity_percent","scale_percent","margin"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"position":{"type":"string","enum":["top-left","top-center","top-right","center-left","center","center-right","bottom-left","bottom-center","bottom-right"]},"opacity_percent":{"type":"integer"},"scale_percent":{"type":"integer"},"margin":{"type":"integer"}}},"CaptureMetadata":{"type":"object","required":["width","height","format","bytes","duration_ms"],"properties":{"width":{"type":["integer","null"]},"height":{"type":["integer","null"]},"format":{"type":"string","enum":["png","jpeg","webp","avif"]},"bytes":{"type":["integer","null"]},"duration_ms":{"type":["integer","null"]}}},"WatermarkRemoval":{"type":"object","required":["eligible","credits","removed_at"],"properties":{"eligible":{"type":"boolean"},"credits":{"type":"integer","minimum":0},"removed_at":{"type":["string","null"],"format":"date-time"}}},"CaptureRecipeSummary":{"type":"object","required":["name","action_count","fallback"],"properties":{"name":{"type":"string","maxLength":80},"action_count":{"type":["integer","null"],"minimum":0,"maximum":5},"fallback":{"oneOf":[{"$ref":"#\/components\/schemas\/CaptureRecipeFallback"},{"type":"null"}]}}},"CaptureRecipeFallback":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}},"CaptureStoredError":{"type":"object","required":["code","message"],"properties":{"code":{"type":["string","null"]},"message":{"type":["string","null"]}}},"CaptureHistoryItem":{"type":"object","required":["id","url","source","status","format","options","width","height","file_size","duration_ms","credits","watermarked","custom_watermarked","watermark_removal","recipe","error_code","error_message","created_at","expires_at","preview_url","thumbnail_url","download_url"],"properties":{"id":{"type":"string"},"url":{"type":"string","format":"uri"},"source":{"type":"string","enum":["api","dashboard","template","schedule"]},"status":{"type":"string","enum":["queued","processing","completed","failed"]},"format":{"type":"string","enum":["png","jpeg","webp","avif"]},"options":{"$ref":"#\/components\/schemas\/CaptureOptions"},"width":{"type":["integer","null"]},"height":{"type":["integer","null"]},"file_size":{"type":["integer","null"]},"duration_ms":{"type":["integer","null"]},"credits":{"type":"integer"},"watermarked":{"type":"boolean"},"custom_watermarked":{"type":"boolean"},"watermark_removal":{"$ref":"#\/components\/schemas\/WatermarkRemoval"},"recipe":{"oneOf":[{"$ref":"#\/components\/schemas\/CaptureRecipeSummary"},{"type":"null"}]},"error_code":{"type":["string","null"]},"error_message":{"type":["string","null"]},"created_at":{"type":["string","null"],"format":"date-time"},"expires_at":{"type":["string","null"],"format":"date-time"},"preview_url":{"type":["string","null"],"format":"uri"},"thumbnail_url":{"type":["string","null"],"format":"uri"},"download_url":{"type":["string","null"],"format":"uri"}}},"RecipeWriteRequest":{"type":"object","required":["name","instructions"],"properties":{"name":{"type":"string","maxLength":80},"instructions":{"type":"string","maxLength":2000}}},"Recipe":{"type":"object","required":["id","name","instructions","created_at","updated_at"],"properties":{"id":{"type":"string","description":"Public ULID."},"name":{"type":"string"},"instructions":{"type":"string"},"created_at":{"type":["string","null"],"format":"date-time"},"updated_at":{"type":["string","null"],"format":"date-time"}},"example":{"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"}},"WatermarkCreateRequest":{"type":"object","required":["name","image","position","opacity_percent","scale_percent","margin"],"properties":{"name":{"type":"string","maxLength":80},"image":{"type":"string","format":"binary","description":"JPG\/JPEG, PNG, or WebP image, at most 512 KiB and 4096 by 4096 pixels."},"position":{"type":"string","enum":["top-left","top-center","top-right","center-left","center","center-right","bottom-left","bottom-center","bottom-right"]},"opacity_percent":{"type":"integer","minimum":10,"maximum":100},"scale_percent":{"type":"integer","minimum":5,"maximum":50},"margin":{"type":"integer","minimum":0,"maximum":200}},"example":{"name":"Product logo","image":"@product-logo.png","position":"bottom-right","opacity_percent":80,"scale_percent":20,"margin":24}},"WatermarkUpdateRequest":{"type":"object","required":["name","position","opacity_percent","scale_percent","margin"],"properties":{"name":{"type":"string","maxLength":80},"position":{"type":"string","enum":["top-left","top-center","top-right","center-left","center","center-right","bottom-left","bottom-center","bottom-right"]},"opacity_percent":{"type":"integer","minimum":10,"maximum":100},"scale_percent":{"type":"integer","minimum":5,"maximum":50},"margin":{"type":"integer","minimum":0,"maximum":200}},"description":"The image field is intentionally absent because image replacement is prohibited."},"Watermark":{"type":"object","required":["id","name","position","opacity_percent","scale_percent","margin","preview_url","created_at","updated_at"],"properties":{"id":{"type":"string","description":"Public ULID."},"name":{"type":"string"},"position":{"type":"string","enum":["top-left","top-center","top-right","center-left","center","center-right","bottom-left","bottom-center","bottom-right"]},"opacity_percent":{"type":"integer"},"scale_percent":{"type":"integer"},"margin":{"type":"integer"},"preview_url":{"type":"string","format":"uri","description":"Authenticated binary image endpoint."},"created_at":{"type":["string","null"],"format":"date-time"},"updated_at":{"type":["string","null"],"format":"date-time"}},"example":{"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"}},"TemplateWriteRequest":{"type":"object","required":["name","url"],"properties":{"name":{"type":"string","maxLength":80},"url":{"type":"string","format":"uri","maxLength":2048,"description":"Required public HTTP or HTTPS URL."},"format":{"type":"string","enum":["png","jpeg","webp","avif"],"default":"png"},"quality":{"type":"integer","minimum":1,"maximum":100,"description":"Non-PNG output defaults to 82; PNG normalizes quality to null."},"full_page":{"type":"boolean","default":false},"preset":{"type":"string","enum":["desktop","desktop_hd","laptop","tablet","tablet_landscape","iphone_16","pixel_10","social_card","open_graph"],"default":"desktop"},"viewport":{"$ref":"#\/components\/schemas\/RequestedViewport"},"device_scale_factor":{"type":"number","minimum":1,"maximum":3},"delay_ms":{"type":"integer","minimum":0,"maximum":10000,"default":0},"timeout_ms":{"type":"integer","minimum":1000,"maximum":60000,"default":30000},"wait_until":{"type":"string","enum":["load","domcontentloaded","networkidle0","networkidle2"],"default":"networkidle2"},"wait_for_selector":{"type":["string","null"],"maxLength":500,"default":null},"dark_mode":{"type":"boolean","default":false},"reduced_motion":{"type":"boolean","default":true},"remove_branding":{"type":"boolean","default":false},"watermark_id":{"type":["string","null"],"description":"Owned watermark public ULID. Requires remove_branding=true and the watermark feature."},"recipe_id":{"type":["string","null"],"description":"Owned recipe public ULID. Subject to the recipe feature gate."}}},"TemplateCaptureOptions":{"type":"object","required":["format","quality","full_page","preset","viewport","delay_ms","timeout_ms","wait_until","wait_for_selector","dark_mode","reduced_motion","remove_branding"],"properties":{"format":{"type":"string","enum":["png","jpeg","webp","avif"]},"quality":{"type":["integer","null"]},"full_page":{"type":"boolean"},"preset":{"type":"string","enum":["desktop","desktop_hd","laptop","tablet","tablet_landscape","iphone_16","pixel_10","social_card","open_graph"]},"viewport":{"$ref":"#\/components\/schemas\/CaptureViewport"},"delay_ms":{"type":"integer"},"timeout_ms":{"type":"integer"},"wait_until":{"type":"string","enum":["load","domcontentloaded","networkidle0","networkidle2"]},"wait_for_selector":{"type":["string","null"]},"dark_mode":{"type":"boolean"},"reduced_motion":{"type":"boolean"},"remove_branding":{"type":"boolean"},"watermark_id":{"type":"string","description":"Stored public ULID when a custom watermark is selected."}}},"TemplateRecipeSummary":{"type":"object","required":["id","name","deleted"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"deleted":{"type":"boolean"}}},"Template":{"type":"object","required":["id","name","url","capture_options","recipe","latest_capture"],"properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"},"url":{"type":"string","format":"uri"},"capture_options":{"$ref":"#\/components\/schemas\/TemplateCaptureOptions"},"recipe":{"oneOf":[{"$ref":"#\/components\/schemas\/TemplateRecipeSummary"},{"type":"null"}]},"latest_capture":{"oneOf":[{"$ref":"#\/components\/schemas\/CaptureHistoryItem"},{"type":"null"}]}},"example":{"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}},"ScheduleWriteRequest":{"type":"object","required":["template_id","enabled","frequency","timezone"],"properties":{"template_id":{"type":"integer","format":"int64","minimum":1,"description":"Owned template identifier."},"enabled":{"type":"boolean"},"frequency":{"type":"string","enum":["hourly","daily","weekly","monthly"]},"time":{"type":["string","null"],"pattern":"^([01][0-9]|2[0-3]):[0-5][0-9]$","description":"Required for daily, weekly, and monthly schedules. Omit or send null for hourly."},"timezone":{"type":"string","description":"Valid timezone identifier, for example Europe\/London."},"weekday":{"type":["integer","null"],"minimum":1,"maximum":7,"description":"ISO weekday 1 through 7. Required only for weekly schedules."},"month_day":{"type":["integer","null"],"minimum":1,"maximum":28,"description":"Required only for monthly schedules."}},"oneOf":[{"properties":{"frequency":{"const":"hourly"},"time":{"type":"null"},"weekday":{"type":"null"},"month_day":{"type":"null"}}},{"required":["time"],"properties":{"frequency":{"const":"daily"},"time":{"type":"string"},"weekday":{"type":"null"},"month_day":{"type":"null"}}},{"required":["time","weekday"],"properties":{"frequency":{"const":"weekly"},"time":{"type":"string"},"weekday":{"type":"integer"},"month_day":{"type":"null"}}},{"required":["time","month_day"],"properties":{"frequency":{"const":"monthly"},"time":{"type":"string"},"weekday":{"type":"null"},"month_day":{"type":"integer"}}}]},"ScheduleTemplateSummary":{"type":"object","required":["id","name","url"],"properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"},"url":{"type":"string","format":"uri"}}},"Schedule":{"type":"object","required":["id","enabled","frequency","time","timezone","weekday","month_day","next_run_at","last_run_at","last_error","template","latest_capture"],"properties":{"id":{"type":"integer","format":"int64"},"enabled":{"type":"boolean"},"frequency":{"type":"string","enum":["hourly","daily","weekly","monthly"]},"time":{"type":["string","null"],"pattern":"^([01][0-9]|2[0-3]):[0-5][0-9]$"},"timezone":{"type":"string"},"weekday":{"type":["integer","null"],"minimum":1,"maximum":7},"month_day":{"type":["integer","null"],"minimum":1,"maximum":28},"next_run_at":{"type":["string","null"],"format":"date-time"},"last_run_at":{"type":["string","null"],"format":"date-time"},"last_error":{"type":["string","null"]},"template":{"oneOf":[{"$ref":"#\/components\/schemas\/ScheduleTemplateSummary"},{"type":"null"}]},"latest_capture":{"oneOf":[{"$ref":"#\/components\/schemas\/CaptureHistoryItem"},{"type":"null"}]}},"example":{"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}},"PaginatorLink":{"type":"object","required":["url","label","active"],"properties":{"url":{"type":["string","null"],"format":"uri"},"label":{"type":"string"},"active":{"type":"boolean"}}},"PaginatorMetadata":{"type":"object","required":["current_page","first_page_url","from","last_page","last_page_url","links","next_page_url","path","per_page","prev_page_url","to","total"],"properties":{"current_page":{"type":"integer"},"first_page_url":{"type":"string","format":"uri"},"from":{"type":["integer","null"]},"last_page":{"type":"integer"},"last_page_url":{"type":"string","format":"uri"},"links":{"type":"array","items":{"$ref":"#\/components\/schemas\/PaginatorLink"}},"next_page_url":{"type":["string","null"],"format":"uri"},"path":{"type":"string","format":"uri"},"per_page":{"type":"integer","const":20},"prev_page_url":{"type":["string","null"],"format":"uri"},"to":{"type":["integer","null"]},"total":{"type":"integer"}}},"CapturePaginator":{"allOf":[{"$ref":"#\/components\/schemas\/PaginatorMetadata"},{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"$ref":"#\/components\/schemas\/Capture"}}}}],"example":{"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":[]}},"RecipePaginator":{"allOf":[{"$ref":"#\/components\/schemas\/PaginatorMetadata"},{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"$ref":"#\/components\/schemas\/Recipe"}}}}],"example":{"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":[]}},"WatermarkPaginator":{"allOf":[{"$ref":"#\/components\/schemas\/PaginatorMetadata"},{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"$ref":"#\/components\/schemas\/Watermark"}}}}],"example":{"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":[]}},"TemplatePaginator":{"allOf":[{"$ref":"#\/components\/schemas\/PaginatorMetadata"},{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"$ref":"#\/components\/schemas\/Template"}}}}],"example":{"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":[]}},"SchedulePaginator":{"allOf":[{"$ref":"#\/components\/schemas\/PaginatorMetadata"},{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"$ref":"#\/components\/schemas\/Schedule"}}}}],"example":{"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":[]}}}}}