{"openapi":"3.1.0","info":{"title":"ClearStaq Public API","version":"1.0.0","summary":"Submit document PDFs and receive structured analysis results.","description":"The ClearStaq public API lets external systems submit document PDFs for\nparsing + fraud analysis. Results are delivered asynchronously by\nsigned webhook to a caller-provided `callback_url`. A polling endpoint\n(`GET /v1/analyses/{id}`) is available for integrations that cannot\nreceive inbound webhooks.\n\nAuthentication uses bearer tokens created at\nhttps://app.clearstaq.com/app/settings/integrations.\n\n## API key scopes\n\nKeys carry scoped permissions so integrations can request only the\naccess they need:\n\n- `analyses:write` — submit documents for analysis (`POST /api/v1/analyses`,\n  `POST /api/v1/clients`) and manage webhook subscriptions.\n- `analyses:read` — read analysis results and client profiles\n  (`GET /api/v1/analyses/{id}`, `GET /api/v1/clients/{id}`).\n\nRequests made with a key missing the required scope receive\n`403 scope_required` with `required_scope` and `granted_scopes` fields.\n\n## Rate limits\n\nRequests are limited to 120 per minute per bearer token. Every\n`/api/v1` response carries the standard `RateLimit-Limit`,\n`RateLimit-Remaining`, `RateLimit-Reset`, and `RateLimit-Policy`\nheaders; exceeding the window returns `429 rate_limited` with a\n`Retry-After` header. Agents should self-throttle on\n`RateLimit-Remaining` rather than retrying into a 429. StaqScale plans\ncan lift the limit — contact hello@clearstaq.com.\n\n## Versioning & deprecation policy\n\nThe API is versioned in the URL path (`/api/v1`). Backwards-compatible\nadditions (new optional fields, new endpoints, new enum values on\nfields documented as extensible) ship without a version bump. Breaking\nchanges ship only as a new path version (`/api/v2`); the prior version\nthen keeps working for at least 12 months, during which responses on\ndeprecated surfaces carry `Deprecation` and `Sunset` headers and the\nchange is announced by email to every org with an active key.\n","contact":{"name":"ClearStaq Support","email":"hello@clearstaq.com","url":"https://clearstaq.com/contact"}},"externalDocs":{"description":"Human-readable API documentation","url":"https://clearstaq.com/documentation/api"},"servers":[{"url":"https://app.clearstaq.com","description":"Production"}],"tags":[{"name":"Analyses","description":"Submit single documents and poll their parse + fraud results."},{"name":"Clients","description":"Multi-statement client profiles with aggregated revenue, MCA, and fraud rollups."},{"name":"Webhooks","description":"Signed webhook subscriptions for asynchronous result delivery."}],"components":{"responses":{"RateLimited":{"description":"Rate limit exceeded (`rate_limited`). Honor `Retry-After` and the `RateLimit-*` headers.","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left in the current 60s window."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"securitySchemes":{"BearerApiKey":{"type":"http","scheme":"bearer","bearerFormat":"cg_live_*","description":"API key created at https://app.clearstaq.com/app/settings/integrations,\nsent as `Authorization: Bearer cg_live_...`. Keys carry scoped\npermissions (`analyses:write`, `analyses:read`); each operation below\nstates the scope it requires. OAuth 2.0 access tokens (`oat_...`)\nissued via /oauth are accepted on the same endpoints.\n"}},"schemas":{"AnalysisQueued":{"type":"object","required":["id","status","created_at"],"properties":{"id":{"type":"string","description":"Analysis identifier. Use it to poll or correlate with a webhook payload."},"status":{"type":"string","enum":["queued"]},"client_ref":{"type":"string","nullable":true},"callback_id":{"type":"string"},"created_at":{"type":"string","format":"date-time"}}},"ClientProfileQueued":{"type":"object","required":["client_id","batch_id","documents"],"properties":{"client_id":{"type":"string","format":"uuid","description":"ClearStaq client created for this submission. Visible in the caller's webapp and used to poll the profile."},"batch_id":{"type":"string","format":"uuid","description":"Identifier for this multi-document submission. Echoed back in the `batch.completed` webhook payload."},"documents":{"type":"array","items":{"type":"object","required":["filename","status"],"properties":{"id":{"type":"string","format":"uuid","nullable":true,"description":"Document identifier once queued; `null` when the file was rejected before queuing."},"filename":{"type":"string"},"status":{"type":"string","enum":["queued","failed"]},"error":{"type":"string","description":"Failure code. Present only when `status` is `failed`."}}}}}},"ClientProfile":{"type":"object","required":["id","name","status","documents","counts"],"properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string","nullable":true,"description":"Client name. Derived from the dominant account holder once parsed when `client_name` was omitted."},"status":{"type":"string","description":"Aggregate client status."},"profile":{"$ref":"#/components/schemas/ClientProfileRollup"},"documents":{"type":"array","items":{"$ref":"#/components/schemas/ClientDocument"}},"counts":{"type":"object","required":["total","completed","failed"],"properties":{"total":{"type":"integer"},"completed":{"type":"integer"},"failed":{"type":"integer"}}}}},"ClientProfileRollup":{"type":"object","nullable":true,"description":"Aggregated revenue / MCA / fraud rollup over the valid statements. `null` until computed asynchronously after the documents finish parsing.","additionalProperties":true},"ClientDocument":{"type":"object","required":["id","filename","status"],"properties":{"id":{"type":"string","format":"uuid"},"filename":{"type":"string"},"status":{"type":"string"},"bank_name":{"type":"string","nullable":true},"period_start":{"type":"string","format":"date","nullable":true},"period_end":{"type":"string","format":"date","nullable":true},"fraud_score":{"type":"integer","nullable":true},"failure_reason":{"type":"string","nullable":true,"description":"Why a statement was excluded from the profile, e.g.\n`missing_pages`, `not_a_bank_statement:<type>`, or another reason\nstring. `null` when the document parsed successfully.\n"},"pages_present":{"type":"integer","nullable":true},"pages_expected":{"type":"integer","nullable":true},"detected_bank":{"type":"string","nullable":true}}},"WebhookEnvelope":{"oneOf":[{"$ref":"#/components/schemas/AnalysisWebhookEnvelope"},{"$ref":"#/components/schemas/ExtractionWebhookEnvelope"}],"discriminator":{"propertyName":"event","mapping":{"analysis.completed":"#/components/schemas/AnalysisWebhookEnvelope","analysis.failed":"#/components/schemas/AnalysisWebhookEnvelope","tax_return.extracted":"#/components/schemas/ExtractionWebhookEnvelope","application_form.extracted":"#/components/schemas/ExtractionWebhookEnvelope"}}},"AnalysisWebhookEnvelope":{"type":"object","required":["id","event","status","created_at"],"properties":{"id":{"type":"string"},"event":{"type":"string","enum":["analysis.completed","analysis.failed"]},"client_ref":{"type":"string","nullable":true},"status":{"type":"string","enum":["completed","failed"]},"created_at":{"type":"string","format":"date-time"},"completed_at":{"type":"string","format":"date-time","nullable":true},"metadata":{"type":"object","additionalProperties":true},"result":{"$ref":"#/components/schemas/AnalysisResult"},"error":{"$ref":"#/components/schemas/AnalysisError"}}},"ExtractionWebhookEnvelope":{"type":"object","required":["id","event","created_at","data"],"properties":{"id":{"type":"string"},"event":{"type":"string","enum":["tax_return.extracted","application_form.extracted"]},"client_ref":{"type":"string","nullable":true},"created_at":{"type":"string","format":"date-time"},"metadata":{"type":"object","additionalProperties":true},"data":{"type":"array","items":{"type":"object","additionalProperties":true}}}},"AnalysisStatusSnapshot":{"type":"object","required":["id","status"],"properties":{"id":{"type":"string"},"status":{"type":"string","description":"Current non-terminal processing status.","enum":["pending","processing","parsed"]},"client_ref":{"type":"string","nullable":true},"metadata":{"type":"object","additionalProperties":true}}},"AnalysisPollResponse":{"oneOf":[{"$ref":"#/components/schemas/WebhookEnvelope"},{"$ref":"#/components/schemas/AnalysisStatusSnapshot"}]},"WebhookSubscription":{"type":"object","required":["id","event_type","included_phases","target_url","created_at"],"properties":{"id":{"type":"string","format":"uuid"},"event_type":{"type":"string","enum":["analysis.completed","analysis.failed","batch.completed","tax_return.extracted","application_form.extracted"]},"included_phases":{"type":"array","items":{"type":"string","enum":["parse","metadata_fraud","ai_fraud"]}},"target_url":{"type":"string","format":"uri"},"created_at":{"type":"string","format":"date-time"}}},"WebhookSubscriptionCreated":{"allOf":[{"$ref":"#/components/schemas/WebhookSubscription"},{"type":"object","required":["secret"],"properties":{"secret":{"type":"string","description":"Signing secret returned only when the subscription is created."}}}]},"AnalysisResult":{"type":"object","nullable":true,"properties":{"bank_name":{"type":"string","nullable":true},"account_holder_name":{"type":"string","nullable":true},"account_number_last4":{"type":"string","nullable":true},"currency":{"type":"string","nullable":true},"period_start":{"type":"string","format":"date","nullable":true},"period_end":{"type":"string","format":"date","nullable":true},"starting_balance":{"type":"number","nullable":true},"ending_balance":{"type":"number","nullable":true},"average_balance":{"type":"number","nullable":true},"total_deposits":{"type":"number","nullable":true},"total_withdrawals":{"type":"number","nullable":true},"true_revenue":{"type":"number","nullable":true},"estimated_monthly_revenue":{"type":"number","nullable":true},"number_of_deposits":{"type":"integer","nullable":true},"number_of_withdrawals":{"type":"integer","nullable":true},"number_of_nsf":{"type":"integer","nullable":true},"number_of_negative_days":{"type":"integer","nullable":true},"fraud_score":{"type":"integer","nullable":true},"fraud_risk_level":{"type":"string","nullable":true},"monthly_summary":{"type":"array","items":{"type":"object"}},"debt_outflows":{"type":"array","items":{"type":"object"}},"transactions":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","format":"date","nullable":true},"description":{"type":"string","nullable":true},"amount":{"type":"number","nullable":true},"type":{"type":"string","nullable":true},"category":{"type":"string","nullable":true},"running_balance":{"type":"number","nullable":true},"flagged":{"type":"boolean","nullable":true}}}}}},"AnalysisError":{"type":"object","nullable":true,"properties":{"code":{"type":"string"},"message":{"type":"string"}}},"BatchCompleted":{"type":"object","required":["event","batch_id","client_id","org_id","counts","created_at"],"properties":{"event":{"type":"string","enum":["batch.completed"]},"batch_id":{"type":"string","format":"uuid"},"client_id":{"type":"string","format":"uuid"},"org_id":{"type":"string","format":"uuid"},"counts":{"type":"object","required":["total","completed","failed"],"properties":{"total":{"type":"integer"},"completed":{"type":"integer"},"failed":{"type":"integer"}}},"profile":{"$ref":"#/components/schemas/ClientProfileRollup"},"created_at":{"type":"string","format":"date-time"}}},"ErrorResponse":{"type":"object","description":"Uniform error envelope returned by every non-2xx response. `code` is a\nstable machine-readable identifier (e.g. `unauthorized`,\n`scope_required`, `insufficient_credits`, `not_found`); `message` is a\nhuman-readable explanation that includes a resolution hint. Some codes\nattach extra context fields alongside `code`/`message` (e.g.\n`scope_required` adds `required_scope` and `granted_scopes`).\n","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"additionalProperties":true,"properties":{"code":{"type":"string","description":"Stable machine-readable error identifier."},"message":{"type":"string","description":"Human-readable explanation with a resolution hint."}}}}}}},"security":[{"BearerApiKey":[]}],"paths":{"/api/v1/analyses":{"post":{"operationId":"submitAnalysis","tags":["Analyses"],"summary":"Submit a document for analysis","description":"Uploads a single PDF (bank statement, tax return, or application form)\nand queues it for parsing + fraud analysis. Results arrive\nasynchronously: by signed webhook when `callback_url` is provided or a\nsubscription exists, or by polling `GET /api/v1/analyses/{id}`.\nRequires the `analyses:write` scope. Billed per document.\n","requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","required":["file","document_kind"],"properties":{"file":{"type":"string","format":"binary","description":"PDF file, up to 25MB."},"document_kind":{"type":"string","enum":["bank_statement","tax_return","application_form"],"description":"Required parser routing. Use `bank_statement` for bank\nstatements, `tax_return` for tax returns, or\n`application_form` for application forms.\n"},"callback_url":{"type":"string","format":"uri","description":"HTTPS URL that will receive the signed webhook payload when the analysis completes."},"client_ref":{"type":"string","description":"Free-form reference stored on the callback and echoed back in the webhook payload."},"metadata":{"type":"string","description":"JSON-encoded object; passed through unchanged to the webhook payload."},"clearstaq_ai_enabled":{"type":"boolean","default":false,"description":"When `true`, the analysis includes the ClearStaqAI visual fraud\nsecond-pass (Google Gemini). Defaults to `false`; when omitted\nor false, the response contains only the deterministic metadata\nfraud score. The visual second-pass adds roughly 10s of\nprocessing per file.\n"}}}}}},"responses":{"202":{"description":"Accepted for processing.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalysisQueued"}}}},"401":{"description":"Invalid or missing API key (`unauthorized`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Plan excluded or insufficient credits","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API key missing the `analyses:write` scope (`scope_required`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"413":{"description":"File too large (>25MB) (`file_too_large`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"415":{"description":"Only application/pdf is accepted (`unsupported_media_type`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"description":"Parser unavailable (`parser_unavailable`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/analyses/{id}":{"get":{"operationId":"getAnalysis","tags":["Analyses"],"summary":"Fetch analysis status or completed result","description":"Polls a submitted analysis. Returns the full webhook-shaped envelope\nonce processing completes, or a lightweight status snapshot while the\ndocument is still `pending`/`processing`/`parsed`. Requires the\n`analyses:read` scope.\n","parameters":[{"in":"path","name":"id","required":true,"description":"Analysis identifier returned by `POST /api/v1/analyses`.","schema":{"type":"string"}}],"responses":{"200":{"description":"Analysis envelope or status snapshot.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalysisPollResponse"}}}},"401":{"description":"Invalid or missing API key (`unauthorized`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API key missing the `analyses:read` scope (`scope_required`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Analysis not found for this API key (`not_found`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/clients":{"post":{"operationId":"createClientProfile","tags":["Clients"],"summary":"Create a client profile from one or more statements","description":"Creates a ClearStaq client in the caller's org (visible in their\nwebapp), parses every uploaded statement, and computes an aggregated\nclient profile over the valid statements. Incomplete or non-bank\nstatements are excluded from the profile and listed with a failure\nreason. Billed per document (same credits as `/api/v1/analyses`),\nscaled by file count. Requires the `analyses:write` scope.\n","requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","required":["document_kind"],"properties":{"file":{"type":"array","items":{"type":"string","format":"binary"},"description":"One or more PDF bank statements (repeatable `file` field).\n1 to 25 files, max 25 MB each, `application/pdf` only.\nMay be combined with `files`.\n"},"files":{"type":"array","items":{"type":"string","format":"binary"},"description":"Alternative repeatable field for PDF bank statements. May be combined with `file`."},"document_kind":{"type":"string","enum":["bank_statement"],"description":"Required parser routing for this client-profile endpoint. Must be `bank_statement`."},"client_name":{"type":"string","maxLength":200,"description":"Optional client name. When omitted, the client is named from the dominant account holder once parsed."},"clearstaq_ai_enabled":{"type":"boolean","default":false,"description":"When `true`, each analysis includes the ClearStaqAI visual\nfraud second-pass (Google Gemini). Defaults to `false`.\n"}}}}}},"responses":{"202":{"description":"Accepted for processing. The client and per-document queue state are returned immediately.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientProfileQueued"}}}},"400":{"description":"No files supplied (`no_files`) or the API key is not tied to a user (`no_user_context`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Invalid or missing API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Plan excluded (`plan_excluded`), no Stripe customer (`no_stripe_customer`), or insufficient credits (`insufficient_credits`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"413":{"description":"More than 25 files (`too_many_files`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"description":"Every file failed to queue (`all_files_failed`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/clients/{id}":{"get":{"operationId":"getClientProfile","tags":["Clients"],"summary":"Fetch a client profile and per-document statuses","description":"Returns the client, its aggregated profile, and per-document parse\nstatus. Poll until\n`counts.completed + counts.failed == counts.total` and `profile` is\nnon-null — the profile is computed asynchronously shortly after the\ndocuments finish parsing. Requires the `analyses:read` scope.\n","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Client profile snapshot.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientProfile"}}}},"400":{"description":"Malformed client id (`invalid_id`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Client not found for this API key (`not_found`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/webhooks":{"post":{"operationId":"createWebhookSubscription","tags":["Webhooks"],"summary":"Subscribe to public API webhook events","description":"Creates a signed webhook subscription. `included_phases` is required\nonly for `analysis.completed`; extraction and batch events carry their\nown complete payloads and do not use phase filtering. The signing\nsecret is returned only in this response.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["event_type","target_url"],"properties":{"event_type":{"type":"string","enum":["analysis.completed","analysis.failed","batch.completed","tax_return.extracted","application_form.extracted"]},"included_phases":{"type":"array","items":{"type":"string","enum":["parse","metadata_fraud","ai_fraud"]}},"target_url":{"type":"string","format":"uri","description":"HTTPS URL that receives signed webhook deliveries."}}}}}},"responses":{"201":{"description":"Subscription created. Store the signing secret; it is not returned by GET.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookSubscriptionCreated"}}}},"400":{"description":"Invalid event type","phase list":null,"or target URL":null,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Invalid or missing API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Extraction event is disabled for this organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"$ref":"#/components/responses/RateLimited"}}},"get":{"operationId":"listWebhookSubscriptions","tags":["Webhooks"],"summary":"List active public API webhook subscriptions","description":"Lists the caller's active webhook subscriptions. Requires the `analyses:read` scope.","responses":{"200":{"description":"Active subscriptions. Signing secrets are never returned.","content":{"application/json":{"schema":{"type":"object","required":["subscriptions"],"properties":{"subscriptions":{"type":"array","items":{"$ref":"#/components/schemas/WebhookSubscription"}}}}}}},"401":{"description":"Invalid or missing API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/webhooks/{id}":{"delete":{"operationId":"deleteWebhookSubscription","tags":["Webhooks"],"summary":"Delete a webhook subscription","description":"Deletes one of the caller's webhook subscriptions. Requires the `analyses:write` scope.","parameters":[{"in":"path","name":"id","required":true,"description":"Subscription id returned by `POST /api/v1/webhooks`.","schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"Subscription deleted."},"401":{"description":"Invalid or missing API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Subscription not found for this API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/webhooks/test":{"post":{"operationId":"sendTestWebhook","tags":["Webhooks"],"summary":"Send a signed test webhook to a URL","description":"Sends a signed sample payload to `callback_url` so receivers can\nverify HMAC signature handling before going live. Requires the\n`analyses:write` scope.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["callback_url"],"properties":{"callback_url":{"type":"string","format":"uri"}}}}}},"responses":{"200":{"description":"Delivered (or receiver responded).","content":{"application/json":{"schema":{"type":"object","properties":{"delivered":{"type":"boolean"},"status":{"type":"integer","nullable":true},"signature":{"type":"string"}}}}}}}}}},"webhooks":{"analysisCompleted":{"post":{"summary":"ClearStaq -> your server on analysis completion","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalysisWebhookEnvelope"}}}},"responses":{"2XX":{"description":"Receipt acknowledged. Any non-2xx response triggers retry with exponential backoff."}}}},"batchCompleted":{"post":{"summary":"ClearStaq -> your server once a multi-document client profile is computed","description":"Fires once per `/api/v1/clients` submission, after the client profile\nis computed. Signing (HMAC `X-ClearStaq-Signature`) and the 5-step\nretry backoff are identical to `analysis.completed`. Subscribe with\n`event_type: \"batch.completed\"` via `POST /api/v1/webhooks`.\n","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchCompleted"}}}},"responses":{"2XX":{"description":"Receipt acknowledged. Any non-2xx response triggers retry with exponential backoff."}}}},"taxReturnExtracted":{"post":{"summary":"ClearStaq -> your server after tax-return extraction","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtractionWebhookEnvelope"}}}},"responses":{"2XX":{"description":"Receipt acknowledged. Any non-2xx response triggers retry with exponential backoff."}}}},"applicationFormExtracted":{"post":{"summary":"ClearStaq -> your server after application-form extraction","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtractionWebhookEnvelope"}}}},"responses":{"2XX":{"description":"Receipt acknowledged. Any non-2xx response triggers retry with exponential backoff."}}}}}}