Current scope: partner integrations currently support users in Colombia (
countryCode: "CO"), one asset (USDC), with amounts expressed in USD-equivalent terms. Other countries and assets are not yet available through the partner API.Two credential types
The integration uses two distinct credentials, for two distinct phases:
The access token is obtained through a two-step, backend-only email OTP login (Steps 5–6 below). There is no client-side SDK to integrate — your backend calls two endpoints and receives a standard QASH JWT.
1. Prerequisites
Before you start you need:- Partner API credentials —
X-Api-Key+X-Api-Secretissued from the QASH Dashboard under Settings → API Keys. The secret is shown once at creation; store it securely in a secrets manager. - Server-side integration only — credentials must never be exposed to client-side code. Every call must originate from your backend.
Credential format
Base URL
2. User lifecycle
Every end-user goes through the following states before they can log in and transact:
Login is gated on
active status — this is intentional. It’s what forces registration, profile, and KYC to run under partner API-key credentials rather than a user session: there is no user session yet at that point.
Onboarding and login sequence
Section numbers (§N) in the diagram match the numbered sections below.
3. Step 1 — Register a user
Request fields
Response — 201 Created
id immediately. This UUID is your permanent reference for the user across all subsequent calls until you have an access token.
Errors
4. Step 2 — Create the user profile
Before starting KYC, the user must have a personal profile. Persona uses this data to pre-fill the identity verification form — without it the KYC call will fail.5. Step 3 — Verify profile completion
isComplete is false, the missingFields array lists what’s still needed. Use PATCH /api/v1/user/profile to fill in the gaps before proceeding to KYC.
6. Step 4 — Initiate KYC
Once the profile is complete, initiate identity verification.Response — 200 OK
verificationUrl. The form is pre-filled with the profile data you provided. Once the user finishes, QASH handles activation automatically — no webhook configuration required on your side.
Errors
7. Step 5 — Poll for activation
Poll untilstatus is "active", using either endpoint:
8. Step 6 — Log the user in
This is the last pre-login call, and the bridge into everything else. See Send login code and Verify login code for full details.9. Financial operations
All financial endpoints below useAuthorization: Bearer <accessToken> only.
Amount format
Ledger amounts (accounts, balance, deposit, transfer, transactions) are decimal USDC values, not smallest-unit integers — e.g.100 means USDC 100.00. Never use floating point math when handling these values in your own backend; treat them as fixed-precision decimals.
payout and exchange/calculate deal with external currencies (e.g. COP) and follow the unit conventions documented on their own pages — see Payout and Calculate exchange.
9.1 Get balance
id from this response as accountId in deposits, transfers, and transaction queries. See Get balance.
9.2 Deposit funds
9.3 Transfer funds
9.4 List / get transactions
9.5 Payout to bank account
transactionId, and response shape.
9.6 Exchange rate quote
10. Card issuance and management
Once the user is logged in, issuing and managing their card uses the same access token — no separate credential.10.1 Issue a card
10.2 Card management
See Cards overview for details on each.
11. User management
List your users
12. API key management
This is a separate credential from the end-user access token above — it authenticates you as the partner business, not an end user. Use it only to provision or revoke
X-Api-Key/X-Api-Secret pairs from your own backend admin tooling.Create a key pair
Revoke a key
13. Security checklist
-
X-Api-Secretstored in a secrets manager — not in source code or environment files committed to git. - All API calls originate from your backend — no direct browser-to-QASH calls.
-
accessToken/refreshTokenstored securely per user, not exposed to client-side code unless your integration is designed to hand sessions directly to a client app. -
transactionIdincluded on every payout request, unique per payout. - Your backend validates
user.status === "active"before attempting login. - API key rotation plan in place — revoke and reissue on any suspected compromise.
- Logs do not contain
X-Api-Secret,accessToken,refreshToken, or raw API responses with sensitive fields.
14. Complete endpoint reference
Endpoint groups by auth model
Full endpoint map
User management —X-Api-Key + X-Api-Secret
User profile and KYC status —
X-Api-Key + X-Api-Secret + userId in body/query
Login —
X-Api-Key + X-Api-Secret
KYC document/history —
Authorization: Bearer <accessToken>
Financial operations —
Authorization: Bearer <accessToken>
Cards —
Authorization: Bearer <accessToken>
API key management —
Authorization: Bearer <business-user-jwt>