Rates

Get an indicative rate quote

Preview indicative exchange rates and fees before initiating a deposit or withdrawal.

GET
/api/v2/rates

Preview the exchange rate, fees, and estimated amounts for a deposit or withdrawal before initiating the transaction. Rates are indicative and not locked — the actual rate is determined when the transaction is executed. Provide exactly one of source_amount or target_amount. Supported currencies: fiat (EUR, USD) and stablecoin (USDC, EURC). Supported pairs: EUR<->USDC, EUR<->EURC, USD->USDC. For customer wallet deposits where developer_fee is present, the wallet receive amount is target_amount - developer_fee.amount.

Authorization

bearerAuth
AuthorizationBearer <token>

Organization API key obtained on Settings > API Keys page in Compose UI.

In: header

Query Parameters

source_currency*string

Currency being sent. Case-insensitive.

Value in"EUR" | "USD" | "USDC" | "EURC"
target_currency*string

Currency to be received. Case-insensitive.

Value in"EUR" | "USD" | "USDC" | "EURC"
source_amount?string

Amount in source currency to send. Provide exactly one of source_amount or target_amount.

target_amount?string

Desired amount in target currency to receive. Provide exactly one of source_amount or target_amount.

customer_id?string

When provided on a fiat-to-crypto deposit quote, the response may include a developer_fee object if the customer has an enabled deposit wallet and a spread fee configured. Quote amounts are unchanged; developer_fee is shown separately. When developer_fee is present, customer wallet receive amount = target_amount - developer_fee.amount.

deposit_model?string

Optional deposit channel. When provided, the quote is priced for that specific deposit channel. When omitted, the cheapest available channel is selected automatically so the quote matches whatever the customer will actually pay. Case-insensitive. Ignored for withdrawals.

Value in"REFERENCE" | "VIRTUAL_ACCOUNT"
payment_rail?string

Optional payment rail. For USD, use FEDWIRE or SWIFT to price the quote for that rail. Case-insensitive.

Value in"SEPA" | "SWIFT" | "FEDWIRE"

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

curl -X GET 'https://compose.finance/api/v2/rates?source_currency=EUR&target_currency=USDC&source_amount=1000' \  -H 'Authorization: Bearer YOUR_API_KEY'

Customer sends 1000 EUR and receives approximately 1074.6 USDC after a 5 EUR fee.

{
  "source_currency": "EUR",
  "target_currency": "USDC",
  "source_amount": "1000",
  "target_amount": "1074.6",
  "exchange_rate": "1.08",
  "fee": "5",
  "fee_currency": "EUR",
  "payment_rail": "SEPA"
}

{
  "error": "source_currency: Required, target_currency: Required"
}

{
  "error": "Unauthorized - Invalid or missing API key or session"
}
{
  "error": "Customers feature is not enabled for your organization"
}
{
  "error": "Internal server error"
}
{
  "error": "Exchange rate temporarily unavailable"
}

Upload customer KYC document POST

Uploads a KYC document (identity or proof of address) for a customer to our verification provider. The customer must have initiated KYC verification first by calling `POST /customers/{customerId}/kyc`. **Identity Documents** (`idDocType`): - `PASSPORT` - Passport (any country) - `ID_CARD` - National ID card (front and back required) - `DRIVERS` - Driver's license (front and back required) - `RESIDENCE_PERMIT` - Residence permit **Proof of Address** (`idDocType: PROOF_OF_ADDRESS`): Documents must be dated within the **last 3 months**. Accepted documents: - Utility bills (gas, electricity, water) - Telecom bills (internet, cable, mobile phone) - Bank statements or bank letters (neobanks not accepted) - Government documents (tax bills, voter registration) - Lease or rental agreements **File Requirements:** - Formats: JPEG, PNG, PDF - Maximum size: 10MB

Get customer transaction GET

Returns details for a specific customer transaction. Use this to check the current status of a withdrawal or deposit. For deposit transactions where `developerFee` is present, wallet receive amount = `targetAmount - developerFee.amount`. **Status Values** - `PROCESSING` — Transaction is being processed - `PROPOSED` — Awaiting approval in dashboard - `PARTIALLY_SIGNED` — If multiple approvers configured: requires more approvals. - `COMPLETED` — Successfully completed - `FAILED` — Transaction failed - `CANCELLED` — Cancelled by user - `EXPIRED` — Expired before completion **Action Required** When `requiresUiAction` is `true`, the transaction needs user approval in the dashboard.