Statement lines carry a running balance and a stable row identity
Statements
GET /v1/statements/transactionslines now includerunningBalance(the wallet’s balance in the asset after the line, matching the PDF statement’s numbers) androwId(an opaque, stable identity — unique within a wallet’s statement and identical on every export of the same settled row; use it as a dedupe key, e.g. an OFXFITID). Additive — existing clients are unaffected.
Breaking: fromRef/toRef are validated (1–20 characters, letters/digits/hyphens)
Payments
fromRefandtoRefon all payment submissions are now validated: when supplied, a reference must match^[A-Za-z0-9-]{1,20}$. Anything else — including an explicit empty string — returns a400naming the field. Omitted ornullstill means “no reference”.- References are never altered in flight: what you send is exactly what
appears on both parties’ statements, and a withdrawal’s
toRefis now also printed as the payment reference on the recipient’s bank or mobile-money statement.
New: statement lines endpoint — enriched transaction history per wallet and asset
Statements
- New
GET /v1/statements/transactions?walletId&assetCode&startDate&endDate: the wallet’s on-chain statement lines for an asset over a date range — one line per balance movement, with a humandescription(the payment’s title where it carries one) and the viewing wallet’s ownreferencefor the leg. The same source that renders the Business Portal’s account statement and PDF, so the strings match across surfaces.
Breaking: quotes require exactly one of beneficiaryId or transactionType
Quotes
POST /v1/quotesnow requires exactly one ofbeneficiaryIdortransactionType— never both, never neither. Sending both, or neither, returns a422with field-level errors on both fields.beneficiaryIdbehaves as before: the transaction type is derived server-side from your association and the beneficiary, and the quote is priced for the corridor the payment will actually execute as.transactionType(C2C/C2B/B2C/B2B, case-insensitive) is new: price an exploratory quote directly for a named corridor before choosing a beneficiary. It previously had no effect on the fee and was silently ignored — it’s now validated and honoured with a real, computed price.
Optional sender/recipient reference fields on payment submissions
Payments
POST /v1/payments/p2p/own,/p2p/beneficiary,/p2p/own/multi,/swap/own,/swap/beneficiary, and/offrampnow accept optionalfromRefandtoRef— free-form references passed through unchanged. Omitted values stay omitted; existing clients are unaffected.
Breaking: payment submissions require a single transactionId; gateway-side money-path gates retired
Payments
idempotencyKeyandexternalReferenceare removed from all payment submission requests (p2p/own,p2p/beneficiary,p2p/own/multi,swap/own,swap/beneficiary,offramp).transactionIdis now the only identity field — it doubles as the idempotency key and the reference recorded on the transaction. Replaying the sametransactionIdstill returns the original result withisIdempotent: true.
Wallet creation validation: walletName required, nationality/registrationCountry checked against ISO 3166-1
Wallets
POST /v1/walletsnow rejects a blankwalletName.metadata.nationalityandmetadata.registrationCountry(for third-party FICA wallets) must now be a real ISO 3166-1 country code — alpha-2 or alpha-3, case-insensitive — and are normalised to alpha-3 automatically. A correctly-sized value that isn’t a real country (e.g.XXX) now returns a field error immediately.
Third-party wallets: ownAccount and FICA metadata on create
Wallets
POST /v1/walletsnow acceptsownAccount(boolean, defaultfalse) and, whenfalse, a requiredmetadataobject carrying the third party’s FICA details (entityType: Person— including sole proprietors — orBusiness, plus the matching identity or company fields).- Wallet resources (create/get/list) now include
ownAccountandstatus(Pending/Verified/Rejected). Only aVerifiedwallet can transact; own-account wallets areVerifiedimmediately, third-party wallets startPendinguntil KYC review completes.
Webhook signature and timestamp changes
Webhooks
- The HMAC key for
X-Zeam-Signaturechanged from the association id to theX-Webhook-Idvalue. Update your signature verification to key onX-Webhook-Id. - Deliveries now include
X-Webhook-Ts— the delivery timestamp as Unix milliseconds (UTC). Use it to reject stale deliveries and shrink your replay window. See Webhook security.
Breaking: payment endpoints, asset model, auth, and connector changes
Breaking changes that require integrator updates.Payments — endpoint split
POST /v1/payments/p2pandPOST /v1/payments/swapare removed. Use the dedicated variants:POST /v1/payments/p2p/own— same-asset transfer between your own wallets.POST /v1/payments/p2p/beneficiary— same-asset payment to a beneficiary’s CRYPTO destination.POST /v1/payments/swap/ownandPOST /v1/payments/swap/beneficiary— cross-asset equivalents.POST /v1/payments/p2p/own/multi— new. Sends multiple own-wallet transfers as one atomic Stellar transaction (all legs settle or fail together).
sendingAssetandreceivingAssetare renamed tosendingAssetCodeandreceivingAssetCodeacross all payment endpoints, including offramp. Supply a bare code (e.g.USDZ); the gateway resolves the issuer server-side.
- Added
GET /v1/assetsandGET /v1/assets/{assetCode}— the platform asset registry, listing each asset’s code and Stellar issuer. Use this to discover valid asset codes before submitting payments. - Removed
GET /v1/wallet-typesandGET /v1/networks. Wallet creation now only acceptswalletNameandassetCode; network, type, and custody are fixed platform-side.
- The
x-association-idheader is no longer read or required. The association is resolved server-side from the token’s registered client. Remove it from your requests. A valid token whose client has no registered association now returns403.
- The
countryquery parameter onGET /v1/connectorsis renamed tocountryIsoCode2(ISO 3166-1 alpha-2). Connector responses no longer include afeesarray; usePOST /v1/quotesfor authoritative pricing.
serviceCommissionis removed from the quote response.
countryIso→countryIsoCode2(ISO 3166-1 alpha-2);currencyCode→currencyIsoCode3(ISO 4217) on both input and response.- For
CRYPTOdestinations: supplynetworkName,assetSymbol, andwalletAddress. Internal ids (networkId,assetId,connectorId) are no longer accepted.
GET /v1/walletsnow accepts optionalassetCodeandnetworkNamefilters.- Wallet resources now include
accountNumberandnetworkNamein place of the internaltypeIdandnetworkIdfields.
Payments, transactions, and webhook management
Reworked the money-movement surface and aligned the documentation with the
implemented contract.Payments
- Added
POST /v1/payments/p2p(same-asset transfer),POST /v1/payments/swap(cross-asset transfer), andPOST /v1/payments/offramp(cash-out against a quote). Each is asynchronous and returns202 Acceptedwith atransactionRecordId; replaying anidempotencyKeyreturns the original result withisIdempotent: true. - Added
GET /v1/payments/enumsandGET /v1/payments/requirementsfor the off-ramp compliance vocabularies and per-connector field requirements. - Removed the transaction-intent model:
POST /v1/intents,GET /v1/intents/{intentId}, and the singlePOST /v1/paymentsare no longer part of the integrator surface.
- Added
GET /v1/transactionsandGET /v1/transactions/{transactionId}to track a submission to its outcome.
- Added
POST /v1/webhooks(register),GET /v1/webhooks/{webhookId}(retrieve), andDELETE /v1/webhooks/{webhookId}(deactivate) alongside listing.
- Protected routes now require the
x-association-idheader, whose value is returned asassociationIdwhen you issue a token.
- New guides: Register your application and Your first transaction.
- Expanded Webhooks with events, security, and troubleshooting, and added Use the Zeam docs with MCP.
- Documented sandbox off-ramp testing.
Resource expansion: wallets, beneficiaries, connectors
Extended the gateway’s REST surface with read and write operations across
wallets, beneficiaries, and connectors.Wallets
- Added
GET /v1/wallets/{walletId}— retrieve a single wallet. Balances are now embedded in the wallet resource (balancesarray) on List, Get, and Create responses, with best-effort enrichment from Horizon. - Added
GET /v1/wallet-types— reference list for validtypeIdvalues when creating a wallet. - Added
GET /v1/networks— reference list for validnetworkIdvalues when creating a wallet. POST /v1/walletsnow requiresassetCodefor the initial trustline.- Removed
GET /v1/wallets/{walletId}/balancesandGET /v1/wallets/{walletId}/transactions(use the embeddedbalancesfield on the wallet resource instead).
- Added
GET /v1/beneficiaries/{beneficiaryId}— retrieve a single beneficiary with full nested detail (individual or business sub-object, addresses, tags, and payment destinations). - Added
PATCH /v1/beneficiaries/{beneficiaryId}— update a beneficiary using merge semantics. - Added
GET /v1/beneficiaries/{beneficiaryId}/payment-destinations— list payment destinations for a beneficiary, with optionalmethodfilter. - Added
POST /v1/beneficiaries/{beneficiaryId}/payment-destinations— add a payment destination (BANK, MOBILE_MONEY, or CRYPTO). - Added
GET /v1/beneficiaries/{beneficiaryId}/payment-destinations/{destinationId}— retrieve a single payment destination. POST /v1/beneficiariesbody updated:individual,business,addresses, andtagsfields are now accepted. ThedisplayNamefield has been removed.
- Added
GET /v1/connectors/{connectorId}— retrieve a single connector with its full execution steps (not available from the list). Accepts an optionaltransactionTypequery parameter to scope step data.
Initial documentation
First release of the Zeam API Gateway developer documentation.
- Overview, API concepts, and quickstart.
- Authentication: the two-factor model, API keys, and access tokens.
- Sandbox and production promotion.
- Webhooks: registration through the business portal and listing via the API.
- Platform reference: conventions, errors, pagination, and rate limits.
- API reference generated from the gateway’s OpenAPI contract.