Thordata · AsyncAPI Specification

Thordata Web Scraper Webhooks

Version

View Spec View on GitHub Proxy networkWeb ScrapingData ExtractionSERPSearch dataWeb unblockingResidential ProxiesMobile ProxiesISP ProxiesDatacenter ProxiesScraping BrowserData-for-AIRAG data pipelinesWeb DataAsyncAPIEvents

AsyncAPI Specification

Raw ↑
generated: '2026-08-11'
method: searched
source: >-
  https://doc.thordata.com/doc/scraping/web-scraper-api/integrations/webhook-integration,
  https://raw.githubusercontent.com/Thordata/thordata-sdk-spec/main/v1.json (tasks.webhook)
spec_type: none
asyncapi_published: false
note: >-
  Thordata publishes no AsyncAPI document, but it does operate a real, documented outbound webhook
  surface for Web Scraper API task lifecycle events, with a published payload schema, a variable
  vocabulary and a fixed header contract. That is captured here as a webhook catalog. Nothing
  below is inferred - the events, variables and headers are all published.
surface:
  name: Web Scraper API task webhooks
  direction: outbound (Thordata -> subscriber)
  transport: HTTP POST
  content_type: application/json
  configured_via: Thordata dashboard, Web Scraper API integrations
  docs: https://doc.thordata.com/doc/scraping/web-scraper-api/integrations/webhook-integration
  subscriber_url: customer-supplied
events:
  - name: In Progress
    spec_name: Running
    description: The scraping task is executing.
  - name: Task Success
    spec_name: Task Succeeded
    description: The task completed successfully and results are available for download.
    example_event_type: ACTOR.RUN.SUCCEEDED
  - name: Task Failure
    spec_name: Task Failed
    description: The task returned no data or an error occurred.
payload:
  templating: >-
    The payload is a customer-authored JSON template. Variables are interpolated with double curly
    braces, so the subscriber controls the delivered shape. The template must be valid JSON.
  example_template: |
    {
      "userId": "{{userId}}",
      "eventType": "{{eventType}}",
      "createdAt": "{{createdAt}}",
      "eventData": "{{eventData}}",
      "resource": "{{resource}}"
    }
  variables:
    - {name: userId, type: string, description: Thordata user id that triggered the event}
    - {name: userName, type: string, description: Account id}
    - {name: createdAt, type: string, description: Webhook trigger time, ISO format}
    - {name: eventType, type: string, description: Type of triggered event}
    - {name: eventData, type: object, description: Contextual data related to the event}
    - {name: resource, type: object, description: Detailed event resource info, including result links}
    - {name: globals, type: object, description: Current event date, ISO 8601}
  event_data_fields:
    - {name: prodect_id, type: string, description: 'Product id (spelled prodect_id in the published payload)'}
    - {name: apiRunId, type: string, description: API run id}
  resource_fields:
    - {name: taskId, type: string, description: Task id}
    - {name: url, type: string, description: JSON-encoded string of the original scraping parameters}
    - {name: apiKey, type: string, description: Token used for the run}
    - {name: apiUrl, type: string}
    - {name: apiCode, type: integer, description: API response code}
    - {name: apiResponseTime, type: integer, unit: ms}
    - {name: apiErrorMsg, type: string}
    - {name: apiResult, type: string}
    - {name: errorNumber, type: integer, description: Error count}
    - {name: successRate, type: number}
    - {name: runseconds, type: integer, description: Run time in seconds}
    - {name: detail, type: string, description: 'Human-readable summary, e.g. "26 requests in total: 26 successful, 0 failed"'}
    - {name: flow, type: integer, unit: MB, description: Data transfer}
    - {name: fileSize, type: integer}
    - {name: type, type: integer}
    - {name: csvUrl, type: string, description: CSV result download URL}
    - {name: jsonUrl, type: string, description: JSON result download URL}
    - {name: audioUrl, type: string}
    - {name: videoUrl, type: string}
    - {name: subtitleUrl, type: string}
    - {name: createdAt, type: string, description: Task created at}
    - {name: finishedAt, type: string, description: Task finished at}
headers:
  customizable: true
  customizable_note: A headers template accepts the same variable interpolation as the payload; values must be strings.
  reserved:
    - {name: Host, note: hard-coded to the request URL, always overwritten}
    - {name: Content-Type, value: application/json, note: always overwritten}
    - {name: Webhook, note: 'carries the Tasks value; always overwritten'}
    - {name: 'Webhook-Dispatch-Id', note: 'carries the Tasks id; always overwritten - this is the delivery idempotency handle'}
    - {name: 'Request-Origin', note: always overwritten}
security:
  signature: none
  signature_note: >-
    No HMAC signature, no shared secret and no signing header are documented. A subscriber cannot
    cryptographically verify that a delivery came from Thordata. The published example payload
    additionally shows the account's own apiKey being echoed inside the resource object, which
    means the webhook body carries a credential to a customer-controlled endpoint.
  replay_protection: >-
    Webhook-Dispatch-Id carries the task id and is the only handle available for de-duplicating
    redeliveries. No timestamp header, no nonce.
  retry_policy: not documented
  delivery_guarantee: not documented
other_integrations:
  note: >-
    The Web Scraper API also delivers results through non-webhook destinations, configured in the
    same dashboard integrations panel.
  destinations:
    - {name: Amazon S3, docs: 'https://doc.thordata.com/doc/scraping/web-scraper-api/integrations/amazon-s3-integration'}
    - {name: Google Gmail, docs: 'https://doc.thordata.com/doc/scraping/web-scraper-api/integrations/google-gmail-integration'}
    - {name: Snowflake, docs: 'https://doc.thordata.com/doc/scraping/web-scraper-api/integrations/snowflake-integration'}
scheduling:
  mechanism: 5-field cron expressions
  fields:
    - 'minute: 0-59'
    - 'hour: 0-23'
    - 'day: 1-31 or ?'
    - 'month: 1-12'
    - 'weekday: 0-7 (0 and 7 are Sunday) or ?'
  example: '0 8 * * 1-5 - every weekday at 08:00'
  docs: https://doc.thordata.com/doc/scraping/web-scraper-api/scheduler
  note: Scheduled runs emit the same webhook events as manual runs.
gaps:
  - No AsyncAPI document - the event surface is documented in prose and a variable table only.
  - No webhook signature or verification mechanism.
  - No documented retry or delivery guarantee.
  - Webhooks cover only the Web Scraper API; SERP, Universal and Web Unlocker are synchronous with no event surface.

Work with this as data

Every AsyncAPI spec here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for asyncapi

4 MCP tools reach this
  • find_asyncapisBrowse and filter every AsyncAPI spec in the catalog.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This AsyncAPI spec
curl "https://apis.io/api/v1/asyncapis/thordata-web-scraper-webhooks"
All asyncapi
curl "https://apis.io/api/v1/asyncapis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no email required.

A second provider on the same verified email joins the account you already have.