{"openapi":"3.1.0","info":{"title":"Fetcher API","description":"\nFetcher executes generic web fetch jobs for independent consumer systems.\n\n## Workflow\n\n1. Authenticate with a consumer API key and create a job.\n2. Poll the job or list jobs until it reaches a terminal state.\n3. Read result metadata and download the stored response body.\n4. Report downstream validation feedback so routing quality can improve.\n\nFetcher does not parse products, translations, matches, or other business data. It opens a URL,\nexecutes versioned generic instructions, stores the execution result, and exposes it to its owner.\n\n## Authentication and errors\n\nUse `Authorization: Bearer <api-key>`. Keys are tenant-scoped and permission-scoped. Command\nretries should carry `Idempotency-Key`. Errors use `application/problem+json`; retain the returned\n`request_id` when reporting an incident.\n\nThe published contract is consumer-facing and tenant-isolated. Use the `Jobs` endpoints to submit,\ninspect, manage, and retrieve work owned by your integration.\n","version":"0.1.0"},"servers":[{"url":"https://fetcher.ytools.org","description":"Public API"}],"paths":{"/health/live":{"get":{"tags":["Health"],"summary":"Live","operationId":"live_health_live_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Live Health Live Get"}}}}}}},"/health/ready":{"get":{"tags":["Health"],"summary":"Ready","operationId":"ready_health_ready_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Ready Health Ready Get"}}}}}}},"/v1/jobs":{"post":{"tags":["Jobs"],"summary":"Create a fetch job","description":"Queues a generic URL fetch. An idempotent replay returns HTTP 200.","operationId":"create_job","security":[{"HTTPBearer":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":128},{"type":"null"}],"description":"Makes retries safe; reuse only with the identical logical request.","title":"Idempotency-Key"},"description":"Makes retries safe; reuse only with the identical logical request."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateJobRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateJobResponse"}}}},"401":{"description":"API key is missing, invalid, or expired","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"403":{"description":"API key lacks the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"404":{"description":"Resource does not exist for this consumer","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"409":{"description":"Operation conflicts with resource state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"422":{"description":"Payload or operation is invalid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"429":{"description":"Consumer queue quota was reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateJobResponse"}}},"description":"Accepted"}},"x-required-scopes":["jobs:create"]},"get":{"tags":["Jobs"],"summary":"List jobs","description":"Lists jobs owned by the authenticated consumer, newest first. Deleted jobs are hidden.","operationId":"list_jobs","security":[{"HTTPBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/JobStatus"},{"type":"null"}],"description":"Filter by lifecycle status","title":"Status"},"description":"Filter by lifecycle status"},{"name":"created_after","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Only jobs after this RFC 3339 time","title":"Created After"},"description":"Only jobs after this RFC 3339 time"},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Opaque cursor from the previous page","title":"Cursor"},"description":"Opaque cursor from the previous page"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Maximum page size","default":50,"title":"Limit"},"description":"Maximum page size"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobListResponse"}}}},"401":{"description":"API key is missing, invalid, or expired","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"403":{"description":"API key lacks the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"404":{"description":"Resource does not exist for this consumer","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"409":{"description":"Operation conflicts with resource state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"422":{"description":"Payload or operation is invalid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"429":{"description":"Consumer queue quota was reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}}},"x-required-scopes":["jobs:read"]}},"/v1/jobs/{job_id}/refetch":{"post":{"tags":["Jobs"],"summary":"Refetch a job","description":"Creates a new job from a terminal source job's immutable request snapshot.","operationId":"refetch_job","security":[{"HTTPBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":128},{"type":"null"}],"description":"Makes retries safe; reuse only with the identical logical request.","title":"Idempotency-Key"},"description":"Makes retries safe; reuse only with the identical logical request."}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/CreateJobRequest"},{"type":"null"}],"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateJobResponse"}}}},"401":{"description":"API key is missing, invalid, or expired","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"403":{"description":"API key lacks the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"404":{"description":"Resource does not exist for this consumer","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"409":{"description":"Operation conflicts with resource state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"422":{"description":"Payload or operation is invalid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"429":{"description":"Consumer queue quota was reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateJobResponse"}}},"description":"Accepted"}},"x-required-scopes":["jobs:refetch"]}},"/v1/jobs/{job_id}/cancel":{"post":{"tags":["Jobs"],"summary":"Cancel a job","description":"Cancels a queued/running job and invalidates its active lease.","operationId":"cancel_job","security":[{"HTTPBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobResponse"}}}},"401":{"description":"API key is missing, invalid, or expired","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"403":{"description":"API key lacks the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"404":{"description":"Resource does not exist for this consumer","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"409":{"description":"Operation conflicts with resource state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"422":{"description":"Payload or operation is invalid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"429":{"description":"Consumer queue quota was reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}}},"x-required-scopes":["jobs:cancel"]}},"/v1/jobs/{job_id}/feedback":{"post":{"tags":["Jobs"],"summary":"Report downstream result quality","description":"Records one effective validation verdict without altering execution status.","operationId":"record_job_feedback","security":[{"HTTPBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":128},{"type":"null"}],"description":"Makes retries safe; reuse only with the identical logical request.","title":"Idempotency-Key"},"description":"Makes retries safe; reuse only with the identical logical request."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackResponse"}}}},"401":{"description":"API key is missing, invalid, or expired","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"403":{"description":"API key lacks the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"404":{"description":"Resource does not exist for this consumer","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"409":{"description":"Operation conflicts with resource state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"422":{"description":"Payload or operation is invalid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"429":{"description":"Consumer queue quota was reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}}},"x-required-scopes":["jobs:feedback"]}},"/v1/jobs/{job_id}/consumer-state":{"put":{"tags":["Jobs"],"summary":"Replace consumer processing state","description":"Replaces the consumer-owned workflow projection embedded on a job. Fetcher stores and indexes this data but does not interpret it.","operationId":"replace_job_consumer_state","security":[{"HTTPBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsumerStateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobResponse"}}}},"401":{"description":"API key is missing, invalid, or expired","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"403":{"description":"API key lacks the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"404":{"description":"Resource does not exist for this consumer","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"409":{"description":"Operation conflicts with resource state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"422":{"description":"Payload or operation is invalid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"429":{"description":"Consumer queue quota was reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}}},"x-required-scopes":["jobs:update"]}},"/v1/jobs/{job_id}/processing-outcome":{"post":{"tags":["Jobs"],"summary":"Record final consumer processing outcome","description":"Atomically replaces consumer-owned workflow state and records its immutable quality verdict for a succeeded execution.","operationId":"record_job_processing_outcome","security":[{"HTTPBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":128},{"type":"null"}],"description":"Makes retries safe; reuse only with the identical logical request.","title":"Idempotency-Key"},"description":"Makes retries safe; reuse only with the identical logical request."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingOutcomeRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingOutcomeResponse"}}}},"401":{"description":"API key is missing, invalid, or expired","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"403":{"description":"API key lacks the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"404":{"description":"Resource does not exist for this consumer","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"409":{"description":"Operation conflicts with resource state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"422":{"description":"Payload or operation is invalid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"429":{"description":"Consumer queue quota was reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}}},"x-required-scopes":["jobs:update","jobs:feedback"]}},"/v1/jobs/bulk-actions":{"post":{"tags":["Jobs"],"summary":"Apply a lifecycle action to jobs","description":"Applies cancel, delete, refetch, or restart to at most 100 explicit job IDs. Delete first cancels active jobs. Restart reliably replaces each source from its stored request, preserves consumer metadata, and removes the source. Failures are isolated and reported per item. Refetch and restart require Idempotency-Key.","operationId":"bulk_job_action","security":[{"HTTPBearer":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":128},{"type":"null"}],"description":"Makes retries safe; reuse only with the identical logical request.","title":"Idempotency-Key"},"description":"Makes retries safe; reuse only with the identical logical request."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkJobActionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkJobActionResponse"}}}},"401":{"description":"API key is missing, invalid, or expired","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"403":{"description":"API key lacks the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"404":{"description":"Resource does not exist for this consumer","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"409":{"description":"Operation conflicts with resource state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"422":{"description":"Payload or operation is invalid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"429":{"description":"Consumer queue quota was reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}}}}},"/v1/jobs/{job_id}":{"delete":{"tags":["Jobs"],"summary":"Delete a terminal job","description":"Deletes a terminal job and its artifact. By default the document is removed; with logical deletion enabled a tombstone remains until retention purge.","operationId":"delete_job","security":[{"HTTPBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"204":{"description":"Successful Response"},"401":{"description":"API key is missing, invalid, or expired","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"403":{"description":"API key lacks the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"404":{"description":"Resource does not exist for this consumer","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"409":{"description":"Operation conflicts with resource state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"422":{"description":"Payload or operation is invalid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"429":{"description":"Consumer queue quota was reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}}},"x-required-scopes":["jobs:delete"]},"get":{"tags":["Jobs"],"summary":"Get a job","description":"Returns lifecycle, current attempt, aggregate usage/cost, and result availability.","operationId":"get_job","security":[{"HTTPBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobDetailResponse"}}}},"401":{"description":"API key is missing, invalid, or expired","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"403":{"description":"API key lacks the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"404":{"description":"Resource does not exist for this consumer","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"409":{"description":"Operation conflicts with resource state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"422":{"description":"Payload or operation is invalid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"429":{"description":"Consumer queue quota was reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}}},"x-required-scopes":["jobs:read"]}},"/v1/jobs/search":{"post":{"tags":["Jobs"],"summary":"Search jobs","description":"Runs a bounded, tenant-isolated dashboard query with totals and facets. Consumer state and references are opaque to Fetcher.","operationId":"search_jobs","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobSearchRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobSearchResponse"}}}},"401":{"description":"API key is missing, invalid, or expired","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"403":{"description":"API key lacks the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"404":{"description":"Resource does not exist for this consumer","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"409":{"description":"Operation conflicts with resource state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"422":{"description":"Payload or operation is invalid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"429":{"description":"Consumer queue quota was reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}}},"security":[{"HTTPBearer":[]}],"x-required-scopes":["jobs:read"]}},"/v1/jobs/{job_id}/result":{"get":{"tags":["Jobs"],"summary":"Get result metadata","description":"Returns metadata and a content URL; the fetched body is stored in the artifact store, outside PostgreSQL.","operationId":"get_job_result","security":[{"HTTPBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResultResponse"}}}},"401":{"description":"API key is missing, invalid, or expired","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"403":{"description":"API key lacks the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"404":{"description":"Resource does not exist for this consumer","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"409":{"description":"Operation conflicts with resource state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"422":{"description":"Payload or operation is invalid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"429":{"description":"Consumer queue quota was reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}}},"x-required-scopes":["jobs:read"]}},"/v1/jobs/{job_id}/result/content":{"get":{"tags":["Jobs"],"summary":"Download result content","description":"Streams the stored response body, normally gzip encoded. Supports ETag conditional retrieval.","operationId":"download_job_result","security":[{"HTTPBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}},"application/octet-stream":{}}},"401":{"description":"API key is missing, invalid, or expired","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"403":{"description":"API key lacks the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"404":{"description":"Resource does not exist for this consumer","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"409":{"description":"Operation conflicts with resource state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"422":{"description":"Payload or operation is invalid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"429":{"description":"Consumer queue quota was reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"304":{"description":"Not Modified"}},"x-required-scopes":["jobs:read"]}}},"components":{"schemas":{"AttemptResponse":{"properties":{"id":{"type":"string","title":"Id"},"number":{"type":"integer","title":"Number"},"provider":{"$ref":"#/components/schemas/Provider"},"status":{"type":"string","title":"Status"},"worker_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Worker Id"},"worker_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Worker Version"},"started_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Started At"},"completed_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Completed At"},"lease_expires_at":{"type":"string","title":"Lease Expires At"},"failure":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Failure"}},"additionalProperties":false,"type":"object","required":["id","number","provider","status","worker_id","worker_version","started_at","completed_at","lease_expires_at","failure"],"title":"AttemptResponse","description":"Execution-provider invocation summary embedded in a Job response."},"BulkJobAction":{"type":"string","enum":["cancel","delete","refetch","restart"],"title":"BulkJobAction"},"BulkJobActionItem":{"properties":{"job_id":{"type":"string","title":"Job Id"},"ok":{"type":"boolean","title":"Ok"},"resulting_job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resulting Job Id"},"error_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Code"}},"additionalProperties":false,"type":"object","required":["job_id","ok"],"title":"BulkJobActionItem"},"BulkJobActionRequest":{"properties":{"job_ids":{"items":{"type":"string"},"type":"array","maxItems":100,"minItems":1,"title":"Job Ids"},"action":{"$ref":"#/components/schemas/BulkJobAction"},"replacement_state":{"anyOf":[{"type":"string","maxLength":128,"minLength":1},{"type":"null"}],"title":"Replacement State","description":"Initial consumer-owned state for replacements created by restart. Labels, references, and context are preserved from each source job."}},"additionalProperties":false,"type":"object","required":["job_ids","action"],"title":"BulkJobActionRequest","description":"Bounded synchronous lifecycle command over explicit tenant-owned job IDs."},"BulkJobActionResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/BulkJobActionItem"},"type":"array","title":"Items"},"succeeded":{"type":"integer","title":"Succeeded"},"failed":{"type":"integer","title":"Failed"}},"additionalProperties":false,"type":"object","required":["items","succeeded","failed"],"title":"BulkJobActionResponse"},"ClearCookiesAction":{"properties":{"required":{"type":"boolean","title":"Required","default":true},"retries":{"type":"integer","maximum":5.0,"minimum":0.0,"title":"Retries","default":0},"retry_delay_msec":{"type":"integer","maximum":30000.0,"minimum":0.0,"title":"Retry Delay Msec","default":500},"phase":{"anyOf":[{"type":"string","enum":["pre_navigation","post_navigation"]},{"type":"null"}],"title":"Phase"},"type":{"type":"string","const":"clear_cookies","title":"Type"}},"additionalProperties":false,"type":"object","required":["type"],"title":"ClearCookiesAction"},"ClearSiteDataAction":{"properties":{"required":{"type":"boolean","title":"Required","default":true},"retries":{"type":"integer","maximum":5.0,"minimum":0.0,"title":"Retries","default":0},"retry_delay_msec":{"type":"integer","maximum":30000.0,"minimum":0.0,"title":"Retry Delay Msec","default":500},"phase":{"anyOf":[{"type":"string","enum":["pre_navigation","post_navigation"]},{"type":"null"}],"title":"Phase"},"type":{"type":"string","const":"clear_site_data","title":"Type"},"data_types":{"items":{"type":"string","enum":["cache","cache_storage","cookies","file_systems","indexed_db","local_storage","service_workers","web_sql"]},"type":"array","maxItems":8,"minItems":1,"title":"Data Types"}},"additionalProperties":false,"type":"object","required":["type","data_types"],"title":"ClearSiteDataAction"},"ClickAction":{"properties":{"required":{"type":"boolean","title":"Required","default":true},"retries":{"type":"integer","maximum":5.0,"minimum":0.0,"title":"Retries","default":0},"retry_delay_msec":{"type":"integer","maximum":30000.0,"minimum":0.0,"title":"Retry Delay Msec","default":500},"phase":{"anyOf":[{"type":"string","enum":["pre_navigation","post_navigation"]},{"type":"null"}],"title":"Phase"},"type":{"type":"string","const":"click","title":"Type"},"selector":{"type":"string","maxLength":4096,"minLength":1,"title":"Selector"},"timeout_msec":{"type":"integer","maximum":120000.0,"minimum":1.0,"title":"Timeout Msec","default":5000},"visible":{"type":"boolean","title":"Visible","default":true},"wait_after_msec":{"type":"integer","maximum":120000.0,"minimum":0.0,"title":"Wait After Msec","default":0}},"additionalProperties":false,"type":"object","required":["type","selector"],"title":"ClickAction"},"ConsumerStateRequest":{"properties":{"state":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"State"},"stage":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Stage"},"labels":{"items":{"type":"string"},"type":"array","maxItems":32,"title":"Labels"},"references":{"additionalProperties":{"type":"string"},"type":"object","title":"References"},"context":{"additionalProperties":{"$ref":"#/components/schemas/JsonValue"},"type":"object","title":"Context"},"error_message":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"Error Message"},"error_details":{"anyOf":[{"type":"string","maxLength":100000},{"type":"null"}],"title":"Error Details"}},"additionalProperties":false,"type":"object","title":"ConsumerStateRequest","description":"Consumer-owned processing state; Fetcher stores but does not interpret it."},"ConsumerStateResponse":{"properties":{"state":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"State"},"stage":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Stage"},"labels":{"items":{"type":"string"},"type":"array","maxItems":32,"title":"Labels"},"references":{"additionalProperties":{"type":"string"},"type":"object","title":"References"},"context":{"additionalProperties":{"$ref":"#/components/schemas/JsonValue"},"type":"object","title":"Context"},"error_message":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"Error Message"},"error_details":{"anyOf":[{"type":"string","maxLength":100000},{"type":"null"}],"title":"Error Details"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"}},"additionalProperties":false,"type":"object","title":"ConsumerStateResponse"},"Cookie":{"properties":{"name":{"type":"string","maxLength":256,"minLength":1,"title":"Name"},"value":{"type":"string","maxLength":100000,"title":"Value"},"domain":{"anyOf":[{"type":"string","maxLength":253},{"type":"null"}],"title":"Domain"},"path":{"type":"string","maxLength":2048,"title":"Path","default":"/"},"secure":{"type":"boolean","title":"Secure","default":false},"http_only":{"type":"boolean","title":"Http Only","default":false},"same_site":{"anyOf":[{"type":"string","enum":["lax","strict","none"]},{"type":"null"}],"title":"Same Site"},"expiration_date":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Expiration Date"}},"additionalProperties":false,"type":"object","required":["name","value"],"title":"Cookie"},"CostResponse":{"properties":{"execution_msec":{"type":"integer","title":"Execution Msec"},"request_bytes":{"type":"integer","title":"Request Bytes"},"response_bytes":{"type":"integer","title":"Response Bytes"},"billable_units":{"type":"string","title":"Billable Units"},"estimated_amount":{"type":"string","title":"Estimated Amount"},"currency":{"type":"string","title":"Currency"},"pricing_version":{"type":"string","title":"Pricing Version"}},"additionalProperties":false,"type":"object","required":["execution_msec","request_bytes","response_bytes","billable_units","estimated_amount","currency","pricing_version"],"title":"CostResponse","description":"Aggregated execution usage and estimated charge across attempts."},"CreateJobRequest":{"properties":{"url":{"type":"string","minLength":1,"format":"uri","title":"Url","description":"Public HTTP(S) target URL; credentials and private-network targets are denied","examples":["https://example.org/products/123"]},"request":{"$ref":"#/components/schemas/RequestOptions","description":"Outbound HTTP request configuration"},"instructions":{"$ref":"#/components/schemas/Instructions","description":"Ordered generic execution instructions"},"provider":{"$ref":"#/components/schemas/ProviderPreference","description":"Allowed and preferred execution providers"},"result":{"$ref":"#/components/schemas/ResultPreference","description":"Requested stored result representation"},"limits":{"$ref":"#/components/schemas/JobLimits","description":"Execution safety limits"},"routing":{"$ref":"#/components/schemas/RoutingOptions","description":"Optional routing and concurrency hints"},"metadata":{"additionalProperties":{"$ref":"#/components/schemas/JsonValue"},"type":"object","title":"Metadata","description":"Bounded consumer correlation metadata, opaque to execution providers"},"consumer_state":{"anyOf":[{"$ref":"#/components/schemas/ConsumerStateRequest"},{"type":"null"}],"description":"Optional initial consumer-owned workflow projection, stored atomically with the Job"},"priority":{"type":"integer","maximum":100.0,"minimum":-100.0,"title":"Priority","description":"Relative queue priority within fairness constraints","default":0}},"additionalProperties":false,"type":"object","required":["url"],"title":"CreateJobRequest","description":"Complete immutable execution request captured on the Job."},"CreateJobResponse":{"properties":{"id":{"type":"string","title":"Id"},"status":{"$ref":"#/components/schemas/JobStatus"},"provider_mode":{"$ref":"#/components/schemas/Provider"},"attempt_count":{"type":"integer","title":"Attempt Count"},"created_at":{"type":"string","title":"Created At"},"refetched_from_job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Refetched From Job Id"},"links":{"additionalProperties":{"type":"string"},"type":"object","title":"Links"}},"additionalProperties":false,"type":"object","required":["id","status","provider_mode","attempt_count","created_at","links"],"title":"CreateJobResponse","description":"Identity and discovery links returned when a job is accepted or replayed."},"CustomJsAction":{"properties":{"required":{"type":"boolean","title":"Required","default":true},"retries":{"type":"integer","maximum":5.0,"minimum":0.0,"title":"Retries","default":0},"retry_delay_msec":{"type":"integer","maximum":30000.0,"minimum":0.0,"title":"Retry Delay Msec","default":500},"phase":{"anyOf":[{"type":"string","enum":["pre_navigation","post_navigation"]},{"type":"null"}],"title":"Phase"},"type":{"type":"string","const":"custom_js","title":"Type"},"code":{"type":"string","maxLength":200000,"minLength":1,"title":"Code"},"timeout_msec":{"type":"integer","maximum":120000.0,"minimum":1.0,"title":"Timeout Msec","default":30000},"output_name":{"anyOf":[{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_.-]{0,63}$"},{"type":"null"}],"title":"Output Name"}},"additionalProperties":false,"type":"object","required":["type","code"],"title":"CustomJsAction"},"FeedbackOutcome":{"type":"string","enum":["valid","validation_failed","invalid_content","unexpected_page","incomplete_result","blocked","insufficient_evidence","domain_error"],"title":"FeedbackOutcome"},"FeedbackRequest":{"properties":{"outcome":{"$ref":"#/components/schemas/FeedbackOutcome"},"reason_code":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Reason Code"},"message":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Message"},"details":{"additionalProperties":{"$ref":"#/components/schemas/JsonValue"},"type":"object","title":"Details"}},"additionalProperties":false,"type":"object","required":["outcome"],"title":"FeedbackRequest","description":"Consumer verdict about whether a successful fetch was useful downstream."},"FeedbackResponse":{"properties":{"job_id":{"type":"string","title":"Job Id"},"outcome":{"$ref":"#/components/schemas/FeedbackOutcome"},"created_at":{"type":"string","title":"Created At"}},"additionalProperties":false,"type":"object","required":["job_id","outcome","created_at"],"title":"FeedbackResponse","description":"Accepted effective downstream verdict."},"FillAction":{"properties":{"required":{"type":"boolean","title":"Required","default":true},"retries":{"type":"integer","maximum":5.0,"minimum":0.0,"title":"Retries","default":0},"retry_delay_msec":{"type":"integer","maximum":30000.0,"minimum":0.0,"title":"Retry Delay Msec","default":500},"phase":{"anyOf":[{"type":"string","enum":["pre_navigation","post_navigation"]},{"type":"null"}],"title":"Phase"},"type":{"type":"string","const":"fill","title":"Type"},"selector":{"type":"string","maxLength":4096,"minLength":1,"title":"Selector"},"value":{"type":"string","maxLength":100000,"title":"Value"},"clear":{"type":"boolean","title":"Clear","default":true},"timeout_msec":{"type":"integer","maximum":120000.0,"minimum":1.0,"title":"Timeout Msec","default":5000},"visible":{"type":"boolean","title":"Visible","default":true},"wait_after_msec":{"type":"integer","maximum":120000.0,"minimum":0.0,"title":"Wait After Msec","default":0}},"additionalProperties":false,"type":"object","required":["type","selector","value"],"title":"FillAction"},"Instructions":{"properties":{"version":{"type":"string","const":"1","title":"Version","default":"1"},"navigation":{"$ref":"#/components/schemas/Navigation"},"parse_delay_msec":{"type":"integer","maximum":180000.0,"minimum":0.0,"title":"Parse Delay Msec","default":0},"actions":{"items":{"oneOf":[{"$ref":"#/components/schemas/WaitAction"},{"$ref":"#/components/schemas/WaitForSelectorAction"},{"$ref":"#/components/schemas/ClickAction"},{"$ref":"#/components/schemas/FillAction"},{"$ref":"#/components/schemas/SelectAction"},{"$ref":"#/components/schemas/ScrollAction"},{"$ref":"#/components/schemas/ClearCookiesAction"},{"$ref":"#/components/schemas/SetCookiesAction"},{"$ref":"#/components/schemas/ClearSiteDataAction"},{"$ref":"#/components/schemas/CustomJsAction"}],"discriminator":{"propertyName":"type","mapping":{"clear_cookies":"#/components/schemas/ClearCookiesAction","clear_site_data":"#/components/schemas/ClearSiteDataAction","click":"#/components/schemas/ClickAction","custom_js":"#/components/schemas/CustomJsAction","fill":"#/components/schemas/FillAction","scroll":"#/components/schemas/ScrollAction","select":"#/components/schemas/SelectAction","set_cookies":"#/components/schemas/SetCookiesAction","wait":"#/components/schemas/WaitAction","wait_for_selector":"#/components/schemas/WaitForSelectorAction"}}},"type":"array","maxItems":100,"title":"Actions"}},"additionalProperties":false,"type":"object","title":"Instructions","description":"Versioned, provider-neutral browser execution program."},"JobDetailResponse":{"properties":{"id":{"type":"string","title":"Id"},"url":{"type":"string","title":"Url"},"status":{"$ref":"#/components/schemas/JobStatus"},"priority":{"type":"integer","title":"Priority"},"provider_mode":{"$ref":"#/components/schemas/Provider"},"selected_provider":{"anyOf":[{"$ref":"#/components/schemas/Provider"},{"type":"null"}]},"attempt_count":{"type":"integer","title":"Attempt Count"},"current_attempt":{"anyOf":[{"$ref":"#/components/schemas/AttemptResponse"},{"type":"null"}]},"last_attempt":{"anyOf":[{"$ref":"#/components/schemas/AttemptResponse"},{"type":"null"}]},"failure":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Failure"},"cost":{"$ref":"#/components/schemas/CostResponse"},"created_at":{"type":"string","title":"Created At"},"updated_at":{"type":"string","title":"Updated At"},"expires_at":{"type":"string","title":"Expires At"},"started_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Started At"},"completed_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Completed At"},"result_available":{"type":"boolean","title":"Result Available"},"feedback":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Feedback"},"consumer_state":{"$ref":"#/components/schemas/ConsumerStateResponse"},"refetched_from_job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Refetched From Job Id"},"request":{"$ref":"#/components/schemas/CreateJobRequest"},"attempts":{"items":{"$ref":"#/components/schemas/AttemptResponse"},"type":"array","title":"Attempts"}},"additionalProperties":false,"type":"object","required":["id","url","status","priority","provider_mode","selected_provider","attempt_count","current_attempt","last_attempt","failure","cost","created_at","updated_at","expires_at","started_at","completed_at","result_available","feedback","consumer_state","request","attempts"],"title":"JobDetailResponse","description":"Full job view including immutable request and complete attempt history."},"JobLimits":{"properties":{"execution_timeout_msec":{"type":"integer","maximum":900000.0,"minimum":1000.0,"title":"Execution Timeout Msec","default":180000},"max_attempts":{"type":"integer","maximum":5.0,"minimum":1.0,"title":"Max Attempts","default":3},"max_result_bytes":{"type":"integer","maximum":104857600.0,"minimum":1.0,"title":"Max Result Bytes","default":52428800}},"additionalProperties":false,"type":"object","title":"JobLimits","description":"Per-job upper bounds; consumer/server policy may reduce them."},"JobListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/JobResponse"},"type":"array","title":"Items"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor"}},"additionalProperties":false,"type":"object","required":["items","next_cursor"],"title":"JobListResponse"},"JobResponse":{"properties":{"id":{"type":"string","title":"Id"},"url":{"type":"string","title":"Url"},"status":{"$ref":"#/components/schemas/JobStatus"},"priority":{"type":"integer","title":"Priority"},"provider_mode":{"$ref":"#/components/schemas/Provider"},"selected_provider":{"anyOf":[{"$ref":"#/components/schemas/Provider"},{"type":"null"}]},"attempt_count":{"type":"integer","title":"Attempt Count"},"current_attempt":{"anyOf":[{"$ref":"#/components/schemas/AttemptResponse"},{"type":"null"}]},"last_attempt":{"anyOf":[{"$ref":"#/components/schemas/AttemptResponse"},{"type":"null"}]},"failure":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Failure"},"cost":{"$ref":"#/components/schemas/CostResponse"},"created_at":{"type":"string","title":"Created At"},"updated_at":{"type":"string","title":"Updated At"},"expires_at":{"type":"string","title":"Expires At"},"started_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Started At"},"completed_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Completed At"},"result_available":{"type":"boolean","title":"Result Available"},"feedback":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Feedback"},"consumer_state":{"$ref":"#/components/schemas/ConsumerStateResponse"},"refetched_from_job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Refetched From Job Id"}},"additionalProperties":false,"type":"object","required":["id","url","status","priority","provider_mode","selected_provider","attempt_count","current_attempt","last_attempt","failure","cost","created_at","updated_at","expires_at","started_at","completed_at","result_available","feedback","consumer_state"],"title":"JobResponse","description":"Consumer-visible state of one fetch job."},"JobSearchFacets":{"properties":{"execution_status":{"additionalProperties":{"type":"integer"},"type":"object","title":"Execution Status"},"consumer_state":{"additionalProperties":{"type":"integer"},"type":"object","title":"Consumer State"},"stage":{"additionalProperties":{"type":"integer"},"type":"object","title":"Stage"},"references":{"additionalProperties":{"additionalProperties":{"type":"integer"},"type":"object"},"type":"object","title":"References"}},"additionalProperties":false,"type":"object","required":["execution_status","consumer_state","stage"],"title":"JobSearchFacets"},"JobSearchRequest":{"properties":{"statuses":{"items":{"$ref":"#/components/schemas/JobStatus"},"type":"array","maxItems":5,"title":"Statuses"},"consumer_states":{"items":{"type":"string"},"type":"array","maxItems":20,"title":"Consumer States"},"stages":{"items":{"type":"string"},"type":"array","maxItems":20,"title":"Stages"},"labels":{"items":{"type":"string"},"type":"array","maxItems":20,"title":"Labels"},"references":{"additionalProperties":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"}]},"type":"object","title":"References","description":"Exact consumer-reference filters. A list matches any supplied value and enables bounded batch reads."},"facet_references":{"items":{"type":"string"},"type":"array","maxItems":5,"title":"Facet References","description":"Reference keys to aggregate in the response facets"},"worker_ids":{"items":{"type":"string"},"type":"array","maxItems":20,"title":"Worker Ids"},"created_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created From"},"created_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created To"},"updated_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated From"},"updated_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated To"},"page":{"type":"integer","maximum":100000.0,"minimum":1.0,"title":"Page","default":1},"page_size":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Page Size","default":50},"sort":{"$ref":"#/components/schemas/JobSort","default":"created_desc"},"include_facets":{"type":"boolean","title":"Include Facets","description":"When true, Fetcher also returns execution-status, consumer-state, stage, and reference facets. Facets require extra aggregation work; keep this false for polling, cleanup, and list/count calls.","default":false}},"additionalProperties":false,"type":"object","title":"JobSearchRequest","description":"Bounded dashboard/reporting query scoped to the authenticated consumer."},"JobSearchResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/JobResponse"},"type":"array","title":"Items"},"page":{"type":"integer","title":"Page"},"page_size":{"type":"integer","title":"Page Size"},"total":{"type":"integer","title":"Total"},"facets":{"$ref":"#/components/schemas/JobSearchFacets"}},"additionalProperties":false,"type":"object","required":["items","page","page_size","total","facets"],"title":"JobSearchResponse"},"JobSort":{"type":"string","enum":["created_desc","created_asc","updated_desc","updated_asc","priority_desc","priority_asc"],"title":"JobSort"},"JobStatus":{"type":"string","enum":["queued","running","succeeded","failed","cancelled"],"title":"JobStatus"},"JsonValue":{},"Navigation":{"properties":{"wait_until":{"type":"string","enum":["load","dom_content_loaded","complete","network_idle"],"title":"Wait Until","default":"complete"},"timeout_msec":{"type":"integer","maximum":180000.0,"minimum":1.0,"title":"Timeout Msec","default":45000},"foreground":{"type":"boolean","title":"Foreground","description":"Allow a browser provider to activate its managed tab while the job runs. Use only for pages that suspend work in background tabs.","default":false}},"additionalProperties":false,"type":"object","title":"Navigation"},"ProblemDetail":{"properties":{"type":{"type":"string","title":"Type"},"title":{"type":"string","title":"Title"},"status":{"type":"integer","title":"Status"},"code":{"type":"string","title":"Code"},"detail":{"type":"string","title":"Detail"},"request_id":{"type":"string","title":"Request Id"},"errors":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Errors"}},"additionalProperties":true,"type":"object","required":["type","title","status","code","detail","request_id"],"title":"ProblemDetail","description":"Stable RFC 9457-style error envelope returned by the API."},"ProcessingOutcomeRequest":{"properties":{"consumer_state":{"$ref":"#/components/schemas/ConsumerStateRequest"},"feedback":{"$ref":"#/components/schemas/FeedbackRequest"}},"additionalProperties":false,"type":"object","required":["consumer_state","feedback"],"title":"ProcessingOutcomeRequest","description":"Atomically store final consumer workflow state and result-quality feedback."},"ProcessingOutcomeResponse":{"properties":{"job_id":{"type":"string","title":"Job Id"},"state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"},"outcome":{"$ref":"#/components/schemas/FeedbackOutcome"},"updated_at":{"type":"string","title":"Updated At"}},"additionalProperties":false,"type":"object","required":["job_id","state","outcome","updated_at"],"title":"ProcessingOutcomeResponse"},"Provider":{"type":"string","enum":["auto","http","extension"],"title":"Provider"},"ProviderPreference":{"properties":{"mode":{"$ref":"#/components/schemas/Provider","default":"auto"},"allow":{"items":{"$ref":"#/components/schemas/Provider"},"type":"array","maxItems":2,"minItems":1,"title":"Allow"},"fallback":{"type":"boolean","title":"Fallback","default":true}},"additionalProperties":false,"type":"object","title":"ProviderPreference","description":"Provider selection constraints used by the execution router."},"RequestOptions":{"properties":{"method":{"type":"string","enum":["GET","HEAD","POST","PUT","PATCH","DELETE"],"title":"Method","default":"GET"},"headers":{"additionalProperties":{"type":"string"},"type":"object","title":"Headers"},"body":{"anyOf":[{"type":"string","maxLength":1000000},{"type":"null"}],"title":"Body"}},"additionalProperties":false,"type":"object","title":"RequestOptions","description":"Outbound request options; the initial deployment permits GET and HEAD only."},"ResultPreference":{"properties":{"body_kind":{"type":"string","enum":["html","text","json","binary"],"title":"Body Kind","default":"html"},"include_response_headers":{"type":"boolean","title":"Include Response Headers","default":false}},"additionalProperties":false,"type":"object","title":"ResultPreference","description":"Shape of the response body and metadata the consumer needs."},"ResultResponse":{"properties":{"id":{"type":"string","title":"Id"},"job_id":{"type":"string","title":"Job Id"},"attempt_id":{"type":"string","title":"Attempt Id"},"body_kind":{"type":"string","title":"Body Kind"},"media_type":{"type":"string","title":"Media Type"},"content_encoding":{"type":"string","title":"Content Encoding"},"content_sha256":{"type":"string","title":"Content Sha256"},"stored_size_bytes":{"type":"integer","title":"Stored Size Bytes"},"uncompressed_size_bytes":{"type":"integer","title":"Uncompressed Size Bytes"},"final_url":{"type":"string","title":"Final Url"},"http_status":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Http Status"},"redirects":{"items":{"type":"string"},"type":"array","title":"Redirects"},"outputs":{"additionalProperties":true,"type":"object","title":"Outputs"},"created_at":{"type":"string","title":"Created At"},"expires_at":{"type":"string","title":"Expires At"},"content_url":{"type":"string","title":"Content Url"}},"additionalProperties":false,"type":"object","required":["id","job_id","attempt_id","body_kind","media_type","content_encoding","content_sha256","stored_size_bytes","uncompressed_size_bytes","final_url","http_status","redirects","outputs","created_at","expires_at","content_url"],"title":"ResultResponse","description":"Stored result metadata; download bytes through content_url."},"RoutingOptions":{"properties":{"hint":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Hint"},"concurrency_key":{"anyOf":[{"type":"string","maxLength":256},{"type":"null"}],"title":"Concurrency Key"},"allowed_worker_ids":{"items":{"type":"string"},"type":"array","maxItems":20,"title":"Allowed Worker Ids","description":"Optional extension-worker allow-list. An empty list permits any compatible worker."}},"additionalProperties":false,"type":"object","title":"RoutingOptions","description":"Generic hints that must not contain consumer-specific business logic."},"ScrollAction":{"properties":{"required":{"type":"boolean","title":"Required","default":true},"retries":{"type":"integer","maximum":5.0,"minimum":0.0,"title":"Retries","default":0},"retry_delay_msec":{"type":"integer","maximum":30000.0,"minimum":0.0,"title":"Retry Delay Msec","default":500},"phase":{"anyOf":[{"type":"string","enum":["pre_navigation","post_navigation"]},{"type":"null"}],"title":"Phase"},"type":{"type":"string","const":"scroll","title":"Type"},"mode":{"type":"string","enum":["bottom","screens"],"title":"Mode","default":"bottom"},"screens":{"anyOf":[{"type":"integer","maximum":100.0,"minimum":1.0},{"type":"null"}],"title":"Screens"},"step_px":{"type":"integer","maximum":10000.0,"minimum":1.0,"title":"Step Px","default":800},"wait_msec":{"type":"integer","maximum":30000.0,"minimum":0.0,"title":"Wait Msec","default":300},"max_steps":{"type":"integer","maximum":200.0,"minimum":1.0,"title":"Max Steps","default":50}},"additionalProperties":false,"type":"object","required":["type"],"title":"ScrollAction"},"SelectAction":{"properties":{"required":{"type":"boolean","title":"Required","default":true},"retries":{"type":"integer","maximum":5.0,"minimum":0.0,"title":"Retries","default":0},"retry_delay_msec":{"type":"integer","maximum":30000.0,"minimum":0.0,"title":"Retry Delay Msec","default":500},"phase":{"anyOf":[{"type":"string","enum":["pre_navigation","post_navigation"]},{"type":"null"}],"title":"Phase"},"type":{"type":"string","const":"select","title":"Type"},"selector":{"type":"string","maxLength":4096,"minLength":1,"title":"Selector"},"value":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}],"title":"Value"},"label":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}],"title":"Label"},"timeout_msec":{"type":"integer","maximum":120000.0,"minimum":1.0,"title":"Timeout Msec","default":5000},"wait_after_msec":{"type":"integer","maximum":120000.0,"minimum":0.0,"title":"Wait After Msec","default":0}},"additionalProperties":false,"type":"object","required":["type","selector"],"title":"SelectAction"},"SetCookiesAction":{"properties":{"required":{"type":"boolean","title":"Required","default":true},"retries":{"type":"integer","maximum":5.0,"minimum":0.0,"title":"Retries","default":0},"retry_delay_msec":{"type":"integer","maximum":30000.0,"minimum":0.0,"title":"Retry Delay Msec","default":500},"phase":{"anyOf":[{"type":"string","enum":["pre_navigation","post_navigation"]},{"type":"null"}],"title":"Phase"},"type":{"type":"string","const":"set_cookies","title":"Type"},"cookies":{"items":{"$ref":"#/components/schemas/Cookie"},"type":"array","maxItems":100,"minItems":1,"title":"Cookies"}},"additionalProperties":false,"type":"object","required":["type","cookies"],"title":"SetCookiesAction"},"WaitAction":{"properties":{"required":{"type":"boolean","title":"Required","default":true},"retries":{"type":"integer","maximum":5.0,"minimum":0.0,"title":"Retries","default":0},"retry_delay_msec":{"type":"integer","maximum":30000.0,"minimum":0.0,"title":"Retry Delay Msec","default":500},"phase":{"anyOf":[{"type":"string","enum":["pre_navigation","post_navigation"]},{"type":"null"}],"title":"Phase"},"type":{"type":"string","const":"wait","title":"Type"},"wait_msec":{"type":"integer","maximum":120000.0,"minimum":0.0,"title":"Wait Msec"}},"additionalProperties":false,"type":"object","required":["type","wait_msec"],"title":"WaitAction"},"WaitForSelectorAction":{"properties":{"required":{"type":"boolean","title":"Required","default":true},"retries":{"type":"integer","maximum":5.0,"minimum":0.0,"title":"Retries","default":0},"retry_delay_msec":{"type":"integer","maximum":30000.0,"minimum":0.0,"title":"Retry Delay Msec","default":500},"phase":{"anyOf":[{"type":"string","enum":["pre_navigation","post_navigation"]},{"type":"null"}],"title":"Phase"},"type":{"type":"string","const":"wait_for_selector","title":"Type"},"selector":{"type":"string","maxLength":4096,"minLength":1,"title":"Selector"},"timeout_msec":{"type":"integer","maximum":120000.0,"minimum":1.0,"title":"Timeout Msec","default":10000},"visible":{"type":"boolean","title":"Visible","default":true}},"additionalProperties":false,"type":"object","required":["type","selector"],"title":"WaitForSelectorAction"}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"}}},"tags":[{"name":"Jobs","description":"Public, tenant-isolated job submission, inspection, results, and commands."},{"name":"Health","description":"Unauthenticated Kubernetes/Compose liveness and readiness probes."}]}