Fees
Onboarding — €0
Account maintenance — €0
Pay only per transaction. No hidden fees.
Fiat ↔ Crypto Conversion Fees
EUR
| Total volume | <€200,000 | €200,000+ | €500,000+ |
|---|---|---|---|
| Standard-risk client | 1.5% | 1.0% | 0.8% |
| High-risk client | 2.0% | 2.0% | 1.8% |
USD, AED, other currencies
| Total volume | <$200,000 | $200,000+ | $500,000+ |
|---|---|---|---|
| Standard-risk client | 1.5% | 1.2% | 1.0% |
| High-risk client | 2.2% | 2.2% | 2.0% |
Minimum Commission
Each transaction is charged whichever is greater: the percentage rate above, or a flat minimum commission of €20 (or currency equivalent). The €20 minimum is the platform default; a customer may have a custom minimum configured. Like the minimum transaction amount, it does not depend on the verification level — Check Fees returns the exact commission for the customer. This means the commission looks flat at small transaction sizes — the €20 minimum dominates until the percentage rate would itself exceed €20 — and becomes purely percentage-based above that crossover point.
At the standard EUR rate (1.5%), the crossover is around €1,334:
| Amount | 1.5% | Commission charged |
|---|---|---|
| €50 | €0.75 | €20.00 (minimum) |
| €100 | €1.50 | €20.00 (minimum) |
| €500 | €7.50 | €20.00 (minimum) |
| €1,000 | €15.00 | €20.00 (minimum) |
| €5,000 | €75.00 | €75.00 (percentage) |
Banking Rail Fees
Charged per transaction, in addition to Conversion fees
| SEPA | €0 |
|---|---|
| SEPA Instant | €0 |
| ACH | $50 |
| Fedwire | $50 |
| Swift | €99/$99 |
Fee Disclosure
- High-risk fees are approximate and are subject to personal fees for each high-risk client case.
- Net Settlement — fees are automatically deducted from the transaction amount before confirmation.
- Developer markup — developers/partners may apply a custom per-transaction markup. This charge is assessed in addition to Stablegate fees.
- Reporting & Audit — full fee data available via
/transactionsand/reportsendpoints for reconciliation and accounting. - Availability — not all rails and currencies listed above are currently enabled. Always query the Exchange Routes API to confirm available conversion paths.
Check Fees API
Before creating an order, use the fee check endpoint to calculate the exact costs for your customer. This allows you to display accurate fee breakdowns in your application before the customer confirms the transaction.
Endpoint
Calculate fees for a specific exchange operation.
POST /v1/customers/{customer_uuid}/check-fees/
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
source.rail | string | Yes | Source payment rail (e.g., sepa, ethereum) |
source.asset | string | Yes | Source asset code (e.g., EUR, USDT) |
source.amount | number | string | Conditional | Amount on the source side. Provide either source.amount or destination.amount. |
destination.rail | string | Yes | Destination payment rail |
destination.asset | string | Yes | Destination asset code |
destination.amount | number | string | Conditional | Amount on the destination side. Provide either source.amount or destination.amount. |
source.amount. If they want to receive exactly 1,000 USDC, set destination.amount. The API will calculate the other side.Example: On-Ramp Fee Check (source amount specified)
The customer wants to convert 1,000 EUR to USDC.
Request:
curl https://api.stablegate.com/v1/customers/c1d2e3f4-a5b6-7c8d-9e0f-1a2b3c4d5e6f/check-fees/ \
--request POST \
--header 'X-Api-Key: YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"source": {
"rail": "sepa",
"asset": "EUR",
"amount": 1000
},
"destination": {
"rail": "ethereum",
"asset": "USDC"
}
}'
Response:
{
"source": {
"rail": "sepa",
"asset": "EUR",
"amount": "1000.00"
},
"destination": {
"rail": "ethereum",
"asset": "USDC",
"amount": "978.50"
},
"commission": {
"asset": "EUR",
"amount": "15.00"
},
"exchange_rate": "1.006700"
}
In this example:
- The customer sends 1,000.00 EUR
- The fee is 15.00 EUR
- The exchange rate is 1.0067 (EUR/USDC)
- The customer receives 978.50 USDC (after fees and conversion)
Example: Off-Ramp Fee Check (source amount specified)
The customer wants to convert 500 USDT to EUR.
Request:
curl https://api.stablegate.com/v1/customers/c1d2e3f4-a5b6-7c8d-9e0f-1a2b3c4d5e6f/check-fees/ \
--request POST \
--header 'X-Api-Key: YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"source": {
"rail": "ethereum",
"asset": "USDT",
"amount": 500
},
"destination": {
"rail": "sepa",
"asset": "EUR"
}
}'
Response:
{
"source": {
"rail": "ethereum",
"asset": "USDT",
"amount": "500.000000"
},
"destination": {
"rail": "sepa",
"asset": "EUR",
"amount": "473.25"
},
"commission": {
"asset": "USDT",
"amount": "10.00"
},
"exchange_rate": "0.966500"
}
Response Fields
| Field | Type | Description |
|---|---|---|
source.rail | string | Source payment rail |
source.asset | string | Source asset code |
source.amount | string | Total amount to be debited from the source |
destination.rail | string | Destination payment rail |
destination.asset | string | Destination asset code |
destination.amount | string | Net amount to be credited at the destination |
commission.asset | string | Asset the commission is charged in: the source asset, so on an off-ramp the crypto the customer sends |
commission.amount | string | Fee amount |
exchange_rate | string | null | Indicative exchange rate used for conversion, with the exchange spread included: it is the rate destination.amount is calculated with. May be null for same-currency operations. |
check-fees is a preview. The exchange_rate is calculated at the time of the request and is not reserved: creating an order calculates it again, and an unfunded order is re-priced until the deposit arrives. The rate an order currently holds, and until when, are in exchange_rate and rate_valid_until of the order details.Best Practices
- Check fees immediately before order creation to ensure the customer sees the most accurate quote. Exchange rates and fees can fluctuate.
- Display the full breakdown to your customers: source amount, fee, and destination amount.
- Handle both directions: some customers think in terms of "I want to send X," others in terms of "I want to receive Y." Use
source.amountordestination.amountaccordingly.
Ready to integrate?
Overview
Check the exact fees and the customer's transaction limits before you create an exchange order.
Limits
Minimum transaction: a platform default, or a custom value configured for the customer. It does not depend on the verification level — read the exact value from the Limits API (operation_min_amount rule).