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

# Cross-border QR payments, one SDK.

> Zennopay is a B2B SDK for cross-border QR payments in Southeast Asia. Your users scan any Thai PromptPay or Vietnamese VietQR code and pay from a USD wallet balance — inside your app, via one native PaymentSheet.

<Card title="Get started" icon="bolt" href="/quickstart" horizontal cta="Start building">
  Stand up a sandbox integration end to end in about 10 minutes — sign your
  first HMAC call, read back the session token Zennopay mints, present the
  PaymentSheet. No key pair required.
</Card>

Already know the shape? Jump straight to the [PaymentSheet overview](/payments/overview).

## Build your integration

<CardGroup cols={3}>
  <Card title="Make a payment" icon="qrcode" href="/payments/overview">
    Present the native PaymentSheet — scan, confirm, slide to pay. One call in,
    one PaymentResult out.
  </Card>

  <Card title="Session endpoint" icon="server" href="/payments/session-endpoint">
    The one backend route every payment starts with: create an intent, return
    the session token Zennopay mints.
  </Card>

  <Card title="Reopen a receipt" icon="receipt" href="/payments/reopen-receipt">
    Keep your own history list; reopen the authoritative Zennopay receipt with
    its live status.
  </Card>

  <Card title="Test your integration" icon="flask" href="/payments/testing">
    Run the whole flow in the sandbox — no camera, no real money — before going
    live.
  </Card>

  <Card title="API reference" icon="code" href="/api-reference/overview">
    REST endpoints, webhooks, and an in-browser JWT inspector.
  </Card>

  <Card title="How Zennopay works" icon="diagram-project" href="/how-zennopay-works">
    One diagram of the whole system — apps, money, and rails.
  </Card>
</CardGroup>

## What Zennopay does

Zennopay lets a partner fintech offer its users a way to pay any Thai PromptPay
or Vietnamese VietQR merchant — using their USD wallet balance, from inside the
partner's own app. Two corridors are live today:

<CardGroup cols={2}>
  <Card title="Thailand" icon="flag" href="/concepts/corridors">
    PromptPay QR. THB settlement.
  </Card>

  <Card title="Vietnam" icon="flag" href="/concepts/corridors">
    VietQR. VND settlement.
  </Card>
</CardGroup>

## How a payment flows

1. The end user opens the partner app and chooses to pay a SEA merchant.
2. Partner backend calls **`POST /v1/payment_intents`** (signed with HMAC),
   passing the user's KYC + sanctions attestations, to create a Zennopay intent.
3. Zennopay mints a short-lived **session token** for that intent and returns it
   in the same response; the backend hands it to the app.
4. Partner app opens the Zennopay SDK with the `intent_id` + session token.
5. The user scans the merchant QR, confirms the amount, and slides to pay.
6. Zennopay debits the partner's pre-funded USD float, routes the transaction
   to its licensed payout partner network for the destination corridor, and the
   merchant receives local currency.
7. Zennopay sends the partner a webhook with the final status.

The moving parts and where the money sits at each step are diagrammed in
[How Zennopay works](/how-zennopay-works); the full auth sequence is in
[Authentication](/authentication) under "end-to-end flow."

## What makes Zennopay different

* **USD-only on our side.** We never hold THB or VND. The local payout provider
  owns the FX leg.
* **FBO custody.** Partner funds are held in a For-Benefit-Of account at our US
  banking partner. Funds remain attributable to the partner (and beneficially to
  its end users) at all times.
* **One credential.** Your backend signs REST calls with a long-lived HMAC
  secret; Zennopay mints the short-lived, per-intent session token your app
  holds. No key pair to generate or register.
