Thanx · AsyncAPI Specification

Thanx Webhooks

Version

View Spec View on GitHub RestaurantLoyaltyGuest EngagementMarketingCRMOnline OrderingWebhookPointsRewardsCampaignsAsyncAPIWebhooksEvents

AsyncAPI Specification

Raw ↑
generated: '2026-08-13'
method: searched
source: >-
  https://docs.thanx.com/webhooks/overview and the five event pages beneath it —
  /webhooks/purchases, /webhooks/reward-issued, /webhooks/reward-batch-completed,
  /webhooks/communication-settings, /webhooks/sms-subscriptions.
description: >-
  Thanx's event surface, captured as a webhook catalog. Thanx publishes NO AsyncAPI document —
  probing found no /asyncapi.yaml, no event schema files and no spec in the GitHub org — so
  this artifact records the documented catalog rather than fabricating a specification. The
  delivery contract is the important part and it is unusually candid: at-least-once at best,
  with NO retries on failure, meaning both duplicates and permanent loss are expected and the
  integrator is told to backfill from the bulk data exports.
asyncapi_published: false
asyncapi_probe:
  - {url: 'https://docs.thanx.com/asyncapi.yaml', result: not-served}
  - {url: 'https://api.thanx.com/asyncapi.json', result: not-served}
  - {source: 'https://github.com/thanx (72 repos)', result: 'no event schema or AsyncAPI repository'}
enablement:
  self_serve: false
  process: >-
    Webhooks are enabled per integration partner by the Thanx team — email
    developer.support@thanx.com. There is no webhook management API and no dashboard-registered
    endpoint documented.
transport:
  protocol: HTTPS
  method: POST
  endpoint_requirement: Webhook endpoints must be valid HTTPS URLs.
  timeout: Receivers must respond within 15 seconds.
  content_type: application/json
delivery:
  guarantee: at-least-once, best-effort
  exactly_once: false
  retries: false
  retry_note: >-
    "By default, webhooks are not configured to retry if the receiving server responds with an
    error. Any missed data can be collected via bulk data transfer mechanisms."
  ordering: >-
    No delivery sequence number and no delivery timestamp in the payload. Treat the LAST
    delivery received for an id as current state; for purchases, authorization and settlement
    fires are typically days apart so arrival order tracks lifecycle order.
  duplicates: >-
    Expected and common, most pronounced on purchase events — a single purchase is re-sent as
    it moves through authorization and settlement and across payment rails, every delivery
    carrying the same purchase id.
  consumer_requirement: >-
    Be idempotent. Deduplicate on the payload's stable identifier (id for purchases) and treat
    repeat deliveries as updates rather than new events. Where a field can be refined over the
    resource's lifecycle (such as purchase amount or products), prefer the latest delivery.
security:
  signature_header: X-Thanx-Signature
  algorithm: HMAC-SHA256, hex-encoded, over the raw request payload
  secret: issued by the Thanx team per integration
  verification_examples: [ruby, python]
  docs: https://docs.thanx.com/webhooks/overview#verification
  query_parameters:
    supported: true
    behavior: >-
      Static query parameters may be appended to the registered URL and are sent with every
      delivery. They are not modified or validated by Thanx.
    warning: >-
      Thanx explicitly warns that sensitive values must not be placed in query parameters. A
      query-parameter apiKey is fixed at registration — rotating it requires re-registering the
      webhook URL with Thanx, and a stale credential will make the endpoint reject deliveries.
events:
  - name: purchase
    event_field: 'purchase.event (create)'
    docs: https://docs.thanx.com/webhooks/purchases
    trigger: Any qualifying user purchase detected by Thanx.
    payload_root: purchase
    fields: 'id, amount, purchased_at, event, user{id,email,first_name,last_name}, merchant{id,name}, location, order, products'
    idempotency_key: id
    note: >-
      The highest-duplicate event. amount and products may be refined between deliveries for
      the same id.
    related_entity: Purchase (data-model/thanx-data-model.yml)
  - name: reward.issued
    event_field: reward.issued
    docs: https://docs.thanx.com/webhooks/reward-issued
    trigger: >-
      Each individual reward successfully issued during a partner issuance job. A batch of 100
      identifiers may produce up to 100 of these.
    payload_root: 'event, timestamp, data'
    fields: 'event, timestamp, data{issuance_job_id, merchant_id, reward_id, identifier{type,index}, user_id, state, expires_at, campaign}'
    related_entity: Reward / IssuanceJob
  - name: reward_batch.completed
    event_field: reward_batch.completed
    docs: https://docs.thanx.com/webhooks/reward-batch-completed
    trigger: >-
      Once, when an entire issuance job finishes processing — fires whether or not every reward
      succeeded.
    payload_root: 'event, timestamp, data'
    fields: 'event, timestamp, data{issuance_job_id, merchant_id, state, total_count, issued_count, failed_count, failures[]{user_identifier, ...}}'
    states: [completed, failed]
    related_entity: IssuanceJob
    note: The completion signal that replaces polling getIssuanceJob.
  - name: communication_settings
    docs: https://docs.thanx.com/webhooks/communication-settings
    trigger: Any update to a user's communication settings.
    fields: [id, merchant_id, user_id, reward_progress, ...]
    related_entity: Communication Preferences (data export model)
  - name: sms_subscription
    docs: https://docs.thanx.com/webhooks/sms-subscriptions
    trigger: A user opts into SMS marketing.
    fields: [user_id, merchant_id, phone]
    phone_format: E.164 (e.g. +14157582345)
    note: >-
      Thanx does not synchronize downstream SMS opt-in status and prompts a user for a phone
      number only once; SMS marketing partners own confirmation of consent.
alternatives:
  bulk_export: >-
    SFTP daily CSV snapshots, Snowflake Secure Data Sharing, and Thanx Connex managed loading
    are the documented backfill path for anything a webhook failed to deliver.
  docs: https://docs.thanx.com/data/overview
summary:
  event_count: 5
  signed: true
  retries: false
  asyncapi: false
  management_api: false