X-Webhook-Event
header as the reliable event discriminator.
Event types
These are the values you subscribe to when you create a webhook.
IntentSuccessful and IntentFailed correspond to a transaction reaching
completed and failed respectively.
Delivery headers
Every delivery is an HTTPPOST with a JSON body and these headers:
X-Webhook-Event: the dotted event key, for exampleintent.successful.X-Zeam-Signature:sha256=<hex>, an HMAC of the body keyed onX-Webhook-Id. See Security.X-Association-Id: the association the event belongs to.X-Webhook-Id: a unique delivery id. Also the HMAC key. Use it to de-duplicate retries.X-Webhook-Ts: delivery timestamp as Unix milliseconds (UTC). Use it to reject stale deliveries. See Security.Content-Type: application/json; charset=utf-8.
Payload
string
The event type, as the name in the table above (for example
IntentSuccessful). The X-Webhook-Event header carries the dotted key.string
The payment intent identifier. For payment destination events it is the
destination id; for customer events it is all zeros.
string
The association the event belongs to.
string
A human-readable description of the event.
string
ISO 8601 timestamp of when the event was created.
object
Event-specific detail. The shape for each family of events is below; read
fields defensively.
string | null
For a payment you submitted, the
transactionId from your request. For a
provider on-ramp payment, an id Zeam assigned;
match those on metaData.data.transactionDetails instead. For customer
events, the customerId you registered.string | null
The Stellar transaction hash, once the payment is on-chain.
string | null
Identifies the flow that produced the event. Treat it as an opaque label.
Example delivery
Payment events
For theIntent* events, metaData carries:
association_id: the association the payment belongs to.transaction_intent_status: the intent’s state:Created,Executing,Processing,Completed,Failed,Reversing,Reversed, orRequiresManualIntervention.data:{}for payments you submitted. For provider on-ramp payments, a summary of the payout:
string
Receive: the fees were taken from the payment before it reached your wallet.string
What lands in your wallet, to 7 decimal places.
string
The fees, to 7 decimal places.
netAmount plus totalFees is what the
customer paid.string
The asset of
netAmount and totalFees, for example ZARZ.object
type is OnRamp. onrampReference is the reference you registered that
the payment arrived on (for EasyPay, the EasyPay number), and
paymentReference is the provider’s reference for this payment, when it has
one.Example provider on-ramp metaData
IntentFailed raised because a payment could not be accepted for
processing at all is the exception: its metaData is {} and its
externalReference is null. Key on intentId and the X-Webhook-Event
header, and read metaData defensively.
Payment destination events
ForBeneficiary_PaymentDestination_Approved and
Beneficiary_PaymentDestination_Rejected, intentId is the payment destination
id, externalReference and transactionHash are null, and metaData
carries beneficiaryId, destinationId, method, decision, note,
occurredAt, and the beneficiary’s classification.
Customer events
Customer_Verified and Customer_Rejected are not about a payment, so
intentId is all zeros and transactionHash is null. externalReference
and metaData.customerId carry the customerId you registered, and
metaData.status is Verified or Rejected.
Example customer delivery
Reconcile the event
For a payment you submitted, the event does not include the amount. Look the payment up withGET /v1/transactions/{transactionId}, using
the transactionRecordId you received in the 202 response, and act on the
authoritative record.
A provider on-ramp payment has no transaction record. Its amounts are in
metaData.data on its lifecycle events, and transactionDetails.onrampReference
tells you which of your references it arrived on.
Once it settles, the payout also appears in the wallet’s balance and
statement.