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 dataAsyncAPIWebhooksEvents

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.