Create payment intent
Payment Intents
Create payment intent
Create a payment intent and receive the Zennopay-minted session token for the SDK.
POST
Create payment intent
Headers
All requests must be HMAC-signed. See Authentication.string
required
Identifies which signing key was used (e.g.
acme_prod_2026q1).string
required
ISO-8601 / RFC 3339 UTC timestamp. Requests more than 5 minutes off server time are rejected.
string
required
Random 32-byte hex string (64 chars). Replays within 10 minutes are rejected.
string
required
Base64 HMAC-SHA256 of the canonical request string.
string
Recommended. A UUID so a network retry can’t create two intents. Replaying the
same key returns the original response (and its original
session_token).Body
string
required
Your opaque, stable user identifier. Never a raw government ID. Per-user
regulatory limits are enforced against this value.
integer
required
The amount the user has authorized, in USD cents. Minimum is corridor-dependent.
string
required
One of
th_promptpay (Thailand PromptPay) or vn_vietqr (Vietnam VietQR).object
required
Your per-payment KYC attestation, from your real KYC system:
{ verified, method, verified_at, id_type, id_country }. id_type /
id_country declare which government ID the user was KYC’d on; the raw ID
number never crosses.object
required
Your per-payment sanctions attestation, from your real screening system:
{ clean, screened_at }.The KYC and sanctions attestations travel in this body: Zennopay mints the
session token from the intent and will not move money on an intent that
doesn’t carry them.
Response
string
Zennopay intent ID, format
zp_.... Use this for subsequent SDK and webhook
correlation.string
Initial state. Always
created on a successful POST.integer
Echoes the request.
string
Echoes the request.
string
The Zennopay-minted session token for this intent. Return it to your app; the
SDK sends it as
Authorization: Bearer on scan/confirm/status. Opaque —
treat it as a bearer secret and don’t parse it.integer
Unix epoch seconds at which
session_token stops verifying. Re-mint for
the same intent with POST /v1/payment_intents/{intent_id}/session.string
RFC 3339 UTC timestamp.
Example
Examples use the sandbox host. Swap tohttps://api.zennopay.com in
production. The legacy api.zennopay.in hosts are still served for existing
integrations. See Environments.
Response