One base URL for sandbox and production — swap your API key when you go live, no code changes required. Prefunded wallet, synchronous issuance, and idempotent order placement built for reseller integrations.
Two ideas to internalize before writing your first integration. The rest of the API follows from them.
Authentication
Static API keys in the format qrk_{test|live}_{opaque}. The key prefix selects your workspace — test keys route to sandbox, live keys to production. No code changes required to switch environments.
Source IPs must be on the allowlist registered with your account manager. Scopes (catalog.read, orders.read, orders.write, wallet.read) are bound to the key at issuance.
Status
Meaning
401
Missing, invalid, revoked, or expired key (unauthorized)
403
Source IP not on allowlist, or missing scope (forbidden)
402
Wallet below required amount (insufficient_funds)
409
Idempotency key in progress or rate card missing
422
Out of stock, activation failed, or activation timeout
410
Idempotency key expired (24 h TTL)
429
Rate limited — check Retry-After
Idempotency & retries
POST /orders requires an Idempotency-Key header. Retrying with the same key and body replays the original response — the same issuedCode, the same wallet debit, exactly once.
If you receive 504 Gateway Timeout, retry the same request with the same idempotency key. Do not generate a new key until you intend a new order.
Pitfall. Don't regenerate the key inside your retry loop. Generate once when you decide to place the order, and reuse it for every retry of that order.
// keys are UUIDv4 strings Idempotency-Key:7c1d9a4f-2f9c-4e8b-9a3d-b06d24fe11ac
03 — Example
Place an order#
A complete request for one voucher. Use denominationInCents from GET /catalog; optional metadata stores your reconciliation tags.
04 — Endpoints
What you can call#
The full API surface — seven endpoints across catalog, orders, and wallet. Each links into the Scalar reference for schemas and try-it.
GET/healthno auth
Liveness probe. Returns status and server time.
GET/catalogcatalog.read
Paginated brands assigned to you, each with priced denominations (faceValueInCents, netCostInCents).
POST/ordersorders.write
Place one voucher order (requires Idempotency-Key). Debits wallet synchronously; returns issuedCode on success.
GET/ordersorders.read
Paginated order list. Filter by status, startDatetime, or endDatetime.
GET/orders/{orderId}orders.read
Fetch one order by id, including issuedCode when status is ISSUED.
GET/walletwallet.read
balanceInCents, reservedInCents, and spendable availableInCents for your currency.
GET/wallet/transactionswallet.read
Append-only ledger (newest first). Filter by type, date range, or reference.
Ready to read the full reference?
Schemas, request/response examples, and a try-it console for every endpoint. Hosted on Scalar — bring your sandbox key.