> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zennopay.in/llms.txt
> Use this file to discover all available pages before exploring further.

# Create payment intent

> Create a new Zennopay payment intent for a single user payment.

<Note>
  The full request and response schema is still being finalized. Fields below
  reflect the auth spec. Additional fields (merchant details, metadata, etc.)
  will land in a future revision. 🚧
</Note>

## Headers

All requests must be HMAC-signed. See [Authentication](/authentication).

<ParamField header="X-Zennopay-Key-Id" type="string" required>
  Identifies which signing key was used (e.g. `wizz_prod_2026q1`).
</ParamField>

<ParamField header="X-Zennopay-Timestamp" type="string" required>
  RFC 3339 UTC timestamp. Requests more than 5 minutes off server time are rejected.
</ParamField>

<ParamField header="X-Zennopay-Nonce" type="string" required>
  Random 32-byte hex string. Replays within 10 minutes are rejected.
</ParamField>

<ParamField header="X-Zennopay-Signature" type="string" required>
  Base64 HMAC-SHA256 of the canonical request string.
</ParamField>

## Body

<ParamField body="amount_usd_cents" type="integer" required>
  The amount the user has authorized, in USD cents. Minimum is corridor-dependent.
</ParamField>

<ParamField body="corridor" type="string" required>
  One of `th_promptpay` (Thailand PromptPay) or `vn_vietqr` (Vietnam VietQR).
</ParamField>

<ParamField body="wizz_user_id" type="string" required>
  Your opaque user identifier. Zennopay never sees the underlying user PII;
  this is for your internal correlation.
</ParamField>

## Response

<ResponseField name="intent_id" type="string">
  Zennopay intent ID, format `zp_...`. Use this for subsequent SDK and webhook
  correlation.
</ResponseField>

<ResponseField name="status" type="string">
  Initial state. Always `created` on a successful POST.
</ResponseField>

<ResponseField name="amount_usd_cents" type="integer">
  Echoes the request.
</ResponseField>

<ResponseField name="corridor" type="string">
  Echoes the request.
</ResponseField>

<ResponseField name="created_at" type="string">
  RFC 3339 UTC timestamp.
</ResponseField>

## Example

Examples use the sandbox host. Swap to `https://api.zennopay.com` in
production. See [Environments](/api-reference/environments).

<CodeGroup>
  ```bash Sandbox theme={null}
  curl -X POST https://api.sandbox.zennopay.com/v1/payment_intents \
    -H "X-Zennopay-Key-Id: wizz_sandbox_2026q2" \
    -H "X-Zennopay-Timestamp: 2026-05-21T14:30:00Z" \
    -H "X-Zennopay-Nonce: a1b2c3d4e5f6789012345678abcdef00" \
    -H "X-Zennopay-Signature: <base64_hmac_sha256>" \
    -H "Content-Type: application/json" \
    -d '{
      "amount_usd_cents": 345,
      "corridor": "th_promptpay",
      "wizz_user_id": "user_abc123"
    }'
  ```

  ```bash Production theme={null}
  curl -X POST https://api.zennopay.com/v1/payment_intents \
    -H "X-Zennopay-Key-Id: wizz_prod_2026q2" \
    -H "X-Zennopay-Timestamp: 2026-05-21T14:30:00Z" \
    -H "X-Zennopay-Nonce: a1b2c3d4e5f6789012345678abcdef00" \
    -H "X-Zennopay-Signature: <base64_hmac_sha256>" \
    -H "Content-Type: application/json" \
    -d '{
      "amount_usd_cents": 345,
      "corridor": "th_promptpay",
      "wizz_user_id": "user_abc123"
    }'
  ```
</CodeGroup>

```json Response theme={null}
{
  "intent_id": "zp_AbCd1234EfGh5678",
  "status": "created",
  "amount_usd_cents": 345,
  "corridor": "th_promptpay",
  "created_at": "2026-05-21T14:30:00Z"
}
```
