Webhook Events

Reference for all webhook event types, payloads, and best practices for handling Mesta webhooks.

Webhook Events

Mesta sends webhook notifications when key events occur in the system. Use webhooks to receive real-time updates about orders, senders, UBOs, beneficiaries, and deposits.

Setup

  1. Register a webhook using the Create Webhook API, passing the event names you want to subscribe to
  2. Verify signatures using your webhook signature key (see Webhook Signature Verification)
  3. Return 2xx promptly to acknowledge receipt

You can register up to 5 webhooks.

Event Names

Event names use the form <entity>:<action> — note the colon, not a dot. Anything outside the
live tables in this section is rejected with a 400 VALIDATION_FAILED when you register the
webhook, including everything under Planned Events.

The <entity>:* wildcards subscribe to every event in that family, including events added later.

Order Events

EventDescription
order:*All order events
order:createdOrder has been accepted and persisted
order:awaiting_fundsOrder is ready to receive funds
order:awaiting_funds_timeoutFunds were not received in time
order:funds_receivedFunds have been received and confirmed
order:in_progressOrder is being processed
order:sent_to_beneficiaryFunds have been sent to the beneficiary
order:successOrder completed successfully
order:failedOrder failed
order:cancelledOrder was cancelled
order:returnedPayment was returned by the beneficiary bank
order:proof_of_payment_receivedProof of payment has been received for the order
order:invoice_review_requiredThe order's invoice requires review

Sender Events

EventDescription
sender:*All sender events
sender:createdSender has been created
sender:kyb_pendingBusiness sender verification is in progress
sender:kyb_approvedBusiness sender has been verified and approved
sender:kyb_declinedBusiness sender verification was declined
sender:kyc_pendingIndividual sender verification is in progress
sender:kyc_approvedIndividual sender has been verified and approved
sender:kyc_declinedIndividual sender verification was declined
sender:tos_link_generatedA terms-of-service acceptance link has been generated
sender:tos_acceptedThe sender accepted the terms of service
sender:activatedSender is active and can transact
sender:deactivatedSender has been deactivated

UBO Events

EventDescription
ubo:*All UBO events
ubo:createdUBO has been created
ubo:verification_pendingUBO verification is in progress
ubo:verification_approvedUBO has been verified and approved
ubo:verification_declinedUBO verification was declined

Beneficiary Events

EventDescription
beneficiary:*All beneficiary events
beneficiary:createdBeneficiary has been created
beneficiary:verification_approvedBeneficiary has been verified and approved
beneficiary:verification_declinedBeneficiary verification was declined

Deposit Events

EventDescription
fiat_deposit:settledA fiat deposit has settled
stablecoin_deposit:settledA stablecoin deposit has settled
stablecoin_deposit:rejectedA stablecoin deposit was rejected

Planned Events

🚧

Not available yet

The events below are reserved for future releases. They are not emitted today, and passing any of them to POST /v1/webhooks is rejected with 400 VALIDATION_FAILED. Do not build against them yet — subscribe to the live events above.

Planned eventNotes
order:need_reviewneed_review already exists as an order status; no event is emitted for it yet
order:refund_in_progressRefunds are tracked today via the refund_in_progress order status
order:refundedRefunds are tracked today via the refunded order status
sender:verification_pendingUse the live sender:kyb_pending / sender:kyc_pending events instead
sender:verification_approvedUse the live sender:kyb_approved / sender:kyc_approved events instead
sender:verification_declinedUse the live sender:kyb_declined / sender:kyc_declined events instead
beneficiary:verification_pending
payment_method:approvedapproved already exists as a payment method status
payment_method:declineddeclined already exists as a payment method status
payment_method:pending_user_consentpending_user_consent already exists as a payment method status

Webhook Payload Format

Every webhook uses the same envelope. Only entity.data changes from event to event:

{
  "id": "00000000-0000-4000-b000-000000000000",
  "event": "order:success",
  "entity": {
    "id": "00000000-0000-4000-a000-000000000006",
    "type": "order",
    "data": {}
  }
}
FieldTypeDescription
idstringUnique event ID. Stable across replays — use it as your idempotency key.
eventstringEvent name, in <entity>:<action> form (see tables above)
entity.idstringID of the object the event is about
entity.typestringOne of order, sender, ubo, beneficiary, fiat_deposit, stablecoin_deposit
entity.dataobjectA snapshot of that object at the time the event fired

For a per-event breakdown of entity.data, see Sample Webhook payloads.

📘

Fields are omitted, not nulled, when they do not apply

Optional relations and scope-restricted fields may be absent from entity.data entirely. Read defensively rather than asserting on an exact key set.

Delivery and Retries

Each request carries a Content-Type: application/json header and an X-Webhook-Signature
header — a lowercase hex HMAC-SHA256 of the raw request body, signed with your webhook signature key.

If your endpoint does not return a 2xx response, Mesta retries delivery up to 5 attempts in
total, after which the event is moved to a dead-letter queue and is no longer retried
automatically.

Best Practices

  1. Respond quickly — acknowledge with a 2xx as soon as you have persisted the event, and process it asynchronously.
  2. Handle duplicates — use the event id to deduplicate. The same event may be delivered more than once.
  3. Verify signatures — always verify X-Webhook-Signature before processing.
  4. Handle unknown events — ignore event names you don't recognize. New events may be added.
  5. Subscribe with wildcards — use order:*, sender:*, ubo:* or beneficiary:* if you want every event in a family, including ones added later.

Did this page help you?