Accepting payments

There are three ways to take a Digipae payment. All of them settle to the same balance and cost the same flat 1.29% on bank & wallet payments — pick whichever fits your counter, your checkout, or your invoice.

Static QR#

Print your merchant QR once and tape it to the counter. Customers scan it, type the amount, and pay. No integration required — download your static QR from Dashboard → QR codes. Best for stalls, counters, and anywhere the customer enters the amount.

Dynamic signed QR (sessions)#

Your POS creates a session for an exact amount; Digipae returns a signed payload that you render as a QR. The customer scans and confirms — no typing, no wrong amounts. The signature and 3-minute expiry prevent QR swapping and replay at the counter.

POST/api/v1/sessions
Request
POST https://quirky-chameleon-588.convex.site/api/v1/sessions
Authorization: Bearer dgp_live_YOUR_KEY
Content-Type: application/json
Idempotency-Key: order_1042

{
  "amountCents": 2500,
  "orderRef": "ORDER-1042",
  "taxCents": 190,
  "tipCents": 0,
  "customerEmail": "buyer@example.com"
}
FieldTypeNotes
amountCentsnumber · requiredTotal charge in cents. Must be > 0 and ≤ $100,000.
orderRefstring · optionalYour order id; echoed back in webhooks so you can reconcile.
taxCentsnumber · optionalInformational tax component, included in amountCents.
tipCentsnumber · optionalInformational tip component, included in amountCents.
customerEmailstring · optionalAttach a receipt email to the session.
Idempotency-Keyheader · recommendedRetry-safe session creation: same key returns the same session instead of double-charging.
Response · 201
{
  "sessionId": "j5xkg8...",
  "status": "PENDING",
  "expiresAt": 1746489600000,
  "qrPayload": "digipae://qr/j5xkg8...",
  "idempotent": false
}

Encode qrPayload with any QR library and display it. When the customer pays, your webhook fires (or your poll flips to COMPLETED).

Pay by ID#

Every merchant has a short display ID (like DIG-7F82-Q4A1). Customers can pay you directly from the app by entering it — useful over the phone or on an invoice where scanning isn't practical. Find yours on your dashboard.

Polling a session#

GET/api/v1/sessions/:sessionId

API-key scoped status check for the session you created. Terminal states are COMPLETED, FAILED, EXPIRED, and CANCELLED.

curl
curl https://quirky-chameleon-588.convex.site/api/v1/sessions/j5xkg8... \
  -H "Authorization: Bearer dgp_live_YOUR_KEY"

Public status (embeddable checkout)#

GET/api/v1/public/sessions/:sessionId

A keyless, payer-facing status endpoint for browser widgets — it returns only what the paying customer may see (merchant name, amount, live status). The unguessable session id is the capability; your API key never ships to the browser.

Use this from your web checkout to flip the UI to "paid" in real time while your server waits for the signed webhook — the webhook remains the source of truth for fulfilment.