checkoutUrl, and learn the outcome via webhooks or reads.
Base URL
/api/v1.
api.qint.ch is the stable production hostname. Keep the base URL in
configuration anyway — environment switches stay a one-line change.Authentication
Send yourqk_live_… API key with every request, either way:
403. See Authentication for creation and rotation.
Errors
Errors are RFC 7807 problem documents,Content-Type: application/problem+json:
Include the
traceId when contacting support about a failed request.
Error codes
Only three errors carry a machine-readablecode: amount_out_of_range (400, with minChf, maxChf and amountChf), terms_acceptance_required (403) and rate_unavailable (503). Every other error has no code field — branch on the HTTP status and treat detail as a human-readable message.
A currency Qint has switched off for new payments is one of these code-less 400s:
Response (400 Bad Request)
type, title and traceId, as above.) If you need to tell this case apart, match detail against is currently disabled on Qint. Better: check the public list currencies endpoint before creating an intent, so you never send a disabled currency. See currency availability.
Rate limits
The API is rate limited per client. On429, retry with exponential backoff. Creates are retry-safe — the required idempotencyKey makes a replay return the original intent; see idempotency.
Conventions
- JSON in, JSON out, camelCase field names.
- Statuses are lowercase strings on the wire:
initiated,pending,confirmed,settled,failed,expired,cancelled. - Crypto amounts are 8-decimal strings (
"55.48765432") — parse as decimals, never floats. - Timestamps are ISO 8601 with offset.
- Pagination on list endpoints:
page(1-based) andpageSize(1–100, default 20); responses carryitems,total,page,pageSize. - Ids are prefixed: intents
pi_…, payment linkspl_…, invoicesinv_….
Breaking change 20 October 2026
Merchant balances are now kept in fiat, in each merchant’s Account Currency (CHF, EUR, USD or GBP; CHF by default), instead of a stablecoin. Every payment is credited in that currency at the rate fixed when the buyer is quoted. The base path stays/api/v1; the change affects the payment intent and the payment.status webhook.
Payment intents (POST /api/v1/intents, GET /api/v1/intents, GET /api/v1/intents/{id}):
- Removed:
creditUsdtandcreditAsset. - Added:
creditAmount(what the payment added to your balance, 2 decimal places) andcreditCurrency(your Account Currency at the time of the quote). - Changed meaning:
creditRateis now units ofcreditCurrencyper 1 unit of the invoicecurrency,1when they match. It used to be fiat per stablecoin unit. - Changed:
feeAmountandnetAmount(still incurrency) are computed on the quote, so they always agree with the credit. AsettledAmountbooked later no longer changes them. - All three credit fields are
nulluntil the payment is credited, and on payments settled before 20 October 2026.
payment.status: creditAmount, creditCurrency and creditRate are added (filled on the settled event, null otherwise). The change is additive; see credit fields.
SDKs: @qint/node 0.3.0, the .NET package Qint 0.3.0, qint-sdk for Python 0.3.0 and github.com/SwizzX-GmbH/qint-go v0.4.0 follow the change (credit_amount and credit_currency in Python, CreditAmount and CreditCurrency in .NET and Go). The WooCommerce plugin 1.0.5 shows the credit in the order note.
Dashboard: the balance, balance conversion and Account Currency endpoints are listed under Dashboard in this reference. Crypto payouts are not offered at launch.