Skip to main content
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 to https://api.zennopay.com in production. The legacy api.zennopay.in hosts are still served for existing integrations. See Environments.
Response