Overview
Capaβs API enables fintechs and platforms to integrate seamless cryptocurrency on-ramping, off-ramping, and fiat-to-fiat cross-ramp transfers. Users can exchange fiat currencies for cryptocurrencies and vice versa, or convert between different fiat currencies, with just a few simple steps. Capa currently supports MXN (Mexican Peso), DOP (Dominican Peso), USD (US Dollar), and EUR (Euro).Integration Flow
The following steps apply to every integration regardless of which transaction types you plan to support.Get your API key
To start testing, sign up at sandbox.capa.fi to get a staging API key immediately β no onboarding required. For production, use the partner dashboard to manage your API keys. See the API Key Guide for details on usage and regeneration.
Configure webhooks
Register your webhook URL via the Webhook Settings endpoint and implement HMAC signature validation to verify incoming events. See Webhooks for retry behavior and best practices.
Create and verify users
Create a user with
externalUserId, email, and identifier, then complete identity verification via KYC link, direct KYC submission, or KYB link for businesses. See the User Creation and Verification guide.Set up bank accounts and receivers (if needed)
For off-ramp and cross-ramp transactions, provide destination bank details inline, save them via the Bank Accounts API, or create Receivers for third-party payouts.
Get a quote (optional)
Use Get Quote Rate for a real-time estimate, or Create Quote to lock a guaranteed exchange rate for 10 seconds. Quoting works the same way across on-ramp, off-ramp, and cross-ramp transactions. For cross-ramp, use the dedicated Cross-Ramp Quote endpoints.
Create a transaction
With a verified user (and optionally a locked quote), create the transaction for your use case:
- On-Ramp (fiat to crypto): Create On-Ramp β see the On-Ramp Guide
- Off-Ramp (crypto to fiat): Create Off-Ramp β see the Off-Ramp Guide
- Cross-Ramp (fiat to fiat): Create Cross-Ramp β see the Cross-Ramp Guide
Monitor and manage transactions
Receive real-time status updates via Transaction Events and KYC Events webhooks. You can also list transactions or cancel a transaction as needed. See the Transactions Guide.
How It All Fits Together
Key Things to Know
- KYC before transactions β A user must be fully verified before you can create any transaction for them.
- Quotes are optional but short-lived β A locked quote expires after 10 seconds. If no quote is used, the rate is calculated at the time of funding.
- Premium spread β If a
quoteIdis provided, the quoteβspremiumSpreadtakes precedence over any value in the transaction request. Set it when creating the quote. - Webhook reliability β Return a
2xxresponse promptly. Failed deliveries are retried up to 5 times. As a fallback, poll the List Transactions or Get KYC Details endpoints. - No idempotency keys β Duplicate requests create duplicate resources. Build safeguards on your side to prevent double submissions.
Production Readiness Checklist
Before going live, make sure you have:- Webhook URL registered and HMAC signature validation implemented
- User creation + KYC/KYB flow tested end-to-end in staging
- At least one transaction of each type you support tested in staging
- Error handling for common error codes (
400,401,403,404,409,429) - Safeguards against duplicate submissions (no idempotency key support)
- Rate limiting handled (10 requests per second per partner)
API Environments
| Environment | Base URL | Purpose |
|---|---|---|
| Staging | https://staging-api.capa.fi | Testing and development |
| Production | https://api.capa.fi | Live transactions with real funds |
Staging vs Production
| Aspect | Staging | Production |
|---|---|---|
| Fiat transfers | Simulated (no real money moves) | Real SPEI/ACH/SEPA transfers |
| Crypto transfers | Real on-chain transactions | Real on-chain transactions |
| KYC verification | Not validated (random data accepted) | Full identity verification |
| Exchange rates | May differ from live market | Live market rates |
| Mock testing | Enabled (see mock guide) | Disabled |
Rate Limits
All API endpoints are rate-limited to 10 requests per second per partner. Exceeding this limit returns a429 Too Many Requests response. Rate limit information is not included in response headers.
Error Response Format
All error responses follow this structure:| HTTP Status | Code | Description |
|---|---|---|
| 400 | INVALID_USER_INPUT | Validation error (missing or invalid fields) |
| 401 | UNAUTHORIZED | Invalid or missing API key |
| 403 | FORBIDDEN | Action not allowed for this partner or user |
| 404 | NOT_FOUND | Resource not found |
| 409 | USER_ALREADY_EXISTS_ERROR | User with this email or externalUserId already exists |
| 429 | β | Rate limit exceeded |