Amounts are integer minor units.
2550 = £25.50, 1000 = €10.00. The same format is used across the Payment API. See Amounts & Currencies.How It Works
Prerequisites
- A Quidkey merchant account with
client_idandclient_secret(sign up) - An access token (see Authentication)
- The buyer’s name, email, phone number, and billing address
Step 1: Authenticate
Exchange your credentials for an access token. The token is valid for 15 minutes.Step 2: Create a Redirect Payment
CallPOST /api/v1/payment-requests:redirect with a Bearer token and an Idempotency-Key. The request body carries the buyer, the billing address, the amount, and where to send the buyer afterwards.
Response
A successful call returns 201 Created. Save the
redirect_url: it’s the bank page you’ll send the buyer to next.Request Body Reference
| Field | Type | Required | Description |
|---|---|---|---|
merchant_id | string | No | UUID of the merchant collecting the payment. Optional for merchant tokens; required only for admin/global tokens |
customer.name | string | Yes | Buyer’s full name |
customer.email | string | Yes | Buyer’s email address |
customer.phone_number | string | No | E.164 format phone number |
billing_address.address_line1 | string | Yes | First line of the billing address |
billing_address.city | string | Yes | City |
billing_address.postal_code | string | Yes | Postal or ZIP code |
billing_address.country | string | Yes | ISO 3166-1 alpha-2 country code |
amount | integer | Yes | Amount in minor units (2550 = £25.50). Min 1, max 9999999 (≈ £99,999.99) |
currency | string | Yes | ISO 4217 currency code (e.g., GBP, EUR) |
locale | string | Yes | BCP-47 locale tag for the hosted page (e.g., en-GB) |
payment_reference | string | No | Max 18 characters, alphanumeric only ([A-Za-z0-9]). Shown on the buyer’s bank statement. |
order_id | string | No | Your internal order identifier for reconciliation |
success_url_redirect | string | No | Where to send the buyer after a successful payment |
fail_url_redirect | string | No | Where to send the buyer after a failed or cancelled payment |
selected_bank_id | string | No | Pre-select a bank and skip the picker. See Deep-link to a bank |
test_transaction | boolean | No | Set true in development so no real money moves |
Step 3: Redirect the Buyer
Send the buyer’s browser to theredirect_url. It opens a Quidkey-hosted page that shows only banks (no card option), where the buyer selects their bank and approves the payment inside their banking app or web flow. When they finish, Quidkey returns them to your success_url_redirect or fail_url_redirect.
Node.js
After the bank flow, Quidkey sends the buyer back to your
success_url_redirect or fail_url_redirect. Treat these strictly as UX: a place to show the buyer a confirmation or retry screen. They are not proof of the outcome. Confirm the result authoritatively via the webhook, or by polling the merchant status endpoint GET /api/v1/payment-requests/{paymentRequestId}/status.Idempotency
Send a uniqueIdempotency-Key header on every create request. If the request is retried, for example after a network timeout, Quidkey returns the original result instead of creating a second payment. Use a value tied to the buyer’s intent, such as your order ID plus an attempt counter.
Deep-link to a Bank
To skip the bank picker, pass aselected_bank_id at create time when the buyer has already chosen their bank in your own UI. The hosted page takes them straight to that bank.
Build a Bank Button
To show the buyer’s most popular banks in your own UI before they reach the hosted page, fetch the top banks for their country and currency, then pass the chosenid as selected_bank_id. This endpoint is public and cacheable at the market level, so it needs no access token.
Response
Verify with Webhooks
The webhook is the authoritative record of what happened. When a payment reaches a final state, Quidkey sends an event to your registered endpoint:| Event | Meaning |
|---|---|
quidkey.payment_request.succeeded | Payment completed. Fulfil the order. |
quidkey.payment_request.failed | Payment failed at the bank. |
quidkey.payment_request.canceled | Buyer abandoned or cancelled the payment. |
quidkey.payment_request.pending | Payment is in progress, not yet final. |
quidkey.payment_request.reversed | A completed payment was later reversed. |
Set Up Webhooks
Register your endpoint, verify signatures, and handle every payment status event
Next Steps
Quickstart
The condensed end-to-end version of this flow
Embedded (with Stripe)
Prefer an inline checkout alongside Stripe? Use the Embedded flow
Hosted Checkout
Just need a shareable link? Use Hosted Checkout
API Reference
Explore every endpoint with an interactive playground