Thanx · AsyncAPI Specification
Thanx Webhooks
Version
View Spec
View on GitHub
RestaurantLoyaltyGuest EngagementMarketingCRMOnline OrderingWebhookPointsRewardsCampaignsAsyncAPIWebhooksEvents
AsyncAPI Specification
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