Fees & Limits

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 client1.5%1.0%0.8%
High-risk client2.0%2.0%1.8%

USD, AED, other currencies

Total volume<$200,000$200,000+$500,000+
Standard-risk client1.5%1.2%1.0%
High-risk client2.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:

Amount1.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 /transactions and /reports endpoints 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

FieldTypeRequiredDescription
source.railstringYesSource payment rail (e.g., sepa, ethereum)
source.assetstringYesSource asset code (e.g., EUR, USDT)
source.amountnumber | stringConditionalAmount on the source side. Provide either source.amount or destination.amount.
destination.railstringYesDestination payment rail
destination.assetstringYesDestination asset code
destination.amountnumber | stringConditionalAmount on the destination side. Provide either source.amount or destination.amount.
Specify the amount on the side you know. For example, if the customer wants to send 1,000 EUR, set 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

FieldTypeDescription
source.railstringSource payment rail
source.assetstringSource asset code
source.amountstringTotal amount to be debited from the source
destination.railstringDestination payment rail
destination.assetstringDestination asset code
destination.amountstringNet amount to be credited at the destination
commission.assetstringAsset the commission is charged in: the source asset, so on an off-ramp the crypto the customer sends
commission.amountstringFee amount
exchange_ratestring | nullIndicative 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.
All amounts in the response are returned as strings to preserve decimal precision. Each amount is rounded to the precision of its asset, so crypto amounts can carry more than two decimals.Important: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.amount or destination.amount accordingly.

Ready to integrate?

Tell us about your use case and we will enable Partner API access for your account.
Copyright © 2026