Tapaya

Webhooks

Receive signed notifications when payments, refunds, merchants, and onboarding change.

Webhooks notify your server about changes in your Tapaya organization. Use the same integration for In-Store and Online payments, regardless of the payment processor.

How it works

Configure one HTTPS destination per organization and select the events you need. Tapaya sends an HTTP POST with a JSON snapshot and a signature. Verify the signature, store the event, and return a successful response before processing your business logic.

You can subscribe to individual types or all supported types. An all-types subscription also receives newly supported types in the future, so ignore types your application does not recognize.

Quick integration

Save a destination

In the Platform, open API Keys, then Webhooks. Enter your HTTPS URL, choose the events you need, and save. Copy the signing secret now; it is shown only once. See Configuration.

Verify each request

Compute an HMAC-SHA256 of the timestamp, a period, and the raw body with your signing secret, and compare it with X-Tapaya-Signature. See Check the signature.

Store the event, then return 2xx

Save the event with a unique id, answer 2xx within 10 seconds, and process it afterwards. See Store and acknowledge.

Send a test webhook

On the same page, use the test action to send a signed webhook.test. See Send a test webhook.

Event envelope

Each event uses this shared structure. The resource snapshot inside data depends on its type.

{
  "id": "019a0000-0000-7000-8000-000000000001",
  "type": "payment.succeeded",
  "apiVersion": "1",
  "organizationId": "019a0000-0000-7000-8000-000000000002",
  "merchantId": "019a0000-0000-7000-8000-000000000005",
  "createdAt": "2026-10-30T12:00:00.000000Z",
  "data": {
    "payment": {
      "id": "019a0000-0000-7000-8000-000000000003",
      "token": "example_payment_token",
      "merchantId": "019a0000-0000-7000-8000-000000000005",
      "status": "success",
      "statusId": 2,
      "requestedAmount": 10000,
      "requestedCurrencyId": 203,
      "settlementAmount": 10000,
      "settlementCurrencyId": 203
    }
  }
}
FieldMeaning
idUnique event ID. Use it to deduplicate deliveries. Retries keep the same ID.
typeEvent name from the event catalog.
apiVersionPayload schema identifier, currently the string "1".
organizationIdOrganization that owns the event. Check that it matches your integration.
merchantIdMerchant that owns the resource. May be null for older payments with unresolved ownership or a diagnostic test.
createdAtUTC time when the event was captured, rather than its delivery time.
dataImmutable resource snapshot at capture time.

Amounts are integer minor units of the field's currency. For example, 10000 with numeric ISO 4217 currency ID 203 means CZK 100.00. Requested and settlement amounts can use different currencies.

Each event type puts its own snapshot inside data. See Event Types for every payload shape and status value.

Delivery rules

Tapaya sends an event as soon as its change is saved, and keeps sending it until your server answers 2xx.

RuleBehavior
AcknowledgmentAny 2xx response within 10 seconds. Redirects are not followed.
RetriesUp to 12 attempts over about 20 hours, waiting 1, 2, 4, 8, 16, 32, 64, 128, 256, 360, and 360 minutes.
OrderNot guaranteed. Delivery is at least once, so expect duplicates and older snapshots.
Concurrency2 requests at a time per organization, shared with manual tests. Other events wait in the queue.

A failed delivery never changes the payment itself, and past deliveries cannot be replayed. To catch up after an outage, read the current state through the payment and merchant APIs.

Start integrating

Missing something on this page?Request a feature. We attach this page so the team sees the context.