Skip to main content
Each delivery is a single event for one association. Use the 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 HTTP POST with a JSON body and these headers:
  • X-Webhook-Event: the dotted event key, for example intent.successful.
  • X-Zeam-Signature: sha256=<hex>, an HMAC of the body keyed on X-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 the Intent* 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, or RequiresManualIntervention.
  • 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
An 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

For Beneficiary_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 with GET /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.