{"components":{"responses":{"RequestRateLimited":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RequestRateLimitError"}}},"description":"Request admission rate limit exceeded before work is created. Workspace, API-key, endpoint and applicable feature budgets are shared by synchronous HTML and native job creation. This is distinct from dashboard sign-in limits.","headers":{"Cache-Control":{"schema":{"const":"no-store","type":"string"}},"Retry-After":{"description":"Seconds to wait; matches retry_after_seconds in the body.","schema":{"minimum":1,"type":"integer"}},"Spb-request-id":{"schema":{"format":"uuid","type":"string"}}}}},"schemas":{"AcceptedWorkspaceMember":{"properties":{"accepted":{"enum":[true],"type":"boolean"}},"required":["accepted"],"type":"object"},"AddWorkspaceMember":{"additionalProperties":false,"properties":{"role":{"$ref":"#/components/schemas/WorkspaceRole"},"username":{"maxLength":32,"minLength":3,"pattern":"^[a-z0-9][a-z0-9._-]*[a-z0-9]$","type":"string"}},"required":["username","role"],"type":"object"},"AdminExecutorHealth":{"additionalProperties":false,"properties":{"freshness_seconds":{"maximum":86400,"minimum":1,"type":"integer"},"nodes":{"items":{"$ref":"#/components/schemas/AdminExecutorNode"},"maxItems":200,"type":"array"}},"required":["freshness_seconds","nodes"],"type":"object"},"AdminExecutorNode":{"additionalProperties":false,"properties":{"enabled":{"type":"boolean"},"endpoint":{"type":"string"},"healthy":{"description":"enabled AND a heartbeat inside the freshness horizon; restates the discovery predicate the worker uses.","type":"boolean"},"last_heartbeat_age_seconds":{"description":"null when the node has never sent a heartbeat.","minimum":0,"type":["number","null"]},"max_concurrency":{"minimum":0,"type":"integer"},"node_id":{"type":"string"}},"required":["node_id","endpoint","enabled","max_concurrency","last_heartbeat_age_seconds","healthy"],"type":"object"},"AdminQueueDepth":{"additionalProperties":false,"properties":{"by_status":{"description":"One row per job_status enum value; a closed set of five.","items":{"$ref":"#/components/schemas/AdminQueueStatus"},"maxItems":5,"type":"array"},"oldest_queued_age_seconds":{"minimum":0,"type":"number"},"queued_total":{"format":"int64","minimum":0,"type":"integer"}},"required":["queued_total","oldest_queued_age_seconds","by_status"],"type":"object"},"AdminQueueStatus":{"additionalProperties":false,"properties":{"count":{"format":"int64","minimum":0,"type":"integer"},"oldest_age_seconds":{"description":"Age of the oldest row in this status, measured from available_at; 0 when the status is empty.","minimum":0,"type":"number"},"status":{"enum":["queued","running","succeeded","failed","cancelled"],"type":"string"}},"required":["status","count","oldest_age_seconds"],"type":"object"},"AdminTenantUsage":{"additionalProperties":false,"properties":{"tenants":{"items":{"$ref":"#/components/schemas/AdminTenantUsageRow"},"type":"array"},"window_seconds":{"maximum":2678400,"minimum":60,"type":"integer"}},"required":["window_seconds","tenants"],"type":"object"},"AdminTenantUsageRow":{"additionalProperties":false,"properties":{"credits":{"format":"int64","minimum":0,"type":"integer"},"jobs_failed":{"format":"int64","minimum":0,"type":"integer"},"jobs_succeeded":{"format":"int64","minimum":0,"type":"integer"},"jobs_total":{"format":"int64","minimum":0,"type":"integer"},"team_id":{"format":"uuid","type":"string"},"team_name":{"type":"string"}},"required":["team_id","team_name","credits","jobs_total","jobs_succeeded","jobs_failed"],"type":"object"},"ApiError":{"properties":{"code":{"enum":["Bad Request","Unauthorized","Forbidden","Not Found","Conflict","Gone","Too Many Requests","Internal Server Error","NOT_IMPLEMENTED","Bad Gateway","Service Unavailable","Gateway Timeout"],"type":"string"},"error":{"type":"string"},"request_id":{"format":"uuid","type":"string"}},"required":["error","code","request_id"],"type":"object"},"ApiKeyAuditEntry":{"properties":{"action":{"type":"string"},"actor_user_id":{"description":"Acting dashboard user for lifecycle changes; null for API-key denials or deleted users.","format":"uuid","type":["string","null"]},"created_at":{"format":"date-time","type":"string"},"key_name":{"type":["string","null"]},"subject_id":{"format":"uuid","type":["string","null"]}},"required":["action","created_at","subject_id","key_name","actor_user_id"],"type":"object"},"ApiKeyAuditList":{"properties":{"audit":{"description":"Most recent records first","items":{"$ref":"#/components/schemas/ApiKeyAuditEntry"},"maxItems":200,"type":"array"}},"required":["audit"],"type":"object"},"ApiKeyList":{"properties":{"keys":{"items":{"$ref":"#/components/schemas/ApiKeyMetadata"},"maxItems":200,"type":"array"}},"required":["keys"],"type":"object"},"ApiKeyMetadata":{"properties":{"created_at":{"format":"date-time","type":"string"},"enabled":{"type":"boolean"},"expires_at":{"format":"date-time","type":["string","null"]},"id":{"format":"uuid","type":"string"},"last_used_at":{"format":"date-time","type":["string","null"]},"name":{"type":"string"},"prefix":{"type":"string"},"scopes":{"$ref":"#/components/schemas/ApiKeyScopes"}},"required":["id","name","prefix","enabled","created_at","last_used_at","expires_at","scopes"],"type":"object"},"ApiKeyScope":{"description":"Independent additive API capability, not a role hierarchy. Each API-key operation enforces its x-required-scope. Scraping and job admission require write even for GET/HEAD; pure views require read. Owner grants neither read/write nor dashboard authority.","enum":["read","write","owner"],"type":"string"},"ApiKeyScopes":{"items":{"$ref":"#/components/schemas/ApiKeyScope"},"maxItems":3,"minItems":1,"type":"array","uniqueItems":true},"BillingAccount":{"additionalProperties":false,"properties":{"cancel_at_period_end":{"type":"boolean"},"has_customer":{"type":"boolean"},"has_subscription":{"type":"boolean"},"status":{"description":"free, active, past_due, canceled or incomplete_expired.","type":"string"}},"required":["status","has_customer","has_subscription","cancel_at_period_end"],"type":"object"},"BillingCheckoutSession":{"additionalProperties":false,"properties":{"url":{"description":"Provider checkout URL. Reused while an unexpired checkout for the same plan exists; providers that do not expire a checkout server-side never reuse one.","format":"uri","type":"string"}},"required":["url"],"type":"object"},"BillingEntitlements":{"additionalProperties":false,"properties":{"allow_schedules":{"type":"boolean"},"allow_specialized_apis":{"type":"boolean"},"max_request_bytes":{"minimum":0,"type":"integer"},"max_timeout_ms":{"minimum":0,"type":"integer"},"result_retention_seconds":{"minimum":0,"type":"integer"}},"required":["max_timeout_ms","allow_schedules","max_request_bytes","allow_specialized_apis","result_retention_seconds"],"type":"object"},"BillingPeriod":{"additionalProperties":false,"properties":{"allowance":{"format":"int64","type":"integer"},"concurrency":{"minimum":0,"type":"integer"},"ends_at":{"description":"null for the open-ended free period (infinite timestamp normalized to null).","format":"date-time","type":["string","null"]},"entitlements":{"$ref":"#/components/schemas/BillingEntitlements"},"plan":{"type":"string"},"plan_id":{"type":"string"},"remaining":{"format":"int64","type":"integer"},"reserved":{"format":"int64","type":"integer"},"starts_at":{"format":"date-time","type":"string"},"used":{"format":"int64","type":"integer"}},"required":["plan","plan_id","allowance","used","reserved","remaining","concurrency","starts_at","ends_at","entitlements"],"type":"object"},"BillingPlan":{"additionalProperties":false,"properties":{"allow_schedules":{"type":"boolean"},"allow_specialized_apis":{"type":"boolean"},"amount":{"description":"Monthly price in the smallest currency unit (US cents).","minimum":0,"type":"integer"},"available":{"description":"true only when the active payment provider is configured and this plan has a price id on that provider.","type":"boolean"},"concurrency":{"minimum":0,"type":"integer"},"credits":{"description":"Monthly API credit allowance.","minimum":0,"type":"integer"},"id":{"enum":["hobby","freelance","startup","business","business_plus"],"type":"string"},"max_request_bytes":{"minimum":0,"type":"integer"},"max_timeout_ms":{"minimum":0,"type":"integer"},"name":{"type":"string"},"result_retention_seconds":{"description":"How long settled results are retained before purge, per the plan's entitlement.","minimum":0,"type":"integer"}},"required":["id","name","amount","credits","concurrency","max_timeout_ms","allow_schedules","max_request_bytes","allow_specialized_apis","result_retention_seconds","available"],"type":"object"},"BillingPlanCatalog":{"additionalProperties":false,"properties":{"currency":{"enum":["usd"],"type":"string"},"interval":{"enum":["month"],"type":"string"},"plans":{"items":{"$ref":"#/components/schemas/BillingPlan"},"type":"array"}},"required":["plans","currency","interval"],"type":"object"},"BillingPortalSession":{"additionalProperties":false,"properties":{"url":{"description":"Provider subscription-management portal URL for this workspace's customer. Some providers return a temporary authenticated link.","format":"uri","type":"string"}},"required":["url"],"type":"object"},"BillingSummary":{"additionalProperties":false,"properties":{"account":{"$ref":"#/components/schemas/BillingAccount"},"configured":{"description":"true when the active provider's credentials are complete and its live-mode gate (if any) is satisfied.","type":"boolean"},"live_mode":{"description":"true when the active provider's live-mode flag is set; the dashboard warns before live charges.","type":"boolean"},"period":{"anyOf":[{"$ref":"#/components/schemas/BillingPeriod"},{"type":"null"}],"description":"Current or most recent billing period; null before any period exists."},"provider":{"description":"The active payment provider, or `unconfigured` when BILLING_PROVIDER names a provider this build does not implement.","enum":["paddle","stripe","unconfigured"],"type":"string"}},"required":["account","period","configured","live_mode","provider"],"type":"object"},"BillingUsage":{"properties":{"billing":{"description":"Current usable allowance and reservations; null without active coverage.","type":["object","null"]},"credits_used":{"description":"Lifetime settled credits; not the current period counter.","format":"int64","minimum":0,"type":"integer"},"current_concurrency":{"minimum":0,"type":"integer"},"max_api_credit":{"format":"int64","minimum":0,"type":"integer"},"max_concurrency":{"minimum":0,"type":"integer"},"renewal_subscription_date":{"format":"date-time","type":["string","null"]},"requests":{"description":"Lifetime delivered job outcomes, including free transparent responses.","format":"int64","minimum":0,"type":"integer"},"used_api_credit":{"format":"int64","minimum":0,"type":"integer"}},"required":["max_api_credit","used_api_credit","max_concurrency","current_concurrency","renewal_subscription_date","credits_used","requests","billing"],"type":"object"},"BillingWebhookAck":{"additionalProperties":false,"properties":{"received":{"description":"true once the event was verified and processed or safely ignored; duplicate events return the same body.","enum":[true],"type":"boolean"}},"required":["received"],"type":"object"},"CancelledJob":{"description":"Result of cancelling a job; `status` is always `cancelled`.","properties":{"id":{"format":"uuid","type":"string"},"status":{"enum":["cancelled"],"type":"string"}},"required":["id","status"],"type":"object"},"ChangeWorkspaceMemberRole":{"additionalProperties":false,"properties":{"role":{"$ref":"#/components/schemas/WorkspaceRole"}},"required":["role"],"type":"object"},"CreateApiKey":{"additionalProperties":false,"properties":{"expires_in_days":{"default":90,"maximum":365,"minimum":1,"type":"integer"},"name":{"maxLength":120,"minLength":1,"type":"string"},"scopes":{"default":["read","write","owner"],"description":"Omitted or null defaults to all scopes. Otherwise a nonempty subset of read, write and owner; duplicates and unknown scopes are rejected.","items":{"$ref":"#/components/schemas/ApiKeyScope"},"maxItems":3,"minItems":1,"type":["array","null"],"uniqueItems":true}},"required":["name"],"type":"object"},"CreateWorkspace":{"additionalProperties":false,"properties":{"name":{"description":"Trimmed before storage; must contain 1 to 120 UTF-8 bytes after trimming.","minLength":1,"type":"string"}},"required":["name"],"type":"object"},"CreatedApiKey":{"properties":{"expires_at":{"description":"Creation uses the requested lifetime (90 days by default); rotation preserves the existing expiry, including null.","format":"date-time","type":["string","null"]},"id":{"format":"uuid","type":"string"},"key":{"description":"Full secret returned only by creation or rotation, once. Store securely; never returned by list or audit.","type":"string"},"name":{"type":"string"},"prefix":{"type":"string"},"scopes":{"$ref":"#/components/schemas/ApiKeyScopes"}},"required":["id","key","name","prefix","expires_at","scopes"],"type":"object"},"CreatedSchedule":{"properties":{"id":{"format":"uuid","type":"string"},"next_run_at":{"format":"date-time","type":"string"}},"required":["id","next_run_at"],"type":"object"},"CreatedWebhookEndpoint":{"allOf":[{"$ref":"#/components/schemas/WebhookEndpoint"},{"properties":{"secret":{"description":"Signing secret returned only on creation. Store securely; it is never included in list, get or update responses.","readOnly":true,"type":"string"}},"required":["secret"],"type":"object"}]},"CreatedWorkspace":{"properties":{"name":{"type":"string"},"team_id":{"format":"uuid","type":"string"}},"required":["team_id","name"],"type":"object"},"DashboardAccount":{"properties":{"removed":{"description":"Present on /auth/email/remove","enum":[true],"type":"boolean"},"user":{"$ref":"#/components/schemas/DashboardUser"},"verified":{"description":"Present on /auth/email/confirm","enum":[true],"type":"boolean"}},"required":["user"],"type":"object"},"DashboardAccountCreated":{"additionalProperties":false,"properties":{"created":{"description":"true once the account, its workspace and its owner membership were created. The account is not signed in automatically.","enum":[true],"type":"boolean"}},"required":["created"],"type":"object"},"DashboardRequestAccepted":{"additionalProperties":false,"properties":{"requested":{"description":"true once the request was persisted (access request) or the email was accepted by the configured SMTP transport (registration, password recovery). Known and unknown addresses return the same body.","enum":[true],"type":"boolean"}},"required":["requested"],"type":"object"},"DashboardSession":{"properties":{"csrf_token":{"description":"Send as X-CSRF-Token for cookie-authenticated platform operations, including workspace reads.","type":"string"},"user":{"$ref":"#/components/schemas/DashboardUser"}},"required":["user","csrf_token"],"type":"object"},"DashboardSignedOut":{"additionalProperties":false,"properties":{"signed_out":{"description":"true once the session was revoked and the browser cookie cleared: password recovery, logout and password change all return this after revoking every session.","enum":[true],"type":"boolean"}},"required":["signed_out"],"type":"object"},"DashboardUser":{"properties":{"email":{"description":"Optional linked address; null when none is linked. Usable as a login identifier only when email_verified is true.","format":"email","type":["string","null"]},"email_verified":{"description":"Whether the linked address has been proved with a single-use token.","type":"boolean"},"id":{"format":"uuid","type":"string"},"name":{"type":"string"},"role":{"$ref":"#/components/schemas/WorkspaceRole"},"team_id":{"description":"Currently selected workspace","format":"uuid","type":"string"},"team_name":{"description":"Currently selected workspace name","type":"string"},"username":{"description":"Primary login identifier. Lower-case ASCII letters, digits, dot, underscore and hyphen; starts and ends alphanumeric.","maxLength":32,"minLength":3,"type":"string"}},"required":["id","username","email","email_verified","name","team_id","team_name","role"],"type":"object"},"DeletedSchedule":{"properties":{"success":{"enum":[true],"type":"boolean"}},"required":["success"],"type":"object"},"EnqueuedScheduleRun":{"description":"A manually-triggered run was enqueued as a job. `status` is `queued`.","properties":{"id":{"format":"uuid","type":"string"},"request_id":{"format":"uuid","type":"string"},"schedule_id":{"format":"uuid","type":"string"},"status":{"enum":["queued"],"type":"string"}},"required":["id","request_id","status","schedule_id"],"type":"object"},"JobAccepted":{"description":"A job was admitted to the queue. Mirrors the 202 body of a synchronous async scrape.","properties":{"id":{"format":"uuid","type":"string"},"request_id":{"format":"uuid","type":"string"},"status":{"$ref":"#/components/schemas/JobStatus"}},"required":["id","request_id","status"],"type":"object"},"JobAttempt":{"properties":{"attempt_number":{"minimum":1,"type":"integer"},"completed_at":{"format":"date-time","type":["string","null"]},"error":{"type":["string","null"]},"executor_node":{"type":["string","null"]},"id":{"format":"uuid","type":"string"},"started_at":{"format":"date-time","type":["string","null"]},"status":{"$ref":"#/components/schemas/JobStatus"}},"required":["id","attempt_number","status","executor_node","started_at","completed_at","error"],"type":"object"},"JobAttemptList":{"properties":{"attempts":{"items":{"$ref":"#/components/schemas/JobAttempt"},"type":"array"}},"required":["attempts"],"type":"object"},"JobDetail":{"description":"One job's stored fields. `url` is the request URL, not the resolved URL; the resolved URL is only exposed on a result.","properties":{"attempt_count":{"minimum":0,"type":"integer"},"completed_at":{"format":"date-time","type":["string","null"]},"created_at":{"format":"date-time","type":"string"},"error":{"type":["string","null"]},"id":{"format":"uuid","type":"string"},"max_attempts":{"minimum":1,"type":"integer"},"request_id":{"format":"uuid","type":"string"},"schedule_id":{"format":"uuid","type":["string","null"]},"scheduled_for":{"format":"date-time","type":["string","null"]},"started_at":{"format":"date-time","type":["string","null"]},"status":{"$ref":"#/components/schemas/JobStatus"},"url":{"description":"The request URL recorded at admission.","type":["string","null"]}},"required":["id","request_id","url","status","schedule_id","scheduled_for","attempt_count","max_attempts","created_at","started_at","completed_at","error"],"type":"object"},"JobPage":{"description":"A bounded page of the caller's jobs, newest first. `next_cursor` is null at the end.","properties":{"jobs":{"items":{"$ref":"#/components/schemas/JobSummary"},"maxItems":100,"type":"array"},"next_cursor":{"type":["string","null"]}},"required":["jobs","next_cursor"],"type":"object"},"JobStatus":{"enum":["queued","running","succeeded","failed","cancelled"],"type":"string"},"JobSummary":{"description":"A job as listed by pagination, including the request URL but not the resolved URL.","properties":{"attempt_count":{"minimum":0,"type":"integer"},"completed_at":{"format":"date-time","type":["string","null"]},"created_at":{"format":"date-time","type":"string"},"error":{"type":["string","null"]},"id":{"format":"uuid","type":"string"},"request_id":{"format":"uuid","type":"string"},"schedule_id":{"format":"uuid","type":["string","null"]},"scheduled_for":{"format":"date-time","type":["string","null"]},"status":{"$ref":"#/components/schemas/JobStatus"},"url":{"type":["string","null"]}},"required":["id","request_id","url","status","schedule_id","scheduled_for","attempt_count","created_at","completed_at","error"],"type":"object"},"RemovedWorkspaceMember":{"properties":{"removed":{"enum":[true],"type":"boolean"}},"required":["removed"],"type":"object"},"RequestRateLimitError":{"properties":{"code":{"const":"RATE_LIMITED","type":"string"},"error":{"const":"Request rate limit exceeded","type":"string"},"request_id":{"format":"uuid","type":"string"},"retry_after_seconds":{"format":"int64","minimum":1,"type":"integer"}},"required":["error","code","request_id","retry_after_seconds"],"type":"object"},"RevokedApiKey":{"properties":{"revoked":{"enum":[true],"type":"boolean"}},"required":["revoked"],"type":"object"},"Schedule":{"description":"A stored schedule returned by get/patch. Adds the saved `request` template (decrypted) and the audit timestamps; `team_id` is never included.","properties":{"catch_up_limit":{"maximum":100,"minimum":1,"type":"integer"},"created_at":{"format":"date-time","type":"string"},"cron_expression":{"type":["string","null"]},"enabled":{"type":"boolean"},"id":{"format":"uuid","type":"string"},"interval_seconds":{"minimum":1,"type":["integer","null"]},"jitter_seconds":{"maximum":3600,"minimum":0,"type":"integer"},"kind":{"enum":["cron","interval"],"type":"string"},"last_run_at":{"format":"date-time","type":["string","null"]},"max_concurrent_runs":{"maximum":100,"minimum":1,"type":"integer"},"misfire_policy":{"enum":["skip","run_once","catch_up"],"type":"string"},"name":{"type":"string"},"next_run_at":{"format":"date-time","type":"string"},"overlap_policy":{"enum":["skip","allow"],"type":"string"},"request":{"description":"Saved HTML request template.","type":"object"},"result_retention_seconds":{"maximum":31536000,"minimum":3600,"type":["integer","null"]},"run_retention_seconds":{"maximum":31536000,"minimum":3600,"type":"integer"},"timezone":{"type":"string"},"updated_at":{"format":"date-time","type":"string"},"webhook_endpoint_ids":{"items":{"format":"uuid","type":"string"},"type":["array","null"]}},"required":["id","name","kind","cron_expression","interval_seconds","timezone","request","enabled","next_run_at","last_run_at","created_at","updated_at","max_concurrent_runs","overlap_policy","misfire_policy","catch_up_limit","jitter_seconds","run_retention_seconds","webhook_endpoint_ids","result_retention_seconds"],"type":"object"},"ScheduleEnabled":{"properties":{"enabled":{"type":"boolean"},"id":{"format":"uuid","type":"string"}},"required":["id","enabled"],"type":"object"},"ScheduleRun":{"description":"One retained schedule run. History is independent of job/result retention; `job_id` becomes null after job cleanup.","properties":{"attempt_count":{"minimum":0,"type":"integer"},"completed_at":{"format":"date-time","type":["string","null"]},"created_at":{"format":"date-time","type":"string"},"error":{"type":["string","null"]},"expires_at":{"format":"date-time","type":["string","null"]},"id":{"format":"uuid","type":"string"},"job_id":{"format":"uuid","type":["string","null"]},"reason":{"type":["string","null"]},"request_id":{"format":"uuid","type":["string","null"]},"response_status":{"type":["integer","null"]},"schedule_id":{"format":"uuid","type":"string"},"scheduled_for":{"format":"date-time","type":["string","null"]},"started_at":{"format":"date-time","type":["string","null"]},"status":{"enum":["queued","running","succeeded","failed","cancelled","skipped"],"type":"string"},"trigger_kind":{"enum":["scheduled","manual"],"type":"string"},"url":{"type":["string","null"]}},"required":["id","schedule_id","job_id","request_id","scheduled_for","trigger_kind","status","reason","url","attempt_count","response_status","error","started_at","completed_at","created_at","expires_at"],"type":"object"},"ScheduleRunPage":{"description":"A bounded page of retained schedule runs, newest first. `next_cursor` is null at the end.","properties":{"next_cursor":{"type":["string","null"]},"runs":{"items":{"$ref":"#/components/schemas/ScheduleRun"},"maxItems":100,"type":"array"}},"required":["runs","next_cursor"],"type":"object"},"ScheduleSummary":{"description":"A schedule as returned by the list route: every stored field except the saved `request` template and `team_id`.","properties":{"catch_up_limit":{"maximum":100,"minimum":1,"type":"integer"},"cron_expression":{"type":["string","null"]},"enabled":{"type":"boolean"},"id":{"format":"uuid","type":"string"},"interval_seconds":{"minimum":1,"type":["integer","null"]},"jitter_seconds":{"maximum":3600,"minimum":0,"type":"integer"},"kind":{"enum":["cron","interval"],"type":"string"},"last_run_at":{"format":"date-time","type":["string","null"]},"max_concurrent_runs":{"maximum":100,"minimum":1,"type":"integer"},"misfire_policy":{"enum":["skip","run_once","catch_up"],"type":"string"},"name":{"type":"string"},"next_run_at":{"format":"date-time","type":"string"},"overlap_policy":{"enum":["skip","allow"],"type":"string"},"result_retention_seconds":{"maximum":31536000,"minimum":3600,"type":["integer","null"]},"run_retention_seconds":{"maximum":31536000,"minimum":3600,"type":"integer"},"timezone":{"type":"string"},"webhook_endpoint_ids":{"items":{"format":"uuid","type":"string"},"type":["array","null"]}},"required":["id","name","kind","cron_expression","interval_seconds","timezone","enabled","next_run_at","last_run_at","max_concurrent_runs","overlap_policy","misfire_policy","catch_up_limit","jitter_seconds","run_retention_seconds","webhook_endpoint_ids","result_retention_seconds"],"type":"object"},"ScheduleSummaryList":{"properties":{"schedules":{"items":{"$ref":"#/components/schemas/ScheduleSummary"},"type":"array"}},"required":["schedules"],"type":"object"},"ScrapingConfig":{"properties":{"created_at":{"format":"date-time","type":"string"},"id":{"format":"uuid","type":"string"},"name":{"description":"Unique per workspace, trimmed; 1 to 128 bytes with no control characters.","maxLength":128,"minLength":1,"type":"string"},"request":{"additionalProperties":{"type":["string","boolean","number","null"]},"description":"Base request template. Scalar values only; `_`-prefixed internal parameters are rejected. The incoming request's explicit parameters override these, and the name key is never persisted into the job.","type":"object"},"updated_at":{"format":"date-time","type":"string"}},"required":["id","name","request","created_at","updated_at"],"type":"object"},"SuccessAck":{"additionalProperties":false,"properties":{"success":{"description":"true once the delete committed. The configuration is gone for this workspace; jobs already created are unaffected.","enum":[true],"type":"boolean"}},"required":["success"],"type":"object"},"SwitchedWorkspace":{"properties":{"switched":{"enum":[true],"type":"boolean"},"team_id":{"format":"uuid","type":"string"}},"required":["switched","team_id"],"type":"object"},"UpdatedWorkspaceMember":{"properties":{"updated":{"enum":[true],"type":"boolean"}},"required":["updated"],"type":"object"},"UsageEvent":{"additionalProperties":false,"properties":{"adapter":{"type":"string"},"api_key_id":{"format":"uuid","type":["string","null"]},"attempt_id":{"format":"uuid","type":["string","null"]},"browser_ms":{"format":"int64","minimum":0,"type":["integer","null"]},"country":{"type":["string","null"]},"created_at":{"format":"date-time","type":"string"},"credits":{"minimum":0,"type":"integer"},"endpoint":{"type":"string"},"execution_latency_ms":{"format":"int64","minimum":0,"type":"integer"},"executor_node":{"type":["string","null"]},"id":{"format":"uuid","type":"string"},"job_id":{"format":"uuid","type":"string"},"proxy_class":{"type":["string","null"]},"queue_latency_ms":{"format":"int64","minimum":0,"type":"integer"},"retry_class":{"type":["string","null"]},"status":{"type":"string"},"strategy":{"type":["string","null"]},"team_id":{"format":"uuid","type":"string"},"transferred_bytes":{"format":"int64","minimum":0,"type":"integer"}},"required":["id","team_id","api_key_id","job_id","attempt_id","endpoint","adapter","strategy","proxy_class","country","credits","transferred_bytes","browser_ms","queue_latency_ms","execution_latency_ms","status","retry_class","executor_node","created_at"],"type":"object"},"UsageEventPage":{"additionalProperties":false,"properties":{"events":{"items":{"$ref":"#/components/schemas/UsageEvent"},"maxItems":100,"type":"array"},"next_cursor":{"description":"Opaque keyset cursor for the next page; null when this is the last page.","type":["string","null"]}},"required":["events","next_cursor"],"type":"object"},"WebhookDelivery":{"properties":{"attempt_count":{"maximum":8,"minimum":0,"type":"integer"},"completed_at":{"format":"date-time","type":["string","null"]},"created_at":{"format":"date-time","type":"string"},"event_id":{"format":"uuid","type":"string"},"event_type":{"enum":["job.succeeded","job.failed","job.cancelled"],"type":"string"},"id":{"format":"uuid","type":"string"},"last_error":{"type":["string","null"]},"last_status":{"type":["integer","null"]},"max_attempts":{"maximum":8,"minimum":1,"type":"integer"},"next_attempt_at":{"format":"date-time","type":"string"},"payload":{"description":"Exact serialized JSON event, not an embedded object. Contains id, type, created_at and data {job_id, status, response_status}; excludes request URL, headers and result body.","type":"string"},"status":{"enum":["pending","delivering","succeeded","failed"],"type":"string"}},"required":["id","event_id","event_type","payload","status","attempt_count","max_attempts","next_attempt_at","last_status","last_error","created_at","completed_at"],"type":"object"},"WebhookEndpoint":{"properties":{"created_at":{"format":"date-time","type":"string"},"enabled":{"type":"boolean"},"id":{"format":"uuid","type":"string"},"name":{"type":"string"},"updated_at":{"format":"date-time","type":"string"},"url":{"format":"uri","type":"string"}},"required":["id","name","url","enabled","created_at","updated_at"],"type":"object"},"Workspace":{"properties":{"name":{"type":"string"},"role":{"$ref":"#/components/schemas/WorkspaceRole"},"selected":{"description":"Whether this workspace is selected in the current session","type":"boolean"},"team_id":{"format":"uuid","type":"string"}},"required":["team_id","name","role","selected"],"type":"object"},"WorkspaceList":{"properties":{"workspaces":{"items":{"$ref":"#/components/schemas/Workspace"},"type":"array"}},"required":["workspaces"],"type":"object"},"WorkspaceMember":{"properties":{"email":{"description":"Linked address, or null when the account has none.","format":"email","type":["string","null"]},"name":{"type":"string"},"role":{"$ref":"#/components/schemas/WorkspaceRole"},"user_id":{"format":"uuid","type":"string"},"username":{"description":"Primary login identifier; always present, unlike email.","maxLength":32,"minLength":3,"type":"string"}},"required":["user_id","name","username","email","role"],"type":"object"},"WorkspaceMemberList":{"properties":{"members":{"items":{"$ref":"#/components/schemas/WorkspaceMember"},"type":"array"}},"required":["members"],"type":"object"},"WorkspaceRole":{"description":"Membership role within a workspace. Session permissions use the role in the currently selected workspace.","enum":["owner","member","viewer"],"type":"string"}},"securitySchemes":{"bearerAuth":{"scheme":"bearer","type":"http"},"csrfToken":{"in":"header","name":"X-CSRF-Token","type":"apiKey"},"dashboardSession":{"in":"cookie","name":"__Host-scrapingcow_session","type":"apiKey"},"queryApiKey":{"in":"query","name":"api_key","type":"apiKey"}}},"info":{"description":"ScrapingCow API contract. AI and agentic operations are explicitly marked TBD. Full inherited compatibility is incomplete.","title":"ScrapingCow Scraping API","version":"0.1.0"},"openapi":"3.1.0","paths":{"/api/v1":{"get":{"deprecated":false,"description":"Compatibility operation dispatched to an Astra execution node. Full inherited compatibility is incomplete.","operationId":"html","parameters":[{"in":"query","name":"api_key","required":false,"schema":{"type":"string"}},{"in":"query","name":"url","required":true,"schema":{"format":"uri","pattern":"^https?://","type":"string"}},{"in":"query","name":"block_ads","required":false,"schema":{"default":false,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"block_resources","required":false,"schema":{"default":true,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"cookies","required":false,"schema":{"type":"string"}},{"in":"query","name":"country_code","required":false,"schema":{"type":"string"}},{"in":"query","name":"device","required":false,"schema":{"default":"desktop","enum":["desktop","mobile"],"type":"string"}},{"in":"query","name":"extract_rules","required":false,"schema":{"contentMediaType":"application/json","contentSchema":{"type":"object"},"type":"string"}},{"in":"query","name":"forward_headers","required":false,"schema":{"default":false,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"forward_headers_pure","required":false,"schema":{"default":false,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"js_scenario","required":false,"schema":{"contentMediaType":"application/json","contentSchema":{"type":"object"},"type":"string"}},{"in":"query","name":"json_response","required":false,"schema":{"default":false,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"max_cost","required":false,"schema":{"minimum":1,"type":"integer"}},{"in":"query","name":"mode","required":false,"schema":{"enum":["","auto"],"type":"string"}},{"in":"query","name":"own_proxy","required":false,"schema":{"type":"string"}},{"in":"query","name":"premium_proxy","required":false,"schema":{"default":false,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"render_js","required":false,"schema":{"default":true,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"return_page_markdown","required":false,"schema":{"default":false,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"return_page_source","required":false,"schema":{"default":false,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"return_page_text","required":false,"schema":{"default":false,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"scraping_config","required":false,"schema":{"type":"string"}},{"in":"query","name":"screenshot","required":false,"schema":{"default":false,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"screenshot_full_page","required":false,"schema":{"default":false,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"screenshot_selector","required":false,"schema":{"type":"string"}},{"in":"query","name":"session_id","required":false,"schema":{"type":"string"}},{"in":"query","name":"stealth_proxy","required":false,"schema":{"default":false,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"tag","required":false,"schema":{"type":"string"}},{"in":"query","name":"timeout","required":false,"schema":{"default":140000,"maximum":140000,"minimum":1000,"type":"integer"}},{"in":"query","name":"transparent_status_code","required":false,"schema":{"default":false,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"wait","required":false,"schema":{"default":0,"maximum":35000,"minimum":0,"type":"integer"}},{"in":"query","name":"wait_browser","required":false,"schema":{"default":"domcontentloaded","enum":["domcontentloaded","load","networkidle0","networkidle2"],"type":"string"}},{"in":"query","name":"wait_for","required":false,"schema":{"type":"string"}},{"in":"query","name":"window_height","required":false,"schema":{"default":1080,"minimum":1,"type":"integer"}},{"in":"query","name":"window_width","required":false,"schema":{"default":1920,"minimum":1,"type":"integer"}},{"in":"query","name":"ai_extract_rules","required":false,"schema":{"type":"string"}},{"in":"query","name":"ai_query","required":false,"schema":{"type":"string"}},{"in":"query","name":"ai_selector","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful compatible response"},"400":{"description":"Invalid parameters"},"401":{"description":"Invalid API key"},"403":{"description":"API key lacks the required scope"},"429":{"$ref":"#/components/responses/RequestRateLimited"},"501":{"description":"Documented TBD operation"}},"security":[{"bearerAuth":[]},{"queryApiKey":[]}],"summary":"html","x-contract-evidence":{"evidenceGaps":["No documented mutual exclusion or precedence among return_page_* and extraction/screenshot outputs; do not invent 400 rules","session_id is an opaque caller-chosen label with no enforced format or length range","Viewport maxima and country/provider allowlists require a compatibility fixture"],"retrieved":"2026-09-17","source":"internal://scrapingcow/contract/html","version":"scrapingcow-contract-2026-09-17.1"},"x-cross-parameter-rules":["max_cost requires mode=auto","mode=auto excludes render_js, premium_proxy, stealth_proxy, transparent_status_code","screenshot requires render_js=true","screenshot_full_page requires render_js=true","screenshot_selector requires render_js=true","stealth_proxy requires render_js=true","mode=auto requires the GET method"],"x-required-scope":"write"},"post":{"deprecated":false,"description":"Compatibility operation dispatched to an Astra execution node. Full inherited compatibility is incomplete.","operationId":"html_post","parameters":[{"in":"query","name":"api_key","required":false,"schema":{"type":"string"}},{"in":"query","name":"url","required":true,"schema":{"format":"uri","pattern":"^https?://","type":"string"}},{"in":"query","name":"block_ads","required":false,"schema":{"default":false,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"block_resources","required":false,"schema":{"default":true,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"cookies","required":false,"schema":{"type":"string"}},{"in":"query","name":"country_code","required":false,"schema":{"type":"string"}},{"in":"query","name":"device","required":false,"schema":{"default":"desktop","enum":["desktop","mobile"],"type":"string"}},{"in":"query","name":"extract_rules","required":false,"schema":{"contentMediaType":"application/json","contentSchema":{"type":"object"},"type":"string"}},{"in":"query","name":"forward_headers","required":false,"schema":{"default":false,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"forward_headers_pure","required":false,"schema":{"default":false,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"js_scenario","required":false,"schema":{"contentMediaType":"application/json","contentSchema":{"type":"object"},"type":"string"}},{"in":"query","name":"json_response","required":false,"schema":{"default":false,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"max_cost","required":false,"schema":{"minimum":1,"type":"integer"}},{"in":"query","name":"mode","required":false,"schema":{"enum":["","auto"],"type":"string"}},{"in":"query","name":"own_proxy","required":false,"schema":{"type":"string"}},{"in":"query","name":"premium_proxy","required":false,"schema":{"default":false,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"render_js","required":false,"schema":{"default":true,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"return_page_markdown","required":false,"schema":{"default":false,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"return_page_source","required":false,"schema":{"default":false,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"return_page_text","required":false,"schema":{"default":false,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"scraping_config","required":false,"schema":{"type":"string"}},{"in":"query","name":"screenshot","required":false,"schema":{"default":false,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"screenshot_full_page","required":false,"schema":{"default":false,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"screenshot_selector","required":false,"schema":{"type":"string"}},{"in":"query","name":"session_id","required":false,"schema":{"type":"string"}},{"in":"query","name":"stealth_proxy","required":false,"schema":{"default":false,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"tag","required":false,"schema":{"type":"string"}},{"in":"query","name":"timeout","required":false,"schema":{"default":140000,"maximum":140000,"minimum":1000,"type":"integer"}},{"in":"query","name":"transparent_status_code","required":false,"schema":{"default":false,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"wait","required":false,"schema":{"default":0,"maximum":35000,"minimum":0,"type":"integer"}},{"in":"query","name":"wait_browser","required":false,"schema":{"default":"domcontentloaded","enum":["domcontentloaded","load","networkidle0","networkidle2"],"type":"string"}},{"in":"query","name":"wait_for","required":false,"schema":{"type":"string"}},{"in":"query","name":"window_height","required":false,"schema":{"default":1080,"minimum":1,"type":"integer"}},{"in":"query","name":"window_width","required":false,"schema":{"default":1920,"minimum":1,"type":"integer"}},{"in":"query","name":"ai_extract_rules","required":false,"schema":{"type":"string"}},{"in":"query","name":"ai_query","required":false,"schema":{"type":"string"}},{"in":"query","name":"ai_selector","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{"application/octet-stream":{"schema":{"format":"binary","type":"string"}}}},"responses":{"200":{"description":"Successful compatible response"},"400":{"description":"Invalid parameters"},"401":{"description":"Invalid API key"},"403":{"description":"API key lacks the required scope"},"429":{"$ref":"#/components/responses/RequestRateLimited"},"501":{"description":"Documented TBD operation"}},"security":[{"bearerAuth":[]},{"queryApiKey":[]}],"summary":"html","x-contract-evidence":{"evidenceGaps":["No documented mutual exclusion or precedence among return_page_* and extraction/screenshot outputs; do not invent 400 rules","session_id is an opaque caller-chosen label with no enforced format or length range","Viewport maxima and country/provider allowlists require a compatibility fixture"],"retrieved":"2026-09-17","source":"internal://scrapingcow/contract/html","version":"scrapingcow-contract-2026-09-17.1"},"x-cross-parameter-rules":["max_cost requires mode=auto","mode=auto excludes render_js, premium_proxy, stealth_proxy, transparent_status_code","screenshot requires render_js=true","screenshot_full_page requires render_js=true","screenshot_selector requires render_js=true","stealth_proxy requires render_js=true","mode=auto requires the GET method"],"x-required-scope":"write"},"put":{"deprecated":false,"description":"Compatibility operation dispatched to an Astra execution node. Full inherited compatibility is incomplete.","operationId":"html_put","parameters":[{"in":"query","name":"api_key","required":false,"schema":{"type":"string"}},{"in":"query","name":"url","required":true,"schema":{"format":"uri","pattern":"^https?://","type":"string"}},{"in":"query","name":"block_ads","required":false,"schema":{"default":false,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"block_resources","required":false,"schema":{"default":true,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"cookies","required":false,"schema":{"type":"string"}},{"in":"query","name":"country_code","required":false,"schema":{"type":"string"}},{"in":"query","name":"device","required":false,"schema":{"default":"desktop","enum":["desktop","mobile"],"type":"string"}},{"in":"query","name":"extract_rules","required":false,"schema":{"contentMediaType":"application/json","contentSchema":{"type":"object"},"type":"string"}},{"in":"query","name":"forward_headers","required":false,"schema":{"default":false,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"forward_headers_pure","required":false,"schema":{"default":false,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"js_scenario","required":false,"schema":{"contentMediaType":"application/json","contentSchema":{"type":"object"},"type":"string"}},{"in":"query","name":"json_response","required":false,"schema":{"default":false,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"max_cost","required":false,"schema":{"minimum":1,"type":"integer"}},{"in":"query","name":"mode","required":false,"schema":{"enum":["","auto"],"type":"string"}},{"in":"query","name":"own_proxy","required":false,"schema":{"type":"string"}},{"in":"query","name":"premium_proxy","required":false,"schema":{"default":false,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"render_js","required":false,"schema":{"default":true,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"return_page_markdown","required":false,"schema":{"default":false,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"return_page_source","required":false,"schema":{"default":false,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"return_page_text","required":false,"schema":{"default":false,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"scraping_config","required":false,"schema":{"type":"string"}},{"in":"query","name":"screenshot","required":false,"schema":{"default":false,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"screenshot_full_page","required":false,"schema":{"default":false,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"screenshot_selector","required":false,"schema":{"type":"string"}},{"in":"query","name":"session_id","required":false,"schema":{"type":"string"}},{"in":"query","name":"stealth_proxy","required":false,"schema":{"default":false,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"tag","required":false,"schema":{"type":"string"}},{"in":"query","name":"timeout","required":false,"schema":{"default":140000,"maximum":140000,"minimum":1000,"type":"integer"}},{"in":"query","name":"transparent_status_code","required":false,"schema":{"default":false,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"wait","required":false,"schema":{"default":0,"maximum":35000,"minimum":0,"type":"integer"}},{"in":"query","name":"wait_browser","required":false,"schema":{"default":"domcontentloaded","enum":["domcontentloaded","load","networkidle0","networkidle2"],"type":"string"}},{"in":"query","name":"wait_for","required":false,"schema":{"type":"string"}},{"in":"query","name":"window_height","required":false,"schema":{"default":1080,"minimum":1,"type":"integer"}},{"in":"query","name":"window_width","required":false,"schema":{"default":1920,"minimum":1,"type":"integer"}},{"in":"query","name":"ai_extract_rules","required":false,"schema":{"type":"string"}},{"in":"query","name":"ai_query","required":false,"schema":{"type":"string"}},{"in":"query","name":"ai_selector","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{"application/octet-stream":{"schema":{"format":"binary","type":"string"}}}},"responses":{"200":{"description":"Successful compatible response"},"400":{"description":"Invalid parameters"},"401":{"description":"Invalid API key"},"403":{"description":"API key lacks the required scope"},"429":{"$ref":"#/components/responses/RequestRateLimited"},"501":{"description":"Documented TBD operation"}},"security":[{"bearerAuth":[]},{"queryApiKey":[]}],"summary":"html","x-contract-evidence":{"evidenceGaps":["No documented mutual exclusion or precedence among return_page_* and extraction/screenshot outputs; do not invent 400 rules","session_id is an opaque caller-chosen label with no enforced format or length range","Viewport maxima and country/provider allowlists require a compatibility fixture"],"retrieved":"2026-09-17","source":"internal://scrapingcow/contract/html","version":"scrapingcow-contract-2026-09-17.1"},"x-cross-parameter-rules":["max_cost requires mode=auto","mode=auto excludes render_js, premium_proxy, stealth_proxy, transparent_status_code","screenshot requires render_js=true","screenshot_full_page requires render_js=true","screenshot_selector requires render_js=true","stealth_proxy requires render_js=true","mode=auto requires the GET method"],"x-required-scope":"write"}},"/api/v1/amazon/pricing":{"get":{"deprecated":false,"description":"Compatibility operation dispatched to an Astra execution node. Full inherited compatibility is incomplete.","operationId":"amazon_pricing","parameters":[{"in":"query","name":"api_key","required":false,"schema":{"type":"string"}},{"in":"query","name":"asin","required":true,"schema":{"pattern":"^[A-Za-z0-9]{10}$","type":"string"}},{"in":"query","name":"add_html","required":false,"schema":{"default":false,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"country","required":false,"schema":{"type":"string"}},{"in":"query","name":"currency","required":false,"schema":{"type":"string"}},{"in":"query","name":"device","required":false,"schema":{"default":"desktop","enum":["desktop","mobile","tablet"],"type":"string"}},{"in":"query","name":"domain","required":false,"schema":{"default":"com","type":"string"}},{"in":"query","name":"language","required":false,"schema":{"type":"string"}},{"in":"query","name":"light_request","required":false,"schema":{"default":true,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"tag","required":false,"schema":{"type":"string"}},{"in":"query","name":"zip_code","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"example":{"adapter_version":"1.0.0","asin":"LOCALPRICE1","availability":"In stock","offers":[{"price":"$38.97","seller":null},{"price":"$35.07","seller":null}],"price":38.97,"pricing":[{"condition":"New","currency":"USD","delivery":"Ships from Amazon.com","delivery_options":[{"date":{"by":"Tuesday, June 2"},"type":"FREE delivery"}],"price":38.97,"price_shipping":0,"rating_count":17268,"seller":"HOOBRO US","seller_id":"A3SKXH2JUBBQ8Y","seller_link":"https://shop.example.test/gp/aag/main?ie=UTF8&seller=A3SKXH2JUBBQ8Y&isAmazonFulfilled=1&asin=LOCALPRICE1"},{"condition":"Used - Very Good","currency":"USD","delivery":"Ships from Amazon.com","delivery_options":[{"date":{"by":"Wednesday, June 3"},"type":"FREE delivery"}],"price":35.07,"price_shipping":null,"rating_count":null,"seller":"Amazon Resale","seller_id":null,"seller_link":"https://www.amazon.com/Warehouse-Deals/b?ie=UTF8&node=10158976011"}],"schema_version":"1.0.0","title":"Local offer list kettle"},"schema":{"properties":{"adapter_version":{"const":"1.0.0","type":"string"},"asin":{"type":["string","null"]},"availability":{"type":["string","null"]},"offers":{"items":{"properties":{"price":{"type":["string","null"]},"seller":{"type":["string","null"]}},"required":["price","seller"],"type":"object"},"type":"array"},"price":{"type":["number","null"]},"pricing":{"items":{"properties":{"condition":{"type":["string","null"]},"currency":{"type":["string","null"]},"delivery":{"type":["string","null"]},"delivery_options":{"items":{"properties":{"date":{"properties":{"by":{"type":["string","null"]}},"required":["by"],"type":"object"},"type":{"type":["string","null"]}},"required":["type","date"],"type":"object"},"type":"array"},"price":{"type":["number","null"]},"price_shipping":{"type":["number","null"]},"rating_count":{"type":["integer","null"]},"seller":{"type":["string","null"]},"seller_id":{"type":["string","null"]},"seller_link":{"type":["string","null"]}},"required":["condition","currency","delivery","delivery_options","price","price_shipping","rating_count","seller","seller_id","seller_link"],"type":"object"},"type":"array"},"schema_version":{"const":"1.0.0","type":"string"},"title":{"type":["string","null"]}},"required":["schema_version","adapter_version","asin","title","price","availability","offers","pricing"],"type":"object"}}},"description":"Adapter-extracted JSON for the requested operation.","headers":{"Spb-Cost":{"description":"Credits settled for the delivered outcome.","schema":{"type":"string"}},"Spb-Request-Id":{"schema":{"format":"uuid","type":"string"}},"Spb-Resolved-Url":{"description":"URL the adapter actually resolved against.","schema":{"type":"string"}}}},"400":{"description":"Invalid parameters"},"401":{"description":"Invalid API key"},"403":{"description":"API key lacks the required scope"},"429":{"$ref":"#/components/responses/RequestRateLimited"},"501":{"description":"Documented TBD operation"},"502":{"description":"Scrape failed after the job left the queue; the API converts the terminal executor failure to a 502 with an ApiError body"}},"security":[{"bearerAuth":[]},{"queryApiKey":[]}],"summary":"amazon_pricing","x-contract-evidence":{"evidenceGaps":["SPEC requires query; upstream documentation now names asin, and the registry accepts only the documented `asin` — the `query` spelling is not an accepted alias"],"retrieved":"2026-09-17","source":"internal://scrapingcow/contract/amazon","version":"scrapingcow-contract-2026-09-17.1"},"x-required-scope":"write"}},"/api/v1/amazon/product":{"get":{"deprecated":false,"description":"Compatibility operation dispatched to an Astra execution node. Full inherited compatibility is incomplete.","operationId":"amazon_product","parameters":[{"in":"query","name":"api_key","required":false,"schema":{"type":"string"}},{"in":"query","name":"query","required":true,"schema":{"pattern":"^[A-Za-z0-9]{10}$","type":"string"}},{"in":"query","name":"add_html","required":false,"schema":{"default":false,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"country","required":false,"schema":{"type":"string"}},{"in":"query","name":"currency","required":false,"schema":{"type":"string"}},{"in":"query","name":"device","required":false,"schema":{"default":"desktop","enum":["desktop","mobile","tablet"],"type":"string"}},{"in":"query","name":"domain","required":false,"schema":{"default":"com","type":"string"}},{"in":"query","name":"language","required":false,"schema":{"type":"string"}},{"in":"query","name":"light_request","required":false,"schema":{"default":true,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"screenshot","required":false,"schema":{"default":false,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"tag","required":false,"schema":{"type":"string"}},{"in":"query","name":"zip_code","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"example":{"adapter_version":"1.0.0","asin":"LOCAL00001","availability":"In stock","offers":[{"price":"$24.50","seller":"Local fixture shop"},{"price":"$27.00","seller":"Another fixture shop"}],"price":24.5,"schema_version":"1.0.0","title":"Local sample kettle"},"schema":{"properties":{"adapter_version":{"const":"1.0.0","type":"string"},"asin":{"type":["string","null"]},"availability":{"type":["string","null"]},"offers":{"items":{"properties":{"price":{"type":["string","null"]},"seller":{"type":["string","null"]}},"required":["price","seller"],"type":"object"},"type":"array"},"price":{"type":["number","null"]},"schema_version":{"const":"1.0.0","type":"string"},"title":{"type":["string","null"]}},"required":["schema_version","adapter_version","asin","title","price","availability","offers"],"type":"object"}}},"description":"Adapter-extracted JSON for the requested operation.","headers":{"Spb-Cost":{"description":"Credits settled for the delivered outcome.","schema":{"type":"string"}},"Spb-Request-Id":{"schema":{"format":"uuid","type":"string"}},"Spb-Resolved-Url":{"description":"URL the adapter actually resolved against.","schema":{"type":"string"}}}},"400":{"description":"Invalid parameters"},"401":{"description":"Invalid API key"},"403":{"description":"API key lacks the required scope"},"429":{"$ref":"#/components/responses/RequestRateLimited"},"501":{"description":"Documented TBD operation"},"502":{"description":"Scrape failed after the job left the queue; the API converts the terminal executor failure to a 502 with an ApiError body"}},"security":[{"bearerAuth":[]},{"queryApiKey":[]}],"summary":"amazon_product","x-contract-evidence":{"evidenceGaps":[],"retrieved":"2026-09-17","source":"internal://scrapingcow/contract/amazon","version":"scrapingcow-contract-2026-09-17.1"},"x-required-scope":"write"}},"/api/v1/amazon/search":{"get":{"deprecated":false,"description":"Compatibility operation dispatched to an Astra execution node. Full inherited compatibility is incomplete.","operationId":"amazon_search","parameters":[{"in":"query","name":"api_key","required":false,"schema":{"type":"string"}},{"in":"query","name":"query","required":true,"schema":{"type":"string"}},{"in":"query","name":"add_html","required":false,"schema":{"default":false,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"autoselect_variant","required":false,"schema":{"default":false,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"category_id","required":false,"schema":{"type":"string"}},{"in":"query","name":"country","required":false,"schema":{"type":"string"}},{"in":"query","name":"currency","required":false,"schema":{"type":"string"}},{"in":"query","name":"device","required":false,"schema":{"default":"desktop","enum":["desktop","mobile","tablet"],"type":"string"}},{"in":"query","name":"domain","required":false,"schema":{"default":"com","type":"string"}},{"in":"query","name":"language","required":false,"schema":{"type":"string"}},{"in":"query","name":"light_request","required":false,"schema":{"default":true,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"merchant_id","required":false,"schema":{"type":"string"}},{"in":"query","name":"pages","required":false,"schema":{"default":1,"minimum":1,"type":"integer"}},{"in":"query","name":"screenshot","required":false,"schema":{"default":false,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"sort_by","required":false,"schema":{"enum":["","most_recent","price_low_to_high","price_high_to_low","featured","average_review","bestsellers"],"type":"string"}},{"in":"query","name":"start_page","required":false,"schema":{"default":1,"minimum":1,"type":"integer"}},{"in":"query","name":"tag","required":false,"schema":{"type":"string"}},{"in":"query","name":"zip_code","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"example":{"adapter_version":"1.0.0","products":[{"asin":"LOCALSEARCH","organic_position":1,"price":22,"rating":4,"title":"Local search kettle","url":"https://shop.example.test/dp/LOCALSEARCH","url_image":"https://media.example.test/search-kettle.png"}],"schema_version":"1.0.0","search_results":[{"asin":"LOCALSEARCH","organic_position":1,"price":22,"rating":4,"title":"Local search kettle","url":"https://shop.example.test/dp/LOCALSEARCH","url_image":"https://media.example.test/search-kettle.png"}]},"schema":{"properties":{"adapter_version":{"const":"1.0.0","type":"string"},"products":{"items":{"properties":{"asin":{"type":["string","null"]},"organic_position":{"minimum":1,"type":"integer"},"price":{"type":["number","null"]},"rating":{"type":["number","null"]},"title":{"type":["string","null"]},"url":{"type":["string","null"]},"url_image":{"type":["string","null"]}},"required":["organic_position","asin","title","url","price","rating","url_image"],"type":"object"},"type":"array"},"schema_version":{"const":"1.0.0","type":"string"},"search_results":{"items":{"properties":{"asin":{"type":["string","null"]},"organic_position":{"minimum":1,"type":"integer"},"price":{"type":["number","null"]},"rating":{"type":["number","null"]},"title":{"type":["string","null"]},"url":{"type":["string","null"]},"url_image":{"type":["string","null"]}},"required":["organic_position","asin","title","url","price","rating","url_image"],"type":"object"},"type":"array"}},"required":["schema_version","adapter_version","products","search_results"],"type":"object"}}},"description":"Adapter-extracted JSON for the requested operation.","headers":{"Spb-Cost":{"description":"Credits settled for the delivered outcome.","schema":{"type":"string"}},"Spb-Request-Id":{"schema":{"format":"uuid","type":"string"}},"Spb-Resolved-Url":{"description":"URL the adapter actually resolved against.","schema":{"type":"string"}}}},"400":{"description":"Invalid parameters"},"401":{"description":"Invalid API key"},"403":{"description":"API key lacks the required scope"},"429":{"$ref":"#/components/responses/RequestRateLimited"},"501":{"description":"Documented TBD operation"},"502":{"description":"Scrape failed after the job left the queue; the API converts the terminal executor failure to a 502 with an ApiError body"}},"security":[{"bearerAuth":[]},{"queryApiKey":[]}],"summary":"amazon_search","x-contract-evidence":{"evidenceGaps":[],"retrieved":"2026-09-17","source":"internal://scrapingcow/contract/amazon","version":"scrapingcow-contract-2026-09-17.1"},"x-required-scope":"write"}},"/api/v1/bing":{"get":{"deprecated":false,"description":"Compatibility operation dispatched to an Astra execution node. Full inherited compatibility is incomplete.","operationId":"bing_search","parameters":[{"in":"query","name":"api_key","required":false,"schema":{"type":"string"}},{"in":"query","name":"no_cache","required":false,"schema":{"default":false,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"search","required":true,"schema":{"type":"string"}},{"in":"query","name":"country_code","required":false,"schema":{"default":"us","type":"string"}},{"in":"query","name":"language","required":false,"schema":{"type":"string"}},{"in":"query","name":"page","required":false,"schema":{"default":1,"minimum":1,"type":"integer"}},{"in":"query","name":"tag","required":false,"schema":{"type":"string"}},{"in":"query","name":"premium_proxy","required":false,"schema":{"default":false,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"stealth_proxy","required":false,"schema":{"default":false,"type":"boolean","x-query-aliases":["True","False","1","0"]}}],"responses":{"200":{"content":{"application/json":{"example":{"adapter_version":"1.0.0","meta_data":{"number_of_organic_results":3,"url":"https://www.bing.com/search?q=mechanical+keyboard&cc=us"},"organic_results":[{"description":"A guide to mechanical keyboard switches and layouts.","domain":"example.com","link":"https://example.com/keyboard","position":1,"rank":1,"title":"Example Keyboard Guide","url":"https://example.com/keyboard"},{"description":"Cherry, Gateron and Topre compared side by side.","domain":"example.org","link":"https://example.org/classics","position":2,"rank":2,"title":"Classic Switches","url":"https://example.org/classics"},{"description":"A pad with a slash in its query, to exercise base64url decoding.","domain":"example.net","link":"https://example.net/pad?b=2","position":3,"rank":3,"title":"Mobile Pad","url":"https://example.net/pad?b=2"}],"questions":["What is a mechanical keyboard switch?","What is the difference between linear and tactile switches?"],"related_searches":["61 key keyboard","hot swap switches","keycap materials"],"request":{"country_code":"","device":"desktop","engine":"bing","language":"","page":1,"query":""},"schema_version":"1.0.0"},"schema":{"properties":{"adapter_version":{"const":"1.0.0","type":"string"},"meta_data":{"properties":{"duration_seconds":{"minimum":0,"type":"number"},"fetched_at":{"type":"string"},"number_of_organic_results":{"minimum":0,"type":"integer"},"page":{"minimum":1,"type":"integer"},"result_count_estimate":{"type":"string"},"url":{"type":"string"}},"required":["url","number_of_organic_results"],"type":"object"},"organic_results":{"items":{"properties":{"description":{"type":["string","null"]},"domain":{"type":["string","null"]},"link":{"type":["string","null"]},"position":{"minimum":1,"type":"integer"},"rank":{"minimum":1,"type":"integer"},"title":{"type":["string","null"]},"url":{"type":["string","null"]}},"required":["rank","position","title","link","url","description"],"type":"object"},"type":"array"},"questions":{"items":{"type":"string"},"type":"array"},"related_searches":{"items":{"type":"string"},"type":"array"},"request":{"properties":{"country_code":{"type":"string"},"date_range":{"type":"string"},"device":{"type":"string"},"engine":{"type":"string"},"language":{"type":"string"},"page":{"minimum":1,"type":"integer"},"query":{"type":"string"},"search_type":{"type":"string"},"sort_by":{"type":"string"}},"required":["engine","query","country_code","language","device","page"],"type":"object"},"schema_version":{"const":"1.0.0","type":"string"}},"required":["schema_version","adapter_version","request","organic_results","questions","related_searches","meta_data"],"type":"object"}}},"description":"Adapter-extracted JSON for the requested operation.","headers":{"Spb-Cost":{"description":"Credits settled for the delivered outcome.","schema":{"type":"string"}},"Spb-Request-Id":{"schema":{"format":"uuid","type":"string"}},"Spb-Resolved-Url":{"description":"URL the adapter actually resolved against.","schema":{"type":"string"}}}},"400":{"description":"Invalid parameters"},"401":{"description":"Invalid API key"},"403":{"description":"API key lacks the required scope"},"429":{"$ref":"#/components/responses/RequestRateLimited"},"501":{"description":"Documented TBD operation"},"502":{"description":"Scrape failed after the job left the queue; the API converts the terminal executor failure to a 502 with an ApiError body"}},"security":[{"bearerAuth":[]},{"queryApiKey":[]}],"summary":"bing_search","x-contract-evidence":{"evidenceGaps":[],"retrieved":"2026-09-17","source":"internal://scrapingcow/contract/bing","version":"scrapingcow-contract-2026-09-17.1"},"x-required-scope":"write"}},"/api/v1/chatgpt":{"get":{"deprecated":true,"description":"Reserved for future implementation. Returns 501 NOT_IMPLEMENTED.","operationId":"chatgpt","parameters":[{"in":"query","name":"api_key","required":false,"schema":{"type":"string"}},{"in":"query","name":"prompt","required":true,"schema":{"type":"string"}},{"in":"query","name":"tag","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful compatible response"},"400":{"description":"Invalid parameters"},"401":{"description":"Invalid API key"},"403":{"description":"API key lacks the required scope"},"501":{"description":"Documented TBD operation"}},"security":[{"bearerAuth":[]},{"queryApiKey":[]}],"summary":"chatgpt (TBD)","x-contract-evidence":{"evidenceGaps":[],"retrieved":"2026-09-17","source":"internal://scrapingcow/contract/tbd","version":"scrapingcow-contract-2026-09-17.1"},"x-required-scope":"write"}},"/api/v1/employee_search":{"get":{"deprecated":true,"description":"Reserved for future implementation. Returns 501 NOT_IMPLEMENTED.","operationId":"employee_search","parameters":[{"in":"query","name":"api_key","required":false,"schema":{"type":"string"}},{"in":"query","name":"url","required":true,"schema":{"format":"uri","pattern":"^https?://","type":"string"}},{"in":"query","name":"job_title","required":false,"schema":{"type":"string"}},{"in":"query","name":"location","required":false,"schema":{"type":"string"}},{"in":"query","name":"tag","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful compatible response"},"400":{"description":"Invalid parameters"},"401":{"description":"Invalid API key"},"403":{"description":"API key lacks the required scope"},"501":{"description":"Documented TBD operation"}},"security":[{"bearerAuth":[]},{"queryApiKey":[]}],"summary":"employee_search (TBD)","x-contract-evidence":{"evidenceGaps":[],"retrieved":"2026-09-17","source":"internal://scrapingcow/contract/tbd","version":"scrapingcow-contract-2026-09-17.1"},"x-required-scope":"write"}},"/api/v1/fast_search":{"get":{"deprecated":false,"description":"Compatibility operation dispatched to an Astra execution node. Full inherited compatibility is incomplete.","operationId":"fast_search","parameters":[{"in":"query","name":"api_key","required":false,"schema":{"type":"string"}},{"in":"query","name":"no_cache","required":false,"schema":{"default":false,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"search","required":true,"schema":{"type":"string"}},{"in":"query","name":"country_code","required":false,"schema":{"default":"us","type":"string"}},{"in":"query","name":"language","required":false,"schema":{"type":"string"}},{"in":"query","name":"page","required":false,"schema":{"default":1,"minimum":1,"type":"integer"}},{"in":"query","name":"tag","required":false,"schema":{"type":"string"}},{"in":"query","name":"premium_proxy","required":false,"schema":{"default":false,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"stealth_proxy","required":false,"schema":{"default":false,"type":"boolean","x-query-aliases":["True","False","1","0"]}}],"responses":{"200":{"content":{"application/json":{"example":{"adapter_version":"1.0.0","organic":[{"description":"A synthetic first search description.","link":"https://catalog.example.test/one","position":1,"rank":1,"title":"Local catalog entry","url":"https://catalog.example.test/one"},{"description":"A synthetic second description.","link":"https://catalog.example.test/two","position":2,"rank":2,"title":"Local second entry","url":"https://catalog.example.test/two"}],"schema_version":"1.0.0"},"schema":{"properties":{"adapter_version":{"const":"1.0.0","type":"string"},"organic":{"items":{"properties":{"description":{"type":["string","null"]},"domain":{"type":["string","null"]},"link":{"type":["string","null"]},"position":{"minimum":1,"type":"integer"},"rank":{"minimum":1,"type":"integer"},"title":{"type":["string","null"]},"url":{"type":["string","null"]}},"required":["rank","position","title","link","url","description"],"type":"object"},"type":"array"},"schema_version":{"const":"1.0.0","type":"string"}},"required":["schema_version","adapter_version","organic"],"type":"object"}}},"description":"Adapter-extracted JSON for the requested operation.","headers":{"Spb-Cost":{"description":"Credits settled for the delivered outcome.","schema":{"type":"string"}},"Spb-Request-Id":{"schema":{"format":"uuid","type":"string"}},"Spb-Resolved-Url":{"description":"URL the adapter actually resolved against.","schema":{"type":"string"}}}},"400":{"description":"Invalid parameters"},"401":{"description":"Invalid API key"},"403":{"description":"API key lacks the required scope"},"429":{"$ref":"#/components/responses/RequestRateLimited"},"501":{"description":"Documented TBD operation"},"502":{"description":"Scrape failed after the job left the queue; the API converts the terminal executor failure to a 502 with an ApiError body"}},"security":[{"bearerAuth":[]},{"queryApiKey":[]}],"summary":"fast_search","x-contract-evidence":{"evidenceGaps":[],"retrieved":"2026-09-17","source":"internal://scrapingcow/contract/fast-search","version":"scrapingcow-contract-2026-09-17.1"},"x-required-scope":"write"}},"/api/v1/gemini":{"get":{"deprecated":true,"description":"Reserved for future implementation. Returns 501 NOT_IMPLEMENTED.","operationId":"gemini","parameters":[{"in":"query","name":"api_key","required":false,"schema":{"type":"string"}},{"in":"query","name":"prompt","required":true,"schema":{"type":"string"}},{"in":"query","name":"tag","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful compatible response"},"400":{"description":"Invalid parameters"},"401":{"description":"Invalid API key"},"403":{"description":"API key lacks the required scope"},"501":{"description":"Documented TBD operation"}},"security":[{"bearerAuth":[]},{"queryApiKey":[]}],"summary":"gemini (TBD)","x-contract-evidence":{"evidenceGaps":[],"retrieved":"2026-09-17","source":"internal://scrapingcow/contract/tbd","version":"scrapingcow-contract-2026-09-17.1"},"x-required-scope":"write"}},"/api/v1/google":{"get":{"deprecated":false,"description":"Compatibility operation dispatched to an Astra execution node. Full inherited compatibility is incomplete.","operationId":"google","parameters":[{"in":"query","name":"api_key","required":false,"schema":{"type":"string"}},{"in":"query","name":"search","required":true,"schema":{"type":"string"}},{"in":"query","name":"add_html","required":false,"schema":{"default":false,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"country_code","required":false,"schema":{"default":"us","type":"string"}},{"in":"query","name":"language","required":false,"schema":{"type":"string"}},{"in":"query","name":"date_range","required":false,"schema":{"enum":["","past_hour","past_day","past_week","past_month","past_year"],"type":"string"}},{"in":"query","name":"device","required":false,"schema":{"default":"desktop","enum":["desktop","mobile"],"type":"string"}},{"in":"query","name":"extra_params","required":false,"schema":{"type":"string"}},{"in":"query","name":"latitude","required":false,"schema":{"maximum":90.0,"minimum":-90.0,"type":"number"}},{"in":"query","name":"light_request","required":false,"schema":{"default":true,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"no_cache","required":false,"schema":{"default":false,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"longitude","required":false,"schema":{"maximum":180.0,"minimum":-180.0,"type":"number"}},{"in":"query","name":"max_price","required":false,"schema":{"minimum":0.0,"type":"number"}},{"in":"query","name":"min_price","required":false,"schema":{"minimum":0.0,"type":"number"}},{"in":"query","name":"nfpr","required":false,"schema":{"default":false,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"page","required":false,"schema":{"default":1,"minimum":1,"type":"integer"}},{"in":"query","name":"pages","required":false,"schema":{"default":1,"maximum":10,"minimum":1,"type":"integer"}},{"in":"query","name":"radius","required":false,"schema":{"minimum":0,"type":"integer"}},{"in":"query","name":"search_type","required":false,"schema":{"default":"classic","enum":["classic","news","maps","images","shopping","videos","ai_mode","ads","lens"],"type":"string"}},{"in":"query","name":"sort_by","required":false,"schema":{"enum":["","relevance","reviews","price_asc","price_desc"],"type":"string"}},{"in":"query","name":"tag","required":false,"schema":{"type":"string"}},{"in":"query","name":"premium_proxy","required":false,"schema":{"default":false,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"stealth_proxy","required":false,"schema":{"default":false,"type":"boolean","x-query-aliases":["True","False","1","0"]}}],"responses":{"200":{"content":{"application/json":{"example":{"adapter_version":"1.1.0","ai_overviews":[],"images":[],"map_results":[],"meta_data":{"number_of_organic_results":2,"page":1,"url":"https://search.example.test/search?q=local"},"news_results":[],"organic_results":[{"description":"A synthetic first search description.","link":"https://catalog.example.test/one","position":1,"rank":1,"title":"Local catalog entry","url":"https://catalog.example.test/one"},{"description":"A synthetic second description.","link":"https://catalog.example.test/two","position":2,"rank":2,"title":"Local second entry","url":"https://catalog.example.test/two"}],"pagination":{"current":1,"has_next":true,"next":"https://search.example.test/search?q=local&start=10","other_pages":{"10":"https://search.example.test/search?q=local&start=90","2":"https://search.example.test/search?q=local&start=10","3":"https://search.example.test/search?q=local&start=20","4":"https://search.example.test/search?q=local&start=30","5":"https://search.example.test/search?q=local&start=40","6":"https://search.example.test/search?q=local&start=50","7":"https://search.example.test/search?q=local&start=60","8":"https://search.example.test/search?q=local&start=70","9":"https://search.example.test/search?q=local&start=80"}},"questions":[],"related_searches":[],"request":{"country_code":"us","device":"desktop","engine":"google","language":"en","page":1,"query":"local","search_type":"classic"},"schema_version":"1.0.0"},"schema":{"properties":{"adapter_version":{"const":"1.1.0","type":"string"},"ai_overviews":{"items":{"type":"object"},"type":"array"},"images":{"items":{"properties":{"domain":{"type":["string","null"]},"image":{"type":["string","null"]},"position":{"minimum":1,"type":"integer"},"title":{"type":["string","null"]},"url":{"type":["string","null"]}},"required":["position","url","domain","image","title"],"type":"object"},"type":"array"},"map_results":{"items":{"properties":{"address":{"type":["string","null"]},"category":{"type":["string","null"]},"link":{"type":["string","null"]},"phone":{"type":["string","null"]},"position":{"minimum":1,"type":"integer"},"price":{"type":["string","null"]},"rating":{"type":["string","null"]},"reviews":{"minimum":0,"type":["integer","null"]},"title":{"type":["string","null"]}},"required":["position","title","link","category","address","phone","price","rating","reviews"],"type":"object"},"type":"array"},"meta_data":{"properties":{"duration_seconds":{"minimum":0,"type":"number"},"fetched_at":{"type":"string"},"number_of_organic_results":{"minimum":0,"type":"integer"},"page":{"minimum":1,"type":"integer"},"result_count_estimate":{"type":"string"},"url":{"type":"string"}},"required":["url","number_of_organic_results","page"],"type":"object"},"news_results":{"items":{"properties":{"date":{"type":["string","null"]},"domain":{"type":["string","null"]},"link":{"type":["string","null"]},"position":{"minimum":1,"type":"integer"},"snippet":{"type":["string","null"]},"source":{"type":["string","null"]},"title":{"type":["string","null"]}},"required":["position","title","link","domain","source","date","snippet"],"type":"object"},"type":"array"},"organic_results":{"items":{"properties":{"description":{"type":["string","null"]},"domain":{"type":["string","null"]},"link":{"type":["string","null"]},"position":{"minimum":1,"type":"integer"},"rank":{"minimum":1,"type":"integer"},"title":{"type":["string","null"]},"url":{"type":["string","null"]}},"required":["rank","position","title","link","url","description"],"type":"object"},"type":"array"},"pagination":{"properties":{"current":{"minimum":1,"type":"integer"},"has_next":{"type":"boolean"},"next":{"type":"string"},"other_pages":{"additionalProperties":{"type":"string"},"type":"object"}},"required":["current","has_next","next","other_pages"],"type":"object"},"questions":{"items":{"type":"string"},"type":"array"},"related_searches":{"items":{"type":"string"},"type":"array"},"request":{"properties":{"country_code":{"type":"string"},"date_range":{"type":"string"},"device":{"type":"string"},"engine":{"type":"string"},"language":{"type":"string"},"page":{"minimum":1,"type":"integer"},"query":{"type":"string"},"search_type":{"type":"string"},"sort_by":{"type":"string"}},"required":["engine","query","country_code","language","search_type","device","page"],"type":"object"},"schema_version":{"const":"1.0.0","type":"string"}},"required":["schema_version","adapter_version","organic_results","news_results","map_results","images","ai_overviews","questions","related_searches","request","pagination","meta_data"],"type":"object"}}},"description":"Adapter-extracted JSON for the requested operation.","headers":{"Spb-Cost":{"description":"Credits settled for the delivered outcome.","schema":{"type":"string"}},"Spb-Request-Id":{"schema":{"format":"uuid","type":"string"}},"Spb-Resolved-Url":{"description":"URL the adapter actually resolved against.","schema":{"type":"string"}}}},"400":{"description":"Invalid parameters"},"401":{"description":"Invalid API key"},"403":{"description":"API key lacks the required scope"},"429":{"$ref":"#/components/responses/RequestRateLimited"},"501":{"description":"Documented TBD operation"},"502":{"description":"Scrape failed after the job left the queue; the API converts the terminal executor failure to a 502 with an ApiError body"}},"security":[{"bearerAuth":[]},{"queryApiKey":[]}],"summary":"google","x-contract-evidence":{"evidenceGaps":[],"retrieved":"2026-09-17","source":"internal://scrapingcow/contract/google","version":"scrapingcow-contract-2026-09-17.1"},"x-cross-parameter-rules":["search_type=news is not available with device=mobile"],"x-required-scope":"write"}},"/api/v1/usage":{"get":{"operationId":"usage","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingUsage"}}},"description":"Baseline credits_used and requests totals; plan allowance parity remains incomplete"},"403":{"description":"API key lacks read scope"}},"security":[{"bearerAuth":[]},{"queryApiKey":[]}],"x-required-scope":"read"}},"/api/v1/walmart/product":{"get":{"deprecated":false,"description":"Compatibility operation dispatched to an Astra execution node. Full inherited compatibility is incomplete.","operationId":"walmart_product","parameters":[{"in":"query","name":"api_key","required":false,"schema":{"type":"string"}},{"in":"query","name":"product_id","required":true,"schema":{"type":"string"}},{"in":"query","name":"add_html","required":false,"schema":{"default":false,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"delivery_zip","required":false,"schema":{"type":"string"}},{"in":"query","name":"device","required":false,"schema":{"default":"desktop","enum":["desktop","mobile","tablet"],"type":"string"}},{"in":"query","name":"domain","required":false,"schema":{"type":"string"}},{"in":"query","name":"light_request","required":false,"schema":{"default":true,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"screenshot","required":false,"schema":{"default":false,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"store_id","required":false,"schema":{"type":"string"}},{"in":"query","name":"tag","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"example":{"adapter_version":"1.0.0","availability":{"delivery_options":{"express":"1-2 business days","pickup":"Available today","standard":"3-5 business days"},"in_stock":true,"quantity":null},"description":"A synthetic detailed Walmart description.","image":"https://media.example.test/detail-kettle.png","images":["https://media.example.test/detail-kettle.png","https://media.example.test/detail-kettle-2.png"],"price":{"currency":"USD","current":94.5,"discount_percentage":16.7,"original":113.4},"product_id":"local-detail-88","rating":{"average":4.7,"count":892,"distribution":{"1":7,"2":15,"3":45,"4":180,"5":645}},"schema_version":"1.0.0","seller":{"id":"walmart","name":"Walmart","rating":null},"shipping":{"free":true,"price":0,"two_day":true},"specifications":{"Brand":"Local Brand","Color":"Natural Titanium","Model":"LK-42"},"title":"Local detailed Walmart kettle","url":"https://shop.example.test/ip/local-detailed/url-fallback"},"schema":{"properties":{"adapter_version":{"const":"1.0.0","type":"string"},"availability":{"properties":{"delivery_options":{"properties":{"express":{"type":["string","null"]},"pickup":{"type":["string","null"]},"standard":{"type":["string","null"]}},"required":["standard","express","pickup"],"type":"object"},"in_stock":{"type":["boolean","null"]},"quantity":{"type":["integer","null"]}},"required":["in_stock","quantity","delivery_options"],"type":["object","null"]},"description":{"type":["string","null"]},"image":{"type":["string","null"]},"images":{"items":{"type":"string"},"type":"array"},"price":{"properties":{"currency":{"type":["string","null"]},"current":{"type":["number","null"]},"discount_percentage":{"type":["number","null"]},"original":{"type":["number","null"]}},"required":["current","original","currency","discount_percentage"],"type":["object","null"]},"product_id":{"type":["string","null"]},"rating":{"properties":{"average":{"type":["number","null"]},"count":{"type":["integer","null"]},"distribution":{"additionalProperties":{"type":"integer"},"type":["object","null"]}},"required":["average","count","distribution"],"type":["object","null"]},"schema_version":{"const":"1.0.0","type":"string"},"seller":{"properties":{"id":{"type":["string","null"]},"name":{"type":["string","null"]},"rating":{"type":["number","null"]}},"required":["name","id","rating"],"type":["object","null"]},"shipping":{"properties":{"free":{"type":["boolean","null"]},"price":{"type":["number","null"]},"two_day":{"type":["boolean","null"]}},"required":["free","price","two_day"],"type":["object","null"]},"specifications":{"additionalProperties":{"type":"string"},"type":"object"},"title":{"type":["string","null"]},"url":{"type":["string","null"]}},"required":["schema_version","adapter_version","product_id","title","description","price","availability","url","image","images","specifications","rating","seller","shipping"],"type":"object"}}},"description":"Adapter-extracted JSON for the requested operation.","headers":{"Spb-Cost":{"description":"Credits settled for the delivered outcome.","schema":{"type":"string"}},"Spb-Request-Id":{"schema":{"format":"uuid","type":"string"}},"Spb-Resolved-Url":{"description":"URL the adapter actually resolved against.","schema":{"type":"string"}}}},"400":{"description":"Invalid parameters"},"401":{"description":"Invalid API key"},"403":{"description":"API key lacks the required scope"},"429":{"$ref":"#/components/responses/RequestRateLimited"},"501":{"description":"Documented TBD operation"},"502":{"description":"Scrape failed after the job left the queue; the API converts the terminal executor failure to a 502 with an ApiError body"}},"security":[{"bearerAuth":[]},{"queryApiKey":[]}],"summary":"walmart_product","x-contract-evidence":{"evidenceGaps":[],"retrieved":"2026-09-17","source":"internal://scrapingcow/contract/walmart","version":"scrapingcow-contract-2026-09-17.1"},"x-required-scope":"write"}},"/api/v1/walmart/search":{"get":{"deprecated":false,"description":"Compatibility operation dispatched to an Astra execution node. Full inherited compatibility is incomplete.","operationId":"walmart_search","parameters":[{"in":"query","name":"api_key","required":false,"schema":{"type":"string"}},{"in":"query","name":"query","required":true,"schema":{"type":"string"}},{"in":"query","name":"add_html","required":false,"schema":{"default":false,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"delivery_zip","required":false,"schema":{"type":"string"}},{"in":"query","name":"device","required":false,"schema":{"default":"desktop","enum":["desktop","mobile","tablet"],"type":"string"}},{"in":"query","name":"domain","required":false,"schema":{"type":"string"}},{"in":"query","name":"fulfillment_speed","required":false,"schema":{"enum":["","today","tomorrow","2_days","anytime"],"type":"string"}},{"in":"query","name":"fulfillment_type","required":false,"schema":{"enum":["","in_store"],"type":"string"}},{"in":"query","name":"light_request","required":false,"schema":{"default":true,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"no_cache","required":false,"schema":{"default":false,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"max_price","required":false,"schema":{"minimum":0,"type":"integer"}},{"in":"query","name":"min_price","required":false,"schema":{"minimum":0,"type":"integer"}},{"in":"query","name":"screenshot","required":false,"schema":{"default":false,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"sort_by","required":false,"schema":{"default":"best_match","enum":["best_match","price_low","price_high","best_seller"],"type":"string"}},{"in":"query","name":"start_page","required":false,"schema":{"default":1,"minimum":1,"type":"integer"}},{"in":"query","name":"store_id","required":false,"schema":{"type":"string"}},{"in":"query","name":"tag","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"example":{"adapter_version":"1.0.0","facets":{"brands":[{"count":245,"name":"Local Brand"}],"price_ranges":[{"count":120,"max":50,"min":0}],"ratings":[{"count":350,"stars":4}]},"location":{"store_id":null,"zip_code":null},"meta_data":{"number_of_products":2,"number_of_results":1000,"page":1,"total_pages":null,"url":"https://shop.example.test/search?q=local"},"products":[{"availability":"In stock","brand":"Local Brand","currency":"USD","free_shipping":true,"image":"https://media.example.test/detail-search-kettle.png","position":1,"price":63.5,"prime":true,"product_id":"local-detail-1","rating":4.8,"review_count":1204,"seller":"Local Store","title":"Local detailed kettle","two_day_shipping":true,"url":"https://shop.example.test/ip/local-detailed-kettle/local-detail-1"}],"schema_version":"1.0.0"},"schema":{"properties":{"adapter_version":{"const":"1.0.0","type":"string"},"facets":{"properties":{"brands":{"items":{"properties":{"count":{"type":["integer","null"]},"name":{"type":"string"}},"required":["name","count"],"type":"object"},"type":"array"},"price_ranges":{"items":{"properties":{"count":{"type":["integer","null"]},"max":{"type":["number","null"]},"min":{"type":"number"}},"required":["min","max","count"],"type":"object"},"type":"array"},"ratings":{"items":{"properties":{"count":{"type":["integer","null"]},"stars":{"type":"integer"}},"required":["stars","count"],"type":"object"},"type":"array"}},"required":["brands","price_ranges","ratings"],"type":"object"},"location":{"properties":{"store_id":{"type":["string","null"]},"zip_code":{"type":["string","null"]}},"required":["zip_code","store_id"],"type":"object"},"meta_data":{"properties":{"number_of_products":{"minimum":0,"type":"integer"},"number_of_results":{"type":["integer","null"]},"page":{"minimum":1,"type":"integer"},"total_pages":{"type":["integer","null"]},"url":{"type":"string"}},"required":["url","number_of_results","number_of_products","page","total_pages"],"type":"object"},"products":{"items":{"properties":{"availability":{"type":["string","null"]},"brand":{"type":["string","null"]},"currency":{"type":["string","null"]},"free_shipping":{"type":["boolean","null"]},"image":{"type":["string","null"]},"position":{"minimum":1,"type":"integer"},"price":{"type":["number","null"]},"prime":{"type":["boolean","null"]},"product_id":{"type":["string","null"]},"rating":{"type":["number","null"]},"review_count":{"type":["integer","null"]},"seller":{"type":["string","null"]},"title":{"type":["string","null"]},"two_day_shipping":{"type":["boolean","null"]},"url":{"type":["string","null"]}},"required":["position","product_id","title","price","url","image","currency","rating","review_count","availability","brand","seller","prime","free_shipping","two_day_shipping"],"type":"object"},"type":"array"},"schema_version":{"const":"1.0.0","type":"string"}},"required":["schema_version","adapter_version","meta_data","products","facets","location"],"type":"object"}}},"description":"Adapter-extracted JSON for the requested operation.","headers":{"Spb-Cost":{"description":"Credits settled for the delivered outcome.","schema":{"type":"string"}},"Spb-Request-Id":{"schema":{"format":"uuid","type":"string"}},"Spb-Resolved-Url":{"description":"URL the adapter actually resolved against.","schema":{"type":"string"}}}},"400":{"description":"Invalid parameters"},"401":{"description":"Invalid API key"},"403":{"description":"API key lacks the required scope"},"429":{"$ref":"#/components/responses/RequestRateLimited"},"501":{"description":"Documented TBD operation"},"502":{"description":"Scrape failed after the job left the queue; the API converts the terminal executor failure to a 502 with an ApiError body"}},"security":[{"bearerAuth":[]},{"queryApiKey":[]}],"summary":"walmart_search","x-contract-evidence":{"evidenceGaps":[],"retrieved":"2026-09-17","source":"internal://scrapingcow/contract/walmart","version":"scrapingcow-contract-2026-09-17.1"},"x-required-scope":"write"}},"/api/v1/youtube/metadata":{"get":{"deprecated":false,"description":"Compatibility operation dispatched to an Astra execution node. Full inherited compatibility is incomplete.","operationId":"youtube_metadata","parameters":[{"in":"query","name":"api_key","required":false,"schema":{"type":"string"}},{"in":"query","name":"video_id","required":true,"schema":{"type":"string"}},{"in":"query","name":"tag","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"example":{"adapter_version":"1.0.0","age_limit":18,"categories":["Education"],"channel_id":"UCfixture0000000000000000","channel_url":"https://www.youtube.com/channel/UCfixture0000000000000000","comment_count":26000,"description":"A synthetic description.","duration":73,"formats":[{"acodec":"mp4a.40.2","ext":"mp4","format_id":"18","format_note":"360p","fps":30,"resolution":"640x360","url":"https://media.example.test/videoplayback?itag=18","vcodec":"avc1.42001E"}],"is_live":false,"like_count":527000,"schema_version":"1.0.0","tags":["local","fixture"],"thumbnails":[{"height":90,"url":"https://media.example.test/thumb.png","width":120}],"title":"Local fixture video","upload_date":"20200916","uploader":"Local fixture channel","uploader_id":"@localfixture","uploader_url":"https://www.youtube.com/@localfixture","video_id":"local-video","view_count":42},"schema":{"properties":{"adapter_version":{"const":"1.0.0","type":"string"},"age_limit":{"type":["integer","null"]},"categories":{"items":{"type":"string"},"type":"array"},"channel_id":{"type":["string","null"]},"channel_url":{"type":["string","null"]},"comment_count":{"type":["integer","null"]},"description":{"type":["string","null"]},"duration":{"type":["integer","null"]},"formats":{"items":{"properties":{"acodec":{"type":["string","null"]},"ext":{"type":["string","null"]},"format_id":{"type":["string","null"]},"format_note":{"type":["string","null"]},"fps":{"type":["integer","null"]},"resolution":{"type":["string","null"]},"url":{"type":["string","null"]},"vcodec":{"type":["string","null"]}},"required":["acodec","ext","format_id","format_note","fps","resolution","url","vcodec"],"type":"object"},"type":"array"},"is_live":{"type":["boolean","null"]},"like_count":{"type":["integer","null"]},"schema_version":{"const":"1.0.0","type":"string"},"tags":{"items":{"type":"string"},"type":"array"},"thumbnails":{"items":{"properties":{"height":{"type":["integer","null"]},"url":{"type":["string","null"]},"width":{"type":["integer","null"]}},"required":["height","url","width"],"type":"object"},"type":"array"},"title":{"type":["string","null"]},"upload_date":{"type":["string","null"]},"uploader":{"type":["string","null"]},"uploader_id":{"type":["string","null"]},"uploader_url":{"type":["string","null"]},"video_id":{"type":["string","null"]},"view_count":{"type":["integer","null"]}},"required":["schema_version","adapter_version","age_limit","categories","channel_id","channel_url","comment_count","description","duration","formats","is_live","like_count","tags","thumbnails","title","upload_date","uploader","uploader_id","uploader_url","video_id","view_count"],"type":"object"}}},"description":"Adapter-extracted JSON for the requested operation.","headers":{"Spb-Cost":{"description":"Credits settled for the delivered outcome.","schema":{"type":"string"}},"Spb-Request-Id":{"schema":{"format":"uuid","type":"string"}},"Spb-Resolved-Url":{"description":"URL the adapter actually resolved against.","schema":{"type":"string"}}}},"400":{"description":"Invalid parameters"},"401":{"description":"Invalid API key"},"403":{"description":"API key lacks the required scope"},"429":{"$ref":"#/components/responses/RequestRateLimited"},"501":{"description":"Documented TBD operation"},"502":{"description":"Scrape failed after the job left the queue; the API converts the terminal executor failure to a 502 with an ApiError body"}},"security":[{"bearerAuth":[]},{"queryApiKey":[]}],"summary":"youtube_metadata","x-contract-evidence":{"evidenceGaps":[],"retrieved":"2026-09-17","source":"internal://scrapingcow/contract/youtube","version":"scrapingcow-contract-2026-09-17.1"},"x-required-scope":"write"}},"/api/v1/youtube/search":{"get":{"deprecated":false,"description":"Compatibility operation dispatched to an Astra execution node. Full inherited compatibility is incomplete.","operationId":"youtube_search","parameters":[{"in":"query","name":"api_key","required":false,"schema":{"type":"string"}},{"in":"query","name":"search","required":true,"schema":{"type":"string"}},{"in":"query","name":"360","required":false,"schema":{"default":false,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"3d","required":false,"schema":{"default":false,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"4k","required":false,"schema":{"default":false,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"creative_commons","required":false,"schema":{"default":false,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"duration","required":false,"schema":{"enum":["","<4","4-20",">20"],"type":"string"}},{"in":"query","name":"hd","required":false,"schema":{"default":false,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"hdr","required":false,"schema":{"default":false,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"live","required":false,"schema":{"default":false,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"location","required":false,"schema":{"default":false,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"purchased","required":false,"schema":{"default":false,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"sort_by","required":false,"schema":{"default":"relevance","enum":["rating","relevance","view_count","upload_date"],"type":"string"}},{"in":"query","name":"subtitles","required":false,"schema":{"default":false,"type":"boolean","x-query-aliases":["True","False","1","0"]}},{"in":"query","name":"tag","required":false,"schema":{"type":"string"}},{"in":"query","name":"type","required":false,"schema":{"enum":["","video","channel","playlist","movie"],"type":"string"}},{"in":"query","name":"upload_date","required":false,"schema":{"enum":["","today","last_hour","this_week","this_month","this_year"],"type":"string"}},{"in":"query","name":"vr180","required":false,"schema":{"default":false,"type":"boolean","x-query-aliases":["True","False","1","0"]}}],"responses":{"200":{"content":{"application/json":{"example":{"adapter_version":"1.0.0","results":[{"ownerText":{"runs":[{"text":"Local fixture channel"}]},"title":{"runs":[{"text":"Local innertube result"}]},"videoId":"localsearch01","viewCountText":{"simpleText":"3,804,720 views"}}],"schema_version":"1.0.0","search":"localfixture"},"schema":{"properties":{"adapter_version":{"const":"1.0.0","type":"string"},"results":{"items":{"type":"object"},"type":"array"},"schema_version":{"const":"1.0.0","type":"string"},"search":{"type":["string","null"]}},"required":["schema_version","adapter_version","search","results"],"type":"object"}}},"description":"Adapter-extracted JSON for the requested operation.","headers":{"Spb-Cost":{"description":"Credits settled for the delivered outcome.","schema":{"type":"string"}},"Spb-Request-Id":{"schema":{"format":"uuid","type":"string"}},"Spb-Resolved-Url":{"description":"URL the adapter actually resolved against.","schema":{"type":"string"}}}},"400":{"description":"Invalid parameters"},"401":{"description":"Invalid API key"},"403":{"description":"API key lacks the required scope"},"429":{"$ref":"#/components/responses/RequestRateLimited"},"501":{"description":"Documented TBD operation"},"502":{"description":"Scrape failed after the job left the queue; the API converts the terminal executor failure to a 502 with an ApiError body"}},"security":[{"bearerAuth":[]},{"queryApiKey":[]}],"summary":"youtube_search","x-contract-evidence":{"evidenceGaps":[],"retrieved":"2026-09-17","source":"internal://scrapingcow/contract/youtube","version":"scrapingcow-contract-2026-09-17.1"},"x-required-scope":"write"}},"/api/v1/youtube/subtitles":{"get":{"deprecated":false,"description":"Compatibility operation dispatched to an Astra execution node. Full inherited compatibility is incomplete.","operationId":"youtube_subtitles","parameters":[{"in":"query","name":"api_key","required":false,"schema":{"type":"string"}},{"in":"query","name":"video_id","required":true,"schema":{"type":"string"}},{"in":"query","name":"language","required":false,"schema":{"type":"string"}},{"in":"query","name":"subtitle_origin","required":false,"schema":{"enum":["","auto_generated","uploader_provided"],"type":"string"}},{"in":"query","name":"origin","required":false,"schema":{"enum":["","auto_generated","uploader_provided"],"type":"string"}},{"in":"query","name":"tag","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"example":{"adapter_version":"1.0.0","schema_version":"1.0.0","subtitles":{"auto_generated":{"de":[],"en":[]},"uploader_provided":{"en":[],"fr":[]}}},"schema":{"properties":{"adapter_version":{"const":"1.0.0","type":"string"},"schema_version":{"const":"1.0.0","type":"string"},"subtitles":{"properties":{"auto_generated":{"additionalProperties":{"items":{"properties":{"d_duration_ms":{"type":"string"},"snippet":{"properties":{"runs":{"items":{"properties":{"text":{"type":"string"}},"required":["text"],"type":"object"},"type":"array"}},"required":["runs"],"type":"object"},"start_ms":{"type":"string"}},"required":["start_ms","d_duration_ms","snippet"],"type":"object"},"type":"array"},"type":"object"},"uploader_provided":{"additionalProperties":{"items":{"properties":{"d_duration_ms":{"type":"string"},"snippet":{"properties":{"runs":{"items":{"properties":{"text":{"type":"string"}},"required":["text"],"type":"object"},"type":"array"}},"required":["runs"],"type":"object"},"start_ms":{"type":"string"}},"required":["start_ms","d_duration_ms","snippet"],"type":"object"},"type":"array"},"type":"object"}},"required":["auto_generated","uploader_provided"],"type":"object"}},"required":["schema_version","adapter_version","subtitles"],"type":"object"}}},"description":"Adapter-extracted JSON for the requested operation.","headers":{"Spb-Cost":{"description":"Credits settled for the delivered outcome.","schema":{"type":"string"}},"Spb-Request-Id":{"schema":{"format":"uuid","type":"string"}},"Spb-Resolved-Url":{"description":"URL the adapter actually resolved against.","schema":{"type":"string"}}}},"400":{"description":"Invalid parameters"},"401":{"description":"Invalid API key"},"403":{"description":"API key lacks the required scope"},"429":{"$ref":"#/components/responses/RequestRateLimited"},"501":{"description":"Documented TBD operation"},"502":{"description":"Scrape failed after the job left the queue; the API converts the terminal executor failure to a 502 with an ApiError body"}},"security":[{"bearerAuth":[]},{"queryApiKey":[]}],"summary":"youtube_subtitles","x-contract-evidence":{"evidenceGaps":["SPEC requires origin; upstream documentation now names subtitle_origin; origin retained pending product contract migration"],"retrieved":"2026-09-17","source":"internal://scrapingcow/contract/youtube","version":"scrapingcow-contract-2026-09-17.1"},"x-required-scope":"write"}},"/auth/access-requests":{"post":{"description":"Request operator-managed signup. Does not create an account or send email. Duplicate emails return the same response. Requires same-origin dashboard client header.","operationId":"requestDashboardAccess","parameters":[{"in":"header","name":"X-Scrapingcow-Client","required":true,"schema":{"enum":["dashboard"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"email":{"format":"email","maxLength":254,"type":"string"},"name":{"maxLength":120,"type":"string"},"workspace_name":{"maxLength":120,"type":"string"}},"required":["name","email","workspace_name"],"type":"object"}}},"required":true},"responses":{"202":{"content":{"application/json":{"example":{"requested":true},"schema":{"$ref":"#/components/schemas/DashboardRequestAccepted"}}},"description":"Request saved for operator review; Cache-Control: no-store. Duplicate emails and rate-limited replies return the same body."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Invalid input"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Untrusted origin"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Rate limited. Auth abuse/concurrency limits return ApiError without Retry-After; distinct from request-admission rate limiting."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Intake temporarily full"}},"security":[]}},"/auth/email/confirm":{"post":{"description":"Consumes a matching unexpired link token for the signed-in account and marks the address proved, which also makes it usable as a login identifier. Every pending link token for the account is revoked. Invalid, reused, cross-email or expired tokens return identical 400 errors. Requires a dashboard session and X-CSRF-Token.","operationId":"confirmDashboardEmail","parameters":[{"in":"header","name":"X-Scrapingcow-Client","required":true,"schema":{"enum":["dashboard"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"email":{"format":"email","type":"string"},"token":{"pattern":"^[0-9a-f]{64}$","type":"string","writeOnly":true}},"required":["email","token"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardAccount"}}},"description":"Success; Cache-Control: no-store. Returns the account identity after the change."},"400":{"description":"Invalid request"},"401":{"description":"Sign-in required or invalid credentials"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Origin or CSRF check failed, or the selected-workspace role does not permit this action"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Sign-in rate or concurrency limit reached. Auth abuse/concurrency limits return ApiError without Retry-After; distinct from request-admission rate limiting."}},"security":[{"csrfToken":[],"dashboardSession":[]}]}},"/auth/email/remove":{"post":{"description":"Removes the linked address and its verification, and revokes every pending link or recovery token. Requires the current password because it also removes self-service password recovery for the account. Requires a dashboard session and X-CSRF-Token.","operationId":"removeDashboardEmail","parameters":[{"in":"header","name":"X-Scrapingcow-Client","required":true,"schema":{"enum":["dashboard"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"password":{"description":"Current password; required because removing the address also removes password recovery.","maxLength":128,"type":"string","writeOnly":true}},"required":["password"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardAccount"}}},"description":"Success; Cache-Control: no-store. Returns the account identity after the change."},"400":{"description":"Invalid request"},"401":{"description":"Sign-in required or invalid credentials"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Origin or CSRF check failed, or the selected-workspace role does not permit this action"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Sign-in rate or concurrency limit reached. Auth abuse/concurrency limits return ApiError without Retry-After; distinct from request-admission rate limiting."}},"security":[{"csrfToken":[],"dashboardSession":[]}]}},"/auth/email/request":{"post":{"description":"Mails a 30-minute single-use token to prove an address for the signed-in account. The address is stored unverified and cannot be used to sign in until the token is confirmed. Requires a dashboard session and X-CSRF-Token.","operationId":"requestDashboardEmailLink","parameters":[{"in":"header","name":"X-Scrapingcow-Client","required":true,"schema":{"enum":["dashboard"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"email":{"format":"email","maxLength":254,"type":"string"}},"required":["email"],"type":"object"}}},"required":true},"responses":{"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardRequestAccepted"}}},"description":"Accepted; Cache-Control: no-store. A verification mail is sent whether or not the address is already linked elsewhere."},"400":{"description":"Invalid request"},"401":{"description":"Sign-in required or invalid credentials"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Origin or CSRF check failed, or the selected-workspace role does not permit this action"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Sign-in rate or concurrency limit reached. Auth abuse/concurrency limits return ApiError without Retry-After; distinct from request-admission rate limiting."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"SMTP unavailable, SMTP rejected mail, or issuance capacity exhausted"}},"security":[{"csrfToken":[],"dashboardSession":[]}]}},"/auth/login":{"post":{"description":"Returns user identity, selected workspace identity and role, and csrf_token. Login accepts a username, or an email address that has been verified on the account, and sets a Secure HttpOnly host-only cookie valid for 24 hours. Use X-Scrapingcow-Client: dashboard; a supplied Origin must match DASHBOARD_ORIGIN and cross-site requests are rejected. Responses must not be cached.","operationId":"dashboardLogin","parameters":[{"in":"header","name":"X-Scrapingcow-Client","required":true,"schema":{"enum":["dashboard"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"identifier":{"description":"Username, or an email address that has been verified on the account. A value containing @ is treated as an email and only matches a verified address; otherwise it is treated as a username.","maxLength":254,"type":"string"},"password":{"maxLength":128,"type":"string","writeOnly":true}},"required":["identifier","password"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardSession"}}},"description":"User and selected workspace; Cache-Control: no-store"},"400":{"description":"Invalid request"},"401":{"description":"Sign-in required or invalid credentials"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Origin or CSRF check failed, or the selected-workspace role does not permit this action"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Sign-in rate or concurrency limit reached. Auth abuse/concurrency limits return ApiError without Retry-After; distinct from request-admission rate limiting."}},"security":[]}},"/auth/logout":{"post":{"description":"Dashboard session operation. Cookie-authenticated platform calls require X-CSRF-Token from /auth/session. Responses must not be cached.","operationId":"dashboardLogout","parameters":[{"in":"header","name":"X-Scrapingcow-Client","required":true,"schema":{"enum":["dashboard"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardSignedOut"}}},"description":"Success; Cache-Control: no-store. The browser session cookie is cleared and every session revoked; sign in again."},"400":{"description":"Invalid request"},"401":{"description":"Sign-in required or invalid credentials"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Origin or CSRF check failed, or the selected-workspace role does not permit this action"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Sign-in rate or concurrency limit reached. Auth abuse/concurrency limits return ApiError without Retry-After; distinct from request-admission rate limiting."}},"security":[{"csrfToken":[],"dashboardSession":[]}]}},"/auth/password":{"post":{"description":"Dashboard session operation. Cookie-authenticated platform calls require X-CSRF-Token from /auth/session. Responses must not be cached.","operationId":"dashboardPassword","parameters":[{"in":"header","name":"X-Scrapingcow-Client","required":true,"schema":{"enum":["dashboard"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"current_password":{"type":"string","writeOnly":true},"new_password":{"description":"Maximum 128 UTF-8 bytes. Revokes all sessions.","minLength":12,"type":"string","writeOnly":true}},"required":["current_password","new_password"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardSignedOut"}}},"description":"Success; Cache-Control: no-store. The browser session cookie is cleared and every session revoked; sign in again."},"400":{"description":"Invalid request"},"401":{"description":"Sign-in required or invalid credentials"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Origin or CSRF check failed, or the selected-workspace role does not permit this action"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Sign-in rate or concurrency limit reached. Auth abuse/concurrency limits return ApiError without Retry-After; distinct from request-admission rate limiting."}},"security":[{"csrfToken":[],"dashboardSession":[]}]}},"/auth/password-recovery":{"post":{"description":"Sends a 15-minute single-use recovery token using configured SMTP. Accepts a username or a verified email. The same 202 response is returned for unknown identifiers, for accounts with no proved address (no mail is sent) and for real tokens, so this endpoint never confirms that an account exists. Missing or failed delivery returns 503. Shared global, per-subject and per-address issuance budgets prevent mail floods.","operationId":"requestDashboardPasswordRecovery","parameters":[{"in":"header","name":"X-Scrapingcow-Client","required":true,"schema":{"enum":["dashboard"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"identifier":{"description":"Username, or an email address that has been verified on the account.","maxLength":254,"type":"string"}},"required":["identifier"],"type":"object"}}},"required":true},"responses":{"202":{"content":{"application/json":{"example":{"requested":true},"schema":{"$ref":"#/components/schemas/DashboardRequestAccepted"}}},"description":"Success; Cache-Control: no-store"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Invalid request or invalid/expired/ineligible token"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Dashboard client or origin check failed"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Bounded global or per-subject 15-minute abuse budget exhausted; try later. Auth abuse/concurrency limits return ApiError without Retry-After; distinct from request-admission rate limiting."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"SMTP unavailable, SMTP rejected mail, or issuance capacity exhausted"}},"security":[]}},"/auth/register":{"post":{"description":"Distinct from operator access requests. Creates the account, its workspace and its owner membership immediately from a username and password; no email and no SMTP are required to hold an account. An optional email is stored unverified and cannot be used to sign in until it is proved in Settings. Taken usernames and taken addresses return the same 400. Requires same-origin dashboard header.","operationId":"registerDashboardAccount","parameters":[{"in":"header","name":"X-Scrapingcow-Client","required":true,"schema":{"enum":["dashboard"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"email":{"description":"Optional; stored unverified.","format":"email","maxLength":254,"type":"string"},"name":{"description":"Maximum 120 UTF-8 bytes","minLength":1,"type":"string"},"password":{"description":"Maximum 128 UTF-8 bytes","minLength":12,"type":"string","writeOnly":true},"username":{"description":"Primary login identifier, stored lower-case.","maxLength":32,"minLength":3,"type":"string"},"workspace_name":{"description":"Maximum 120 UTF-8 bytes","minLength":1,"type":"string"}},"required":["username","password","name","workspace_name"],"type":"object"}}},"required":true},"responses":{"201":{"content":{"application/json":{"example":{"created":true},"schema":{"$ref":"#/components/schemas/DashboardAccountCreated"}}},"description":"Success; Cache-Control: no-store"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Invalid request or invalid/expired/ineligible token"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Dashboard client or origin check failed"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Bounded global or per-subject 15-minute abuse budget exhausted; try later. Auth abuse/concurrency limits return ApiError without Retry-After; distinct from request-admission rate limiting."}},"security":[]}},"/auth/reset-password":{"post":{"description":"Consumes a matching unexpired recovery token for the account named by the identifier, changes the password and revokes every existing session and recovery token atomically. Tokens issued before another password change are invalid. Invalid, reused, cross-account or ineligible tokens return identical 400 errors. Clears the browser session cookie; log in again afterwards.","operationId":"recoverDashboardPassword","parameters":[{"in":"header","name":"X-Scrapingcow-Client","required":true,"schema":{"enum":["dashboard"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"identifier":{"description":"Username, or the verified email the token was mailed to.","maxLength":254,"type":"string"},"new_password":{"description":"Maximum 128 UTF-8 bytes","minLength":12,"type":"string","writeOnly":true},"token":{"pattern":"^[0-9a-f]{64}$","type":"string","writeOnly":true}},"required":["identifier","token","new_password"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"example":{"signed_out":true},"schema":{"$ref":"#/components/schemas/DashboardSignedOut"}}},"description":"Success; Cache-Control: no-store"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Invalid request or invalid/expired/ineligible token"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Dashboard client or origin check failed"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Bounded global or per-subject 15-minute abuse budget exhausted; try later. Auth abuse/concurrency limits return ApiError without Retry-After; distinct from request-admission rate limiting."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"SMTP unavailable, SMTP rejected mail, or issuance capacity exhausted"}},"security":[]}},"/auth/session":{"get":{"description":"Returns user identity, selected workspace identity and role, and csrf_token. Login accepts a username, or an email address that has been verified on the account, and sets a Secure HttpOnly host-only cookie valid for 24 hours. Use X-Scrapingcow-Client: dashboard; a supplied Origin must match DASHBOARD_ORIGIN and cross-site requests are rejected. Responses must not be cached.","operationId":"dashboardSession","parameters":[{"in":"header","name":"X-Scrapingcow-Client","required":true,"schema":{"enum":["dashboard"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardSession"}}},"description":"User and selected workspace; Cache-Control: no-store"},"400":{"description":"Invalid request"},"401":{"description":"Sign-in required or invalid credentials"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Origin or CSRF check failed, or the selected-workspace role does not permit this action"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Sign-in rate or concurrency limit reached. Auth abuse/concurrency limits return ApiError without Retry-After; distinct from request-admission rate limiting."}},"security":[{"dashboardSession":[]}]}},"/billing/webhook":{"post":{"description":"Signed raw-body webhook for the active payment provider; transactionally deduplicated event processing. Paddle-Signature carries `ts=<unix>;h1=<hex>` with a five-second tolerance; Stripe-Signature carries `t=…,v1=…` with a five-minute tolerance. Not a dashboard endpoint.","operationId":"billingWebhook","parameters":[{"in":"header","name":"paddle-signature","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingWebhookAck"}}},"description":"Success"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Invalid request"},"401":{"description":"Missing dashboard session"},"403":{"description":"Invalid CSRF token"},"409":{"description":"Existing subscription"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Payment provider unavailable or unconfigured"}},"security":[]}},"/platform/v1/admin/executors":{"get":{"description":"Operator-only executor registry health (migration 0022). Requires a dashboard session carrying the platform_admin designation. `freshness_seconds` bounds how recent a heartbeat must be for a node to read as healthy; it is clamped to 1..=86400 and a malformed or out-of-range value is a 400. A node that has never sent a heartbeat has a null last_heartbeat_age_seconds and reads as unhealthy.","operationId":"adminExecutorHealth","parameters":[{"in":"header","name":"X-Scrapingcow-Client","required":true,"schema":{"enum":["dashboard"],"type":"string"}},{"in":"query","name":"freshness_seconds","required":false,"schema":{"default":60,"maximum":86400,"minimum":1,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminExecutorHealth"}}},"description":"Executor registry health for every node, newest-enabled first; Cache-Control: no-store"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Malformed or out-of-range freshness_seconds"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Missing, malformed, invalid or expired session"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Authenticated session does not carry the platform_admin designation"}},"security":[{"csrfToken":[],"dashboardSession":[]}]}},"/platform/v1/admin/queue":{"get":{"description":"Operator-only platform queue depth. Requires a dashboard session carrying the platform_admin designation; a workspace owner is rejected with 403. Returns one row per job_status enum value (a closed set of five), the platform-wide queued total and its oldest age. No tenant row or job payload is exposed.","operationId":"adminQueueDepth","parameters":[{"in":"header","name":"X-Scrapingcow-Client","required":true,"schema":{"enum":["dashboard"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminQueueDepth"}}},"description":"Queue depth per status and the platform-wide queued total; Cache-Control: no-store"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Missing, malformed, invalid or expired session"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Authenticated session does not carry the platform_admin designation"}},"security":[{"csrfToken":[],"dashboardSession":[]}]}},"/platform/v1/admin/usage":{"get":{"description":"Operator-only per-tenant usage summary (credits and job totals) over a bounded window. Requires a dashboard session carrying the platform_admin designation. `window_seconds` is clamped to 60..=2678400 (31 days) and a malformed or out-of-range value is a 400. `team_id` optionally narrows the result to one tenant and never widens it; an unknown id yields an empty list.","operationId":"adminTenantUsage","parameters":[{"in":"header","name":"X-Scrapingcow-Client","required":true,"schema":{"enum":["dashboard"],"type":"string"}},{"in":"query","name":"window_seconds","required":false,"schema":{"default":86400,"maximum":2678400,"minimum":60,"type":"integer"}},{"in":"query","name":"team_id","required":false,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminTenantUsage"}}},"description":"Platform-wide or single-tenant usage ranking over the window; Cache-Control: no-store"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Malformed or out-of-range window_seconds"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Missing, malformed, invalid or expired session"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Authenticated session does not carry the platform_admin designation"}},"security":[{"csrfToken":[],"dashboardSession":[]}]}},"/platform/v1/analytics/events":{"get":{"description":"A bounded page of the caller's own analytics events (`usage_events`, migration 0027). Tenant-scoped, not operator-only: accepts a dashboard session or a `read`-scoped API key and returns only the caller's events (RLS `team_id = current_tenant_id()`). `limit` is clamped to 1..=100 and an opaque `cursor` pages backwards; a malformed cursor or out-of-range limit is a 400. `next_cursor` is present only when another page exists.","operationId":"listUsageEvents","parameters":[{"in":"header","name":"X-Scrapingcow-Client","required":false,"schema":{"enum":["dashboard"],"type":"string"}},{"in":"query","name":"limit","required":false,"schema":{"default":50,"maximum":100,"minimum":1,"type":"integer"}},{"in":"query","name":"cursor","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UsageEventPage"}}},"description":"The caller's own usage events, newest first; Cache-Control: no-store"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Malformed limit or cursor"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Missing, invalid or expired credential"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"API key lacks the read scope"}},"security":[{"csrfToken":[],"dashboardSession":[]},{"bearerAuth":[]}]}},"/platform/v1/api-keys":{"get":{"description":"Returns up to 200 recent keys with metadata and scopes only, never full secrets. Requires a dashboard session with the owner role in the selected workspace and X-CSRF-Token, including GET. Bearer API keys are never accepted, even with owner scope. API-key scopes are independent additive capabilities, not a role hierarchy, and grant no dashboard authority.","operationId":"listApiKeys","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyList"}}},"description":"Success"},"400":{"description":"Invalid request"},"401":{"description":"Sign-in required or invalid credentials"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Origin or CSRF check failed, or the selected-workspace role does not permit this action"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Sign-in rate or concurrency limit reached. Auth abuse/concurrency limits return ApiError without Retry-After; distinct from request-admission rate limiting."}},"security":[{"csrfToken":[],"dashboardSession":[]}]},"post":{"description":"Creates an API key and returns the full secret once. Maximum 100 active keys per workspace. Store the secret securely; it cannot be retrieved later. Response uses Cache-Control: no-store. Requires a dashboard session with the owner role in the selected workspace and X-CSRF-Token, including GET. Bearer API keys are never accepted, even with owner scope. API-key scopes are independent additive capabilities, not a role hierarchy, and grant no dashboard authority.","operationId":"createApiKey","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateApiKey"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatedApiKey"}}},"description":"Full secret returned once; Cache-Control: no-store","headers":{"Cache-Control":{"description":"Prevents caching the one-time secret","schema":{"enum":["no-store"],"type":"string"}}}},"400":{"description":"Invalid request"},"401":{"description":"Sign-in required or invalid credentials"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Origin or CSRF check failed, or the selected-workspace role does not permit this action"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Sign-in rate or concurrency limit reached. Auth abuse/concurrency limits return ApiError without Retry-After; distinct from request-admission rate limiting."}},"security":[{"csrfToken":[],"dashboardSession":[]}]}},"/platform/v1/api-keys/audit":{"get":{"description":"Returns at most 200 most recent API-key audit records for the selected workspace, newest first. Key names and subject IDs may be null. Requires a dashboard session with the owner role in the selected workspace and X-CSRF-Token, including GET. Bearer API keys are never accepted, even with owner scope. API-key scopes are independent additive capabilities, not a role hierarchy, and grant no dashboard authority.","operationId":"listApiKeyAudit","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyAuditList"}}},"description":"Success"},"400":{"description":"Invalid request"},"401":{"description":"Sign-in required or invalid credentials"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Origin or CSRF check failed, or the selected-workspace role does not permit this action"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Sign-in rate or concurrency limit reached. Auth abuse/concurrency limits return ApiError without Retry-After; distinct from request-admission rate limiting."}},"security":[{"csrfToken":[],"dashboardSession":[]}]}},"/platform/v1/api-keys/{id}/revoke":{"post":{"description":"Revokes an API key in the selected workspace. Repeated revocation remains successful and returns revoked:true; each successful request is audited. Missing or foreign keys return 404. Requires a dashboard session with the owner role in the selected workspace and X-CSRF-Token, including GET. Bearer API keys are never accepted, even with owner scope. API-key scopes are independent additive capabilities, not a role hierarchy, and grant no dashboard authority.","operationId":"revokeApiKey","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevokedApiKey"}}},"description":"Success"},"400":{"description":"Invalid request"},"401":{"description":"Sign-in required or invalid credentials"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Origin or CSRF check failed, or the selected-workspace role does not permit this action"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"API key missing or foreign"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Sign-in rate or concurrency limit reached. Auth abuse/concurrency limits return ApiError without Retry-After; distinct from request-admission rate limiting."}},"security":[{"csrfToken":[],"dashboardSession":[]}]}},"/platform/v1/api-keys/{id}/rotate":{"post":{"description":"Replaces an active API key, preserving its name, scopes and expiry (including null), and revokes the old key. Returns the replacement secret once; store it securely because it cannot be retrieved later. Response uses Cache-Control: no-store. Missing, foreign, revoked or expired keys return 404. Requires a dashboard session with the owner role in the selected workspace and X-CSRF-Token, including GET. Bearer API keys are never accepted, even with owner scope. API-key scopes are independent additive capabilities, not a role hierarchy, and grant no dashboard authority.","operationId":"rotateApiKey","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatedApiKey"}}},"description":"Full secret returned once; Cache-Control: no-store","headers":{"Cache-Control":{"description":"Prevents caching the one-time secret","schema":{"enum":["no-store"],"type":"string"}}}},"400":{"description":"Invalid request"},"401":{"description":"Sign-in required or invalid credentials"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Origin or CSRF check failed, or the selected-workspace role does not permit this action"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"API key missing, foreign, revoked or expired"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Sign-in rate or concurrency limit reached. Auth abuse/concurrency limits return ApiError without Retry-After; distinct from request-admission rate limiting."}},"security":[{"csrfToken":[],"dashboardSession":[]}]}},"/platform/v1/billing":{"get":{"description":"Session-authenticated account status, current or most recent credit period, usage, reservations, the active plan's capability entitlements (timeout, schedules, request body size, specialized APIs, result retention), and which payment provider is active.","operationId":"billingSummary","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingSummary"}}},"description":"Success"},"400":{"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Missing dashboard session"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Invalid CSRF token"},"409":{"description":"Existing subscription"},"503":{"description":"Payment provider unavailable or unconfigured"}},"security":[{"csrfToken":[],"dashboardSession":[]}]}},"/platform/v1/billing/checkout":{"post":{"description":"Create or reuse a checkout on the active payment provider for a server-allowlisted plan. Existing subscriptions return 409. Body: {plan: hobby|freelance|startup|business|business_plus}.","operationId":"billingCheckout","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"plan":{"enum":["hobby","freelance","startup","business","business_plus"],"type":"string"}},"required":["plan"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingCheckoutSession"}}},"description":"Success"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Missing dashboard session"},"403":{"description":"Invalid CSRF token"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Existing subscription"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Payment provider unavailable or unconfigured"}},"security":[{"csrfToken":[],"dashboardSession":[]}]}},"/platform/v1/billing/plans":{"get":{"description":"Public monthly USD plan catalog. A plan is available when the active payment provider is configured and maps that plan to one of its own price ids.","operationId":"billingPlans","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingPlanCatalog"}}},"description":"Success"},"400":{"description":"Invalid request"},"401":{"description":"Missing dashboard session"},"403":{"description":"Invalid CSRF token"},"409":{"description":"Existing subscription"},"503":{"description":"Payment provider unavailable or unconfigured"}},"security":[]}},"/platform/v1/billing/portal":{"post":{"description":"Create a subscription-management portal session for this workspace's customer on the active payment provider. Manage payment details, invoices and cancellation.","operationId":"billingPortal","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingPortalSession"}}},"description":"Success"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Missing dashboard session"},"403":{"description":"Invalid CSRF token"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Existing subscription"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Payment provider unavailable or unconfigured"}},"security":[{"csrfToken":[],"dashboardSession":[]}]}},"/platform/v1/configs":{"get":{"description":"Lists the workspace's saved configurations ordered by name. No pagination parameters. Dashboard session only; API keys are not accepted. Requires X-CSRF-Token even for GET and the owner, member or viewer role in the selected workspace.","operationId":"listScrapingConfigs","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"configs":{"items":{"$ref":"#/components/schemas/ScrapingConfig"},"type":"array"}},"required":["configs"],"type":"object"}}},"description":"Success"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Missing, invalid or expired dashboard session"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Invalid CSRF token or insufficient selected-workspace role"}},"security":[{"csrfToken":[],"dashboardSession":[]}],"x-required-scope":"read"},"post":{"description":"Creates a named request template. A duplicate name in the workspace returns 409. Dashboard session only; API keys are not accepted. Requires X-CSRF-Token even for GET and the owner or member role in the selected workspace.","operationId":"createScrapingConfig","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"name":{"description":"Nonblank after trimming, 1 to 128 bytes, no control characters.","maxLength":128,"minLength":1,"type":"string"},"request":{"additionalProperties":{"type":["string","boolean","number","null"]},"description":"Request template. Scalar values only; `_`-prefixed internal parameters are rejected.","type":"object"}},"required":["name","request"],"type":"object"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScrapingConfig"}}},"description":"Success"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Invalid name, or a template parameter that is not a scalar"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Missing, invalid or expired dashboard session"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Invalid CSRF token or insufficient selected-workspace role"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"A configuration with this name already exists in the workspace"}},"security":[{"csrfToken":[],"dashboardSession":[]}],"x-required-scope":"write"}},"/platform/v1/configs/{id}":{"delete":{"description":"Deletes a configuration. Jobs already created are unaffected: resolution happens once, before admission. Missing or foreign configurations return 404. Dashboard session only; API keys are not accepted. Requires X-CSRF-Token even for GET and the owner or member role in the selected workspace.","operationId":"deleteScrapingConfig","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessAck"}}},"description":"Success"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Missing, invalid or expired dashboard session"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Invalid CSRF token or insufficient selected-workspace role"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Configuration not found in the selected workspace"}},"security":[{"csrfToken":[],"dashboardSession":[]}],"x-required-scope":"write"},"get":{"description":"Returns one configuration. A configuration of another workspace returns 404. Dashboard session only; API keys are not accepted. Requires X-CSRF-Token even for GET and the owner, member or viewer role in the selected workspace.","operationId":"getScrapingConfig","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScrapingConfig"}}},"description":"Success"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Missing, invalid or expired dashboard session"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Invalid CSRF token or insufficient selected-workspace role"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Configuration not found in the selected workspace"}},"security":[{"csrfToken":[],"dashboardSession":[]}],"x-required-scope":"read"},"patch":{"description":"Updates name and/or request. Omitted fields are unchanged; renaming onto an existing name returns 409. Dashboard session only; API keys are not accepted. Requires X-CSRF-Token even for GET and the owner or member role in the selected workspace.","operationId":"updateScrapingConfig","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"additionalProperties":false,"minProperties":1,"properties":{"name":{"description":"Nonblank after trimming, 1 to 128 bytes, no control characters.","maxLength":128,"minLength":1,"type":["string","null"]},"request":{"additionalProperties":{"type":["string","boolean","number","null"]},"description":"Request template. Scalar values only; `_`-prefixed internal parameters are rejected.","type":["object","null"]}},"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScrapingConfig"}}},"description":"Success"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Invalid name, or a template parameter that is not a scalar"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Missing, invalid or expired dashboard session"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Invalid CSRF token or insufficient selected-workspace role"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Configuration not found in the selected workspace"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"A configuration with this name already exists in the workspace"}},"security":[{"csrfToken":[],"dashboardSession":[]}],"x-required-scope":"write"}},"/platform/v1/jobs":{"get":{"description":" Dashboard sessions require X-CSRF-Token and the owner, member or viewer role in the selected workspace. API-key scopes are independent capabilities; the key must hold x-required-scope. HEAD requires the same scope as GET.","operationId":"listJobs","parameters":[{"in":"query","name":"limit","schema":{"default":50,"maximum":100,"minimum":1,"type":"integer"}},{"in":"query","name":"cursor","schema":{"type":"string"}},{"in":"query","name":"status","schema":{"$ref":"#/components/schemas/JobStatus"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobPage"}}},"description":"JSON response matching the published schema."},"400":{"description":"Invalid input"},"401":{"description":"Invalid API key or invalid/expired dashboard session"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"API key lacks the required scope, CSRF check failed or selected-workspace role does not permit this action"},"404":{"description":"Resource not found for this team"},"409":{"description":"Conflicting idempotency key, terminal job, result unavailable, or schedule concurrency capacity reached"}},"security":[{"bearerAuth":[]},{"csrfToken":[],"dashboardSession":[]}],"x-required-scope":"read"},"post":{"description":" Dashboard sessions require X-CSRF-Token and the owner or member role in the selected workspace. API-key scopes are independent capabilities; the key must hold x-required-scope. HEAD requires the same scope as GET.","operationId":"createJob","parameters":[{"description":"Scoped to the team. Replay returns the original job; a different payload returns 409.","in":"header","name":"Idempotency-Key","schema":{"maxLength":255,"minLength":1,"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"additionalProperties":{"type":["string","boolean","number","object","array"]},"description":"HTML API parameters as JSON values; internal underscore parameters are rejected.","properties":{"url":{"format":"uri","type":"string"}},"required":["url"],"type":"object"}}},"required":true},"responses":{"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobAccepted"}}},"description":"JSON response matching the published schema."},"400":{"description":"Invalid input"},"401":{"description":"Invalid API key or invalid/expired dashboard session"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"API key lacks the required scope, CSRF check failed or selected-workspace role does not permit this action"},"404":{"description":"Resource not found for this team"},"409":{"description":"Conflicting idempotency key, terminal job, result unavailable, or schedule concurrency capacity reached"},"429":{"$ref":"#/components/responses/RequestRateLimited"}},"security":[{"bearerAuth":[]},{"csrfToken":[],"dashboardSession":[]}],"x-required-scope":"write"}},"/platform/v1/jobs/{id}":{"get":{"description":" Dashboard sessions require X-CSRF-Token and the owner, member or viewer role in the selected workspace. API-key scopes are independent capabilities; the key must hold x-required-scope. HEAD requires the same scope as GET.","operationId":"getJob","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobDetail"}}},"description":"JSON response matching the published schema."},"400":{"description":"Invalid input"},"401":{"description":"Invalid API key or invalid/expired dashboard session"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"API key lacks the required scope, CSRF check failed or selected-workspace role does not permit this action"},"404":{"description":"Resource not found for this team"},"409":{"description":"Conflicting idempotency key, terminal job, result unavailable, or schedule concurrency capacity reached"}},"security":[{"bearerAuth":[]},{"csrfToken":[],"dashboardSession":[]}],"x-required-scope":"read"}},"/platform/v1/jobs/{id}/attempts":{"get":{"description":" Dashboard sessions require X-CSRF-Token and the owner, member or viewer role in the selected workspace. API-key scopes are independent capabilities; the key must hold x-required-scope. HEAD requires the same scope as GET.","operationId":"getJobAttempts","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobAttemptList"}}},"description":"JSON response matching the published schema."},"400":{"description":"Invalid input"},"401":{"description":"Invalid API key or invalid/expired dashboard session"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"API key lacks the required scope, CSRF check failed or selected-workspace role does not permit this action"},"404":{"description":"Resource not found for this team"},"409":{"description":"Conflicting idempotency key, terminal job, result unavailable, or schedule concurrency capacity reached"}},"security":[{"bearerAuth":[]},{"csrfToken":[],"dashboardSession":[]}],"x-required-scope":"read"}},"/platform/v1/jobs/{id}/cancel":{"post":{"description":" Dashboard sessions require X-CSRF-Token and the owner or member role in the selected workspace. API-key scopes are independent capabilities; the key must hold x-required-scope. HEAD requires the same scope as GET.","operationId":"cancelJob","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CancelledJob"}}},"description":"JSON response matching the published schema."},"400":{"description":"Invalid input"},"401":{"description":"Invalid API key or invalid/expired dashboard session"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"API key lacks the required scope, CSRF check failed or selected-workspace role does not permit this action"},"404":{"description":"Resource not found for this team"},"409":{"description":"Conflicting idempotency key, terminal job, result unavailable, or schedule concurrency capacity reached"}},"security":[{"bearerAuth":[]},{"csrfToken":[],"dashboardSession":[]}],"x-required-scope":"write"}},"/platform/v1/jobs/{id}/result":{"get":{"description":" Dashboard sessions require X-CSRF-Token and the owner, member or viewer role in the selected workspace. API-key scopes are independent capabilities; the key must hold x-required-scope. HEAD requires the same scope as GET.","operationId":"getJobResult","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/octet-stream":{"schema":{"format":"binary","type":"string"}}},"description":"Successful native operation"},"400":{"description":"Invalid input"},"401":{"description":"Invalid API key or invalid/expired dashboard session"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"API key lacks the required scope, CSRF check failed or selected-workspace role does not permit this action"},"404":{"description":"Resource not found for this team"},"409":{"description":"Conflicting idempotency key, terminal job, result unavailable, or schedule concurrency capacity reached"}},"security":[{"bearerAuth":[]},{"csrfToken":[],"dashboardSession":[]}],"x-required-scope":"read"}},"/platform/v1/schedules":{"get":{"description":" Dashboard sessions require X-CSRF-Token and the owner, member or viewer role in the selected workspace. API-key scopes are independent capabilities; the key must hold x-required-scope. HEAD requires the same scope as GET.","operationId":"listSchedules","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduleSummaryList"}}},"description":"JSON response matching the published schema."},"400":{"description":"Invalid input"},"401":{"description":"Invalid API key or invalid/expired dashboard session"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"API key lacks the required scope, CSRF check failed or selected-workspace role does not permit this action"},"404":{"description":"Resource not found for this team"},"409":{"description":"Conflicting idempotency key, terminal job, result unavailable, or schedule concurrency capacity reached"}},"security":[{"bearerAuth":[]},{"csrfToken":[],"dashboardSession":[]}],"x-required-scope":"read"},"post":{"description":" Dashboard sessions require X-CSRF-Token and the owner or member role in the selected workspace. API-key scopes are independent capabilities; the key must hold x-required-scope. HEAD requires the same scope as GET.","operationId":"createSchedule","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"additionalProperties":false,"description":"Exactly one timing field must match kind. Cron uses the Rust cron parser's seconds-first syntax. PATCH validates merged state; use null to clear the previous timing field when changing kind.","properties":{"catch_up_limit":{"default":1,"maximum":100,"minimum":1,"type":"integer"},"cron_expression":{"type":["string","null"]},"interval_seconds":{"minimum":1,"type":["integer","null"]},"jitter_seconds":{"default":0,"maximum":3600,"minimum":0,"type":"integer"},"kind":{"enum":["cron","interval"],"type":"string"},"max_concurrent_runs":{"default":1,"maximum":100,"minimum":1,"type":"integer"},"misfire_policy":{"default":"run_once","enum":["skip","run_once","catch_up"],"type":"string"},"name":{"minLength":1,"type":"string"},"overlap_policy":{"default":"skip","enum":["skip","allow"],"type":"string"},"request":{"description":"HTML API request template","type":"object"},"result_retention_seconds":{"description":"Per-schedule result retention for jobs created by this schedule. When null the team plan's retention applies. Distinct from run_retention_seconds.","maximum":31536000,"minimum":3600,"type":["integer","null"]},"run_retention_seconds":{"default":2592000,"description":"Run-history retention, not result/job deletion.","maximum":31536000,"minimum":3600,"type":"integer"},"timezone":{"default":"UTC","type":"string"},"webhook_endpoint_ids":{"description":"Webhook endpoints of this team that receive terminal job events for this schedule. Omitted or empty preserves the default fan-out to every enabled endpoint.","items":{"format":"uuid","type":"string"},"maxItems":100,"type":["array","null"],"uniqueItems":true}},"required":["name","kind","request"],"type":"object"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatedSchedule"}}},"description":"JSON response matching the published schema."},"400":{"description":"Invalid input"},"401":{"description":"Invalid API key or invalid/expired dashboard session"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"API key lacks the required scope, CSRF check failed or selected-workspace role does not permit this action"},"404":{"description":"Resource not found for this team"},"409":{"description":"Conflicting idempotency key, terminal job, result unavailable, or schedule concurrency capacity reached"}},"security":[{"bearerAuth":[]},{"csrfToken":[],"dashboardSession":[]}],"x-required-scope":"write"}},"/platform/v1/schedules/{id}":{"delete":{"description":" Dashboard sessions require X-CSRF-Token and the owner or member role in the selected workspace. API-key scopes are independent capabilities; the key must hold x-required-scope. HEAD requires the same scope as GET.","operationId":"deleteSchedule","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeletedSchedule"}}},"description":"JSON response matching the published schema."},"400":{"description":"Invalid input"},"401":{"description":"Invalid API key or invalid/expired dashboard session"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"API key lacks the required scope, CSRF check failed or selected-workspace role does not permit this action"},"404":{"description":"Resource not found for this team"},"409":{"description":"Conflicting idempotency key, terminal job, result unavailable, or schedule concurrency capacity reached"}},"security":[{"bearerAuth":[]},{"csrfToken":[],"dashboardSession":[]}],"x-required-scope":"write"},"get":{"description":" Dashboard sessions require X-CSRF-Token and the owner, member or viewer role in the selected workspace. API-key scopes are independent capabilities; the key must hold x-required-scope. HEAD requires the same scope as GET.","operationId":"getSchedule","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Schedule"}}},"description":"JSON response matching the published schema."},"400":{"description":"Invalid input"},"401":{"description":"Invalid API key or invalid/expired dashboard session"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"API key lacks the required scope, CSRF check failed or selected-workspace role does not permit this action"},"404":{"description":"Resource not found for this team"},"409":{"description":"Conflicting idempotency key, terminal job, result unavailable, or schedule concurrency capacity reached"}},"security":[{"bearerAuth":[]},{"csrfToken":[],"dashboardSession":[]}],"x-required-scope":"read"},"patch":{"description":" Dashboard sessions require X-CSRF-Token and the owner or member role in the selected workspace. API-key scopes are independent capabilities; the key must hold x-required-scope. HEAD requires the same scope as GET.","operationId":"patchSchedule","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"additionalProperties":false,"description":"Exactly one timing field must match kind. Cron uses the Rust cron parser's seconds-first syntax. PATCH validates merged state; use null to clear the previous timing field when changing kind.","minProperties":1,"properties":{"catch_up_limit":{"default":1,"maximum":100,"minimum":1,"type":"integer"},"cron_expression":{"type":["string","null"]},"interval_seconds":{"minimum":1,"type":["integer","null"]},"jitter_seconds":{"default":0,"maximum":3600,"minimum":0,"type":"integer"},"kind":{"enum":["cron","interval"],"type":"string"},"max_concurrent_runs":{"default":1,"maximum":100,"minimum":1,"type":"integer"},"misfire_policy":{"default":"run_once","enum":["skip","run_once","catch_up"],"type":"string"},"name":{"minLength":1,"type":"string"},"overlap_policy":{"default":"skip","enum":["skip","allow"],"type":"string"},"request":{"description":"HTML API request template","type":"object"},"result_retention_seconds":{"description":"Per-schedule result retention for jobs created by this schedule. When null the team plan's retention applies. Distinct from run_retention_seconds.","maximum":31536000,"minimum":3600,"type":["integer","null"]},"run_retention_seconds":{"default":2592000,"description":"Run-history retention, not result/job deletion.","maximum":31536000,"minimum":3600,"type":"integer"},"timezone":{"default":"UTC","type":"string"},"webhook_endpoint_ids":{"description":"Webhook endpoints of this team that receive terminal job events for this schedule. Omitted or empty preserves the default fan-out to every enabled endpoint.","items":{"format":"uuid","type":"string"},"maxItems":100,"type":["array","null"],"uniqueItems":true}},"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Schedule"}}},"description":"JSON response matching the published schema."},"400":{"description":"Invalid input"},"401":{"description":"Invalid API key or invalid/expired dashboard session"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"API key lacks the required scope, CSRF check failed or selected-workspace role does not permit this action"},"404":{"description":"Resource not found for this team"},"409":{"description":"Conflicting idempotency key, terminal job, result unavailable, or schedule concurrency capacity reached"}},"security":[{"bearerAuth":[]},{"csrfToken":[],"dashboardSession":[]}],"x-required-scope":"write"}},"/platform/v1/schedules/{id}/pause":{"post":{"description":" Dashboard sessions require X-CSRF-Token and the owner or member role in the selected workspace. API-key scopes are independent capabilities; the key must hold x-required-scope. HEAD requires the same scope as GET.","operationId":"pauseSchedule","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduleEnabled"}}},"description":"JSON response matching the published schema."},"400":{"description":"Invalid input"},"401":{"description":"Invalid API key or invalid/expired dashboard session"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"API key lacks the required scope, CSRF check failed or selected-workspace role does not permit this action"},"404":{"description":"Resource not found for this team"},"409":{"description":"Conflicting idempotency key, terminal job, result unavailable, or schedule concurrency capacity reached"}},"security":[{"bearerAuth":[]},{"csrfToken":[],"dashboardSession":[]}],"x-required-scope":"write"}},"/platform/v1/schedules/{id}/resume":{"post":{"description":" Dashboard sessions require X-CSRF-Token and the owner or member role in the selected workspace. API-key scopes are independent capabilities; the key must hold x-required-scope. HEAD requires the same scope as GET.","operationId":"resumeSchedule","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduleEnabled"}}},"description":"JSON response matching the published schema."},"400":{"description":"Invalid input"},"401":{"description":"Invalid API key or invalid/expired dashboard session"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"API key lacks the required scope, CSRF check failed or selected-workspace role does not permit this action"},"404":{"description":"Resource not found for this team"},"409":{"description":"Conflicting idempotency key, terminal job, result unavailable, or schedule concurrency capacity reached"}},"security":[{"bearerAuth":[]},{"csrfToken":[],"dashboardSession":[]}],"x-required-scope":"write"}},"/platform/v1/schedules/{id}/run":{"post":{"description":" Dashboard sessions require X-CSRF-Token and the owner or member role in the selected workspace. API-key scopes are independent capabilities; the key must hold x-required-scope. HEAD requires the same scope as GET.","operationId":"runSchedule","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnqueuedScheduleRun"}}},"description":"JSON response matching the published schema."},"400":{"description":"Invalid input"},"401":{"description":"Invalid API key or invalid/expired dashboard session"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"API key lacks the required scope, CSRF check failed or selected-workspace role does not permit this action"},"404":{"description":"Resource not found for this team"},"409":{"description":"Conflicting idempotency key, terminal job, result unavailable, or schedule concurrency capacity reached"}},"security":[{"bearerAuth":[]},{"csrfToken":[],"dashboardSession":[]}],"x-required-scope":"write"}},"/platform/v1/schedules/{id}/runs":{"get":{"description":" Dashboard sessions require X-CSRF-Token and the owner, member or viewer role in the selected workspace. API-key scopes are independent capabilities; the key must hold x-required-scope. HEAD requires the same scope as GET.","operationId":"listScheduleRuns","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"query","name":"limit","schema":{"default":50,"maximum":100,"minimum":1,"type":"integer"}},{"in":"query","name":"cursor","schema":{"type":"string"}},{"in":"query","name":"status","schema":{"$ref":"#/components/schemas/JobStatus"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduleRunPage"}}},"description":"JSON response matching the published schema."},"400":{"description":"Invalid input"},"401":{"description":"Invalid API key or invalid/expired dashboard session"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"API key lacks the required scope, CSRF check failed or selected-workspace role does not permit this action"},"404":{"description":"Resource not found for this team"},"409":{"description":"Conflicting idempotency key, terminal job, result unavailable, or schedule concurrency capacity reached"}},"security":[{"bearerAuth":[]},{"csrfToken":[],"dashboardSession":[]}],"x-required-scope":"read"}},"/platform/v1/webhooks":{"get":{"description":"Lists up to 100 endpoints, newest first. Signing secrets are omitted. Dashboard session only; API keys are not accepted. Requires X-CSRF-Token even for GET and the owner, member or viewer role in the selected workspace.","operationId":"listWebhooks","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"endpoints":{"items":{"$ref":"#/components/schemas/WebhookEndpoint"},"maxItems":100,"type":"array"}},"required":["endpoints"],"type":"object"}}},"description":"Success"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Missing, invalid or expired dashboard session"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Invalid CSRF token or insufficient selected-workspace role"}},"security":[{"csrfToken":[],"dashboardSession":[]}]},"post":{"description":"Creates an enabled endpoint for terminal job events; maximum 100 endpoints per workspace. Returns its signing secret once with Cache-Control: no-store. Deliveries are at-least-once: verify X-ScrapingCow-Signature (t=<unix>,v1=<hex>) as HMAC-SHA256 over exact timestamp.payload bytes, enforce 300-second clock skew and deduplicate payload (id,type). Dashboard session only; API keys are not accepted. Requires X-CSRF-Token even for GET and the owner or member role in the selected workspace.","operationId":"createWebhook","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"name":{"description":"Nonblank after trimming; maximum 120 UTF-8 bytes before trimming.","minLength":1,"type":"string"},"url":{"description":"Public HTTP(S) URL, maximum 2048 UTF-8 bytes. No credentials, private or special-use destinations; all DNS answers must be public. Fragments are removed. Deliveries do not follow redirects.","format":"uri","type":"string"}},"required":["name","url"],"type":"object"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatedWebhookEndpoint"}}},"description":"Success","headers":{"Cache-Control":{"schema":{"const":"no-store","type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Invalid name or destination, or endpoint capacity reached"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Missing, invalid or expired dashboard session"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Invalid CSRF token or insufficient selected-workspace role"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Webhook signing is not configured"}},"security":[{"csrfToken":[],"dashboardSession":[]}]}},"/platform/v1/webhooks/{id}":{"delete":{"description":"Deletes the endpoint and its delivery history. Returns no body. Dashboard session only; API keys are not accepted. Requires X-CSRF-Token even for GET and the owner or member role in the selected workspace.","operationId":"deleteWebhook","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"204":{"description":"Success"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Missing, invalid or expired dashboard session"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Invalid CSRF token or insufficient selected-workspace role"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Endpoint not found in the selected workspace"}},"security":[{"csrfToken":[],"dashboardSession":[]}]},"get":{"description":"Returns endpoint metadata without the signing secret. Dashboard session only; API keys are not accepted. Requires X-CSRF-Token even for GET and the owner, member or viewer role in the selected workspace.","operationId":"getWebhook","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpoint"}}},"description":"Success"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Missing, invalid or expired dashboard session"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Invalid CSRF token or insufficient selected-workspace role"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Endpoint not found in the selected workspace"}},"security":[{"csrfToken":[],"dashboardSession":[]}]},"patch":{"description":"Updates endpoint metadata. Omitted or null fields are unchanged; an empty object is accepted. Does not rotate or reveal the signing secret. Dashboard session only; API keys are not accepted. Requires X-CSRF-Token even for GET and the owner or member role in the selected workspace.","operationId":"updateWebhook","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"enabled":{"type":["boolean","null"]},"name":{"description":"Nonblank after trimming; maximum 120 UTF-8 bytes before trimming.","minLength":1,"type":["string","null"]},"url":{"description":"Public HTTP(S) URL, maximum 2048 UTF-8 bytes. No credentials, private or special-use destinations; all DNS answers must be public. Fragments are removed. Deliveries do not follow redirects.","format":"uri","type":["string","null"]}},"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpoint"}}},"description":"Success"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Invalid name or destination, or endpoint capacity reached"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Missing, invalid or expired dashboard session"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Invalid CSRF token or insufficient selected-workspace role"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Endpoint not found in the selected workspace"}},"security":[{"csrfToken":[],"dashboardSession":[]}]}},"/platform/v1/webhooks/{id}/deliveries":{"get":{"description":"Lists up to 100 most recent deliveries ordered by created_at descending, then id. No pagination parameters. Payload is returned as its exact serialized JSON string. Dashboard session only; API keys are not accepted. Requires X-CSRF-Token even for GET and the owner, member or viewer role in the selected workspace.","operationId":"listWebhookDeliveries","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"deliveries":{"items":{"$ref":"#/components/schemas/WebhookDelivery"},"maxItems":100,"type":"array"}},"required":["deliveries"],"type":"object"}}},"description":"Success"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Missing, invalid or expired dashboard session"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Invalid CSRF token or insufficient selected-workspace role"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Endpoint not found in the selected workspace"}},"security":[{"csrfToken":[],"dashboardSession":[]}]}},"/platform/v1/workspaces":{"get":{"description":"Lists the authenticated user's workspace memberships and the workspace selected in this session. Any membership role is allowed. Dashboard session cookie, X-CSRF-Token and X-Scrapingcow-Client: dashboard are required, including for GET. Bearer API keys are not accepted. A supplied Origin must match DASHBOARD_ORIGIN; Sec-Fetch-Site: cross-site is rejected.","operationId":"listWorkspaces","parameters":[{"in":"header","name":"X-Scrapingcow-Client","required":true,"schema":{"enum":["dashboard"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceList"}}},"description":"Success; Cache-Control: no-store"},"400":{"description":"Invalid input or malformed path UUID"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Missing, malformed, invalid or expired session"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Dashboard client, origin or CSRF check failed, or workspace operation not permitted"}},"security":[{"csrfToken":[],"dashboardSession":[]}]},"post":{"description":"Creates a workspace and an owner membership for the authenticated user. Any current membership role is allowed. Does not select the new workspace; switch explicitly. Dashboard session cookie, X-CSRF-Token and X-Scrapingcow-Client: dashboard are required, including for GET. Bearer API keys are not accepted. A supplied Origin must match DASHBOARD_ORIGIN; Sec-Fetch-Site: cross-site is rejected.","operationId":"createWorkspace","parameters":[{"in":"header","name":"X-Scrapingcow-Client","required":true,"schema":{"enum":["dashboard"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWorkspace"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatedWorkspace"}}},"description":"Success; Cache-Control: no-store"},"400":{"description":"Invalid input or malformed path UUID"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Missing, malformed, invalid or expired session"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Dashboard client, origin or CSRF check failed, or workspace operation not permitted"}},"security":[{"csrfToken":[],"dashboardSession":[]}]}},"/platform/v1/workspaces/{team_id}/members":{"get":{"description":"Lists members of the selected workspace. team_id must match the session's selected workspace; owner, member and viewer roles are allowed. Otherwise returns 403. Dashboard session cookie, X-CSRF-Token and X-Scrapingcow-Client: dashboard are required, including for GET. Bearer API keys are not accepted. A supplied Origin must match DASHBOARD_ORIGIN; Sec-Fetch-Site: cross-site is rejected.","operationId":"listWorkspaceMembers","parameters":[{"in":"header","name":"X-Scrapingcow-Client","required":true,"schema":{"enum":["dashboard"],"type":"string"}},{"in":"path","name":"team_id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceMemberList"}}},"description":"Success; Cache-Control: no-store"},"400":{"description":"Invalid input or malformed path UUID"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Missing, malformed, invalid or expired session"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Dashboard client, origin or CSRF check failed, or workspace operation not permitted"}},"security":[{"csrfToken":[],"dashboardSession":[]}]},"post":{"description":"Requires the owner role in the selected workspace and a matching team_id. Adds an enabled user by username with the requested role. Unknown or disabled usernames and existing memberships receive the same generic 202 accepted:true response; an existing membership's role is not changed. Unauthorized operations return 403, and a malformed username returns 400. Dashboard session cookie, X-CSRF-Token and X-Scrapingcow-Client: dashboard are required, including for GET. Bearer API keys are not accepted. A supplied Origin must match DASHBOARD_ORIGIN; Sec-Fetch-Site: cross-site is rejected.","operationId":"addWorkspaceMember","parameters":[{"in":"header","name":"X-Scrapingcow-Client","required":true,"schema":{"enum":["dashboard"],"type":"string"}},{"in":"path","name":"team_id","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddWorkspaceMember"}}},"required":true},"responses":{"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AcceptedWorkspaceMember"}}},"description":"Success; Cache-Control: no-store"},"400":{"description":"Invalid input or malformed path UUID"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Missing, malformed, invalid or expired session"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Dashboard client, origin or CSRF check failed, or workspace operation not permitted"}},"security":[{"csrfToken":[],"dashboardSession":[]}]}},"/platform/v1/workspaces/{team_id}/members/{user_id}":{"delete":{"description":"Requires the owner role in the selected workspace and a matching team_id. Removes an existing membership. Cannot remove the final owner. Unauthorized operations, missing membership and final-owner removal return 403. Dashboard session cookie, X-CSRF-Token and X-Scrapingcow-Client: dashboard are required, including for GET. Bearer API keys are not accepted. A supplied Origin must match DASHBOARD_ORIGIN; Sec-Fetch-Site: cross-site is rejected.","operationId":"removeWorkspaceMember","parameters":[{"in":"header","name":"X-Scrapingcow-Client","required":true,"schema":{"enum":["dashboard"],"type":"string"}},{"in":"path","name":"team_id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"path","name":"user_id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RemovedWorkspaceMember"}}},"description":"Success; Cache-Control: no-store"},"400":{"description":"Invalid input or malformed path UUID"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Missing, malformed, invalid or expired session"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Dashboard client, origin or CSRF check failed, or workspace operation not permitted"}},"security":[{"csrfToken":[],"dashboardSession":[]}]},"patch":{"description":"Requires the owner role in the selected workspace and a matching team_id. Changes an existing membership role. Cannot demote the final owner. Unauthorized operations, missing membership and final-owner demotion return 403. Dashboard session cookie, X-CSRF-Token and X-Scrapingcow-Client: dashboard are required, including for GET. Bearer API keys are not accepted. A supplied Origin must match DASHBOARD_ORIGIN; Sec-Fetch-Site: cross-site is rejected.","operationId":"changeWorkspaceMemberRole","parameters":[{"in":"header","name":"X-Scrapingcow-Client","required":true,"schema":{"enum":["dashboard"],"type":"string"}},{"in":"path","name":"team_id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"path","name":"user_id","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangeWorkspaceMemberRole"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatedWorkspaceMember"}}},"description":"Success; Cache-Control: no-store"},"400":{"description":"Invalid input or malformed path UUID"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Missing, malformed, invalid or expired session"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Dashboard client, origin or CSRF check failed, or workspace operation not permitted"}},"security":[{"csrfToken":[],"dashboardSession":[]}]}},"/platform/v1/workspaces/{team_id}/switch":{"post":{"description":"Selects a workspace for this session only. Requires membership in the target workspace (owner, member or viewer); it need not be the currently selected workspace. Returns 403 when switching is not permitted. Dashboard session cookie, X-CSRF-Token and X-Scrapingcow-Client: dashboard are required, including for GET. Bearer API keys are not accepted. A supplied Origin must match DASHBOARD_ORIGIN; Sec-Fetch-Site: cross-site is rejected.","operationId":"switchWorkspace","parameters":[{"in":"header","name":"X-Scrapingcow-Client","required":true,"schema":{"enum":["dashboard"],"type":"string"}},{"in":"path","name":"team_id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwitchedWorkspace"}}},"description":"Success; Cache-Control: no-store"},"400":{"description":"Invalid input or malformed path UUID"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Missing, malformed, invalid or expired session"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Dashboard client, origin or CSRF check failed, or workspace operation not permitted"}},"security":[{"csrfToken":[],"dashboardSession":[]}]}}}}