Tabby · AsyncAPI Specification
Tabby Webhooks
Version
View Spec
View on GitHub
BNPLBuy Now Pay LaterConsumer FinanceE-CommerceFintechInstallmentsMENAPaymentsSaudi ArabiaUAEAsyncAPIEvents
AsyncAPI Specification
generated: '2026-08-26'
method: searched
source: >-
https://docs.tabby.ai/pay-in-4-custom-integration/webhooks,
https://docs.tabby.ai/pay-in-4-custom-integration/dispute-webhooks,
https://docs.tabby.ai/api-reference/webhooks/register-a-webhook,
openapi/_original/tabby-api-openapi.yml
provider: Tabby
providerId: tabby
kind: webhook-catalog
asyncapi_published: false
asyncapi_probe:
- url: https://docs.tabby.ai/asyncapi.yaml
status: not-probed
note: >-
Tabby publishes no AsyncAPI. The event surface is documented in prose and in the OpenAPI's
Webhook schemas; no event-spec file is referenced anywhere in the docs, the llms.txt index or
the GitHub org. No AsyncAPI pointer is wired.
summary: >-
Tabby ships a real, well-documented webhook surface with two independent channels. Payment
webhooks are merchant-managed through /api/v1/webhooks. Dispute webhooks share the same delivery
machinery but cannot be managed through the API at all — they are enabled by the Integrations Team
on request. Delivery is at-least-once and unordered, with an explicit retry policy and a published
source-IP allowlist.
transport:
protocol: HTTPS POST
content_type: application/json
subscriber_endpoint: merchant-supplied HTTPS URL
acknowledgement: HTTP 200
timeout_seconds: 60
retries: 4
retry_interval_minutes:
min: 1
max: 4
strategy: exponential
ordering_guarantee: none
delivery_semantics: at-least-once (duplicates possible)
authentication:
mechanism: optional caller-defined header
detail: >-
An optional auth header supplied at registration is echoed on every delivery so the receiver
can verify authenticity. There is no HMAC signature, no timestamp, and no signing-secret
rotation scheme.
source_ip_allowlist:
- 34.166.36.90
- 34.166.35.211
- 34.166.34.222
- 34.166.37.207
- 34.93.76.191
- 34.166.128.182
- 34.166.170.3
- 34.166.249.7
channels:
- id: payment-webhooks
name: Payment webhooks
managed_via_api: true
operations:
register: postWebhook
list: getWebhooks
retrieve: getWebhook
update: putWebhook
remove: deleteWebhook
registration_scope: per merchant_code + secret key pair
max_endpoints: 4
environment_selection: >-
Determined by the key used to register — sk_ registers production payments, sk_test_ registers
test payments.
payload_schema: Webhook (openapi/_original/tabby-api-openapi.yml#/components/schemas/Webhook)
payload_fields:
- id
- created_at
- expires_at
- closed_at
- status
- is_test
- is_expired
- amount
- currency
- order.reference_id
- captures[]
- refunds[]
- meta.order_id
- meta.customer
- token
status_case: lowercase (authorized), unlike the uppercase statuses returned by getPayment
events:
- event: Authorize
payload_status: authorized
change: '"status": "authorized"'
merchant_action: >-
Process the order in your OMS if not already processed, then send the Capture request.
This is the most reliable way to catch payments where the buyer never returned to the site.
- event: Capture
payload_status: authorized
change: capture info appended to captures[]
merchant_action: none
- event: Close
payload_status: closed
change: '"status": "closed" and closed_at updated'
merchant_action: none
- event: Reject
payload_status: rejected
change: '"status": "rejected"'
merchant_action: Cancel or delete the order in your OMS.
- event: Expire
payload_status: expired
change: '"status": "expired", expired_at and is_expired updated'
optional: true
merchant_action: Cancel the order. Must be enabled by the Tabby team on request.
- event: Refund
payload_status: closed
change: refund info appended to refunds[]
merchant_action: none
- event: Update
payload_status: unchanged
change: order.reference_id updated
merchant_action: none
typical_sequence:
- authorized
- authorized (with capture appended)
- closed
- id: dispute-webhooks
name: Dispute webhooks
managed_via_api: false
enablement: >-
Cannot be registered through the API. Ask the Tabby Integrations Team to enable them for your
merchant_code and supply the endpoint URL.
environment: live only — disputes have no test mode
payload_fields:
- status
- dispute_id
- payment_id
- amount
- currency
- created_at
deduplication_key: dispute_id + status
events:
- status: pending
meaning: The customer opened a dispute on your payment.
- status: arbitration
meaning: You challenged the dispute and it moved to arbitration.
- status: evidence_merchant
meaning: Tabby support requested supporting evidence from you.
- status: approved
meaning: The dispute was approved and the amount was refunded to the customer.
- status: declined
meaning: The dispute was declined by Tabby support.
- status: cancelled
meaning: The dispute was cancelled by the customer.
follow_up_operation: getDispute (GET /api/v1/disputes/{disputeId}) for full detail
best_practices:
- Acknowledge with 200 immediately and process asynchronously.
- Handle out-of-order delivery with a state machine; a capture event can arrive before its
authorization event.
- Deduplicate — the same event may be delivered twice.
- Filter: you receive every payment event, not only the ones you care about.
- Allowlist the eight source IPs at your edge.
- Compare statuses case-insensitively against API responses.
gaps:
- No AsyncAPI or other machine-readable event contract.
- No HMAC signing — authenticity rests on an optional static header and IP allowlisting.
- Dispute webhooks are unmanageable through the API and untestable in any environment.
- No event id or delivery id distinct from the payment id, so deduplication for payment webhooks
must key on (payment id, status, captures/refunds length).
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.
Call it yourself
curl for this page
This AsyncAPI spec
curl "https://apis.io/api/v1/asyncapis/tabby-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 form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.