---
title: "Fees"
description: "Stablegate fee schedule: no onboarding or maintenance fees, you pay only per fiat and crypto conversion."
canonical_url: "https://docs.stablegate.com/docs/guide/fees-and-limits/fees"
---
# Fees

> Stablegate fee schedule: no onboarding or maintenance fees, you pay only per fiat and crypto conversion.

Onboarding — €0

Account maintenance — €0

Pay only per transaction. No hidden fees.

## []{id="fiat--crypto-conversion-fees"}Fiat ↔ Crypto Conversion Fees

### EUR

<table>
<thead>
  <tr>
    <th>
      <strong>
        Total volume
      </strong>
    </th>
    
    <th>
      <strong>
        <€200,000
      </strong>
    </th>
    
    <th>
      <strong>
        €200,000+
      </strong>
    </th>
    
    <th>
      <strong>
        €500,000+
      </strong>
    </th>
  </tr>
</thead>

<tbody>
  <tr>
    <td>
      Standard-risk client
    </td>
    
    <td>
      1.5%
    </td>
    
    <td>
      1.0%
    </td>
    
    <td>
      0.8%
    </td>
  </tr>
  
  <tr>
    <td>
      High-risk client
    </td>
    
    <td>
      2.0%
    </td>
    
    <td>
      2.0%
    </td>
    
    <td>
      1.8%
    </td>
  </tr>
</tbody>
</table>

### USD, AED, other currencies

<table>
<thead>
  <tr>
    <th>
      <strong>
        Total volume
      </strong>
    </th>
    
    <th>
      <strong>
        <$200,000
      </strong>
    </th>
    
    <th>
      <strong>
        $200,000+
      </strong>
    </th>
    
    <th>
      <strong>
        $500,000+
      </strong>
    </th>
  </tr>
</thead>

<tbody>
  <tr>
    <td>
      Standard-risk client
    </td>
    
    <td>
      1.5%
    </td>
    
    <td>
      1.2%
    </td>
    
    <td>
      1.0%
    </td>
  </tr>
  
  <tr>
    <td>
      High-risk client
    </td>
    
    <td>
      2.2%
    </td>
    
    <td>
      2.2%
    </td>
    
    <td>
      2.0%
    </td>
  </tr>
</tbody>
</table>

## 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](#check-fees-api) 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:

<table>
<thead>
  <tr>
    <th>
      Amount
    </th>
    
    <th>
      1.5%
    </th>
    
    <th>
      Commission charged
    </th>
  </tr>
</thead>

<tbody>
  <tr>
    <td>
      €50
    </td>
    
    <td>
      €0.75
    </td>
    
    <td>
      €20.00 (minimum)
    </td>
  </tr>
  
  <tr>
    <td>
      €100
    </td>
    
    <td>
      €1.50
    </td>
    
    <td>
      €20.00 (minimum)
    </td>
  </tr>
  
  <tr>
    <td>
      €500
    </td>
    
    <td>
      €7.50
    </td>
    
    <td>
      €20.00 (minimum)
    </td>
  </tr>
  
  <tr>
    <td>
      €1,000
    </td>
    
    <td>
      €15.00
    </td>
    
    <td>
      €20.00 (minimum)
    </td>
  </tr>
  
  <tr>
    <td>
      €5,000
    </td>
    
    <td>
      €75.00
    </td>
    
    <td>
      €75.00 (percentage)
    </td>
  </tr>
</tbody>
</table>

## Banking Rail Fees

Charged per transaction, in addition to Conversion fees

<table>
<thead>
  <tr>
    <th>
      <strong>
        SEPA
      </strong>
    </th>
    
    <th>
      €0
    </th>
  </tr>
</thead>

<tbody>
  <tr>
    <td>
      <strong>
        SEPA Instant
      </strong>
    </td>
    
    <td>
      €0
    </td>
  </tr>
  
  <tr>
    <td>
      <strong>
        ACH
      </strong>
    </td>
    
    <td>
      $50
    </td>
  </tr>
  
  <tr>
    <td>
      <strong>
        Fedwire
      </strong>
    </td>
    
    <td>
      $50
    </td>
  </tr>
  
  <tr>
    <td>
      <strong>
        Swift
      </strong>
    </td>
    
    <td>
      €99/$99
    </td>
  </tr>
</tbody>
</table>

## 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](https://docs.stablegate.com/docs/guide/exchange-routes) 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.

```text
POST /v1/customers/{customer_uuid}/check-fees/
```

### Request Body

<table>
<thead>
  <tr>
    <th>
      Field
    </th>
    
    <th>
      Type
    </th>
    
    <th>
      Required
    </th>
    
    <th>
      Description
    </th>
  </tr>
</thead>

<tbody>
  <tr>
    <td>
      <code>
        source.rail
      </code>
    </td>
    
    <td>
      string
    </td>
    
    <td>
      Yes
    </td>
    
    <td>
      Source payment rail (e.g., <code>
        sepa
      </code>
      
      , <code>
        ethereum
      </code>
      
      )
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        source.asset
      </code>
    </td>
    
    <td>
      string
    </td>
    
    <td>
      Yes
    </td>
    
    <td>
      Source asset code (e.g., <code>
        EUR
      </code>
      
      , <code>
        USDT
      </code>
      
      )
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        source.amount
      </code>
    </td>
    
    <td>
      number | string
    </td>
    
    <td>
      Conditional
    </td>
    
    <td>
      Amount on the source side. Provide either <code>
        source.amount
      </code>
      
       or <code>
        destination.amount
      </code>
      
      .
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        destination.rail
      </code>
    </td>
    
    <td>
      string
    </td>
    
    <td>
      Yes
    </td>
    
    <td>
      Destination payment rail
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        destination.asset
      </code>
    </td>
    
    <td>
      string
    </td>
    
    <td>
      Yes
    </td>
    
    <td>
      Destination asset code
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        destination.amount
      </code>
    </td>
    
    <td>
      number | string
    </td>
    
    <td>
      Conditional
    </td>
    
    <td>
      Amount on the destination side. Provide either <code>
        source.amount
      </code>
      
       or <code>
        destination.amount
      </code>
      
      .
    </td>
  </tr>
</tbody>
</table>

::note
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:**

::code-switcher{body="{"source":{"rail":"sepa","asset":"EUR","amount":1000},"destination":{"rail":"ethereum","asset":"USDC"}}" method="POST" path="/v1/customers/c1d2e3f4-a5b6-7c8d-9e0f-1a2b3c4d5e6f/check-fees/"}
```bash
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:**

```json
{
  "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:**

::code-switcher{body="{"source":{"rail":"ethereum","asset":"USDT","amount":500},"destination":{"rail":"sepa","asset":"EUR"}}" method="POST" path="/v1/customers/c1d2e3f4-a5b6-7c8d-9e0f-1a2b3c4d5e6f/check-fees/"}
```bash
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:**

```json
{
  "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

<table>
<thead>
  <tr>
    <th>
      Field
    </th>
    
    <th>
      Type
    </th>
    
    <th>
      Description
    </th>
  </tr>
</thead>

<tbody>
  <tr>
    <td>
      <code>
        source.rail
      </code>
    </td>
    
    <td>
      string
    </td>
    
    <td>
      Source payment rail
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        source.asset
      </code>
    </td>
    
    <td>
      string
    </td>
    
    <td>
      Source asset code
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        source.amount
      </code>
    </td>
    
    <td>
      string
    </td>
    
    <td>
      Total amount to be debited from the source
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        destination.rail
      </code>
    </td>
    
    <td>
      string
    </td>
    
    <td>
      Destination payment rail
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        destination.asset
      </code>
    </td>
    
    <td>
      string
    </td>
    
    <td>
      Destination asset code
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        destination.amount
      </code>
    </td>
    
    <td>
      string
    </td>
    
    <td>
      Net amount to be credited at the destination
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        commission.asset
      </code>
    </td>
    
    <td>
      string
    </td>
    
    <td>
      Asset the commission is charged in: the source asset, so on an off-ramp the crypto the customer sends
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        commission.amount
      </code>
    </td>
    
    <td>
      string
    </td>
    
    <td>
      Fee amount
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        exchange_rate
      </code>
    </td>
    
    <td>
      string | null
    </td>
    
    <td>
      Indicative exchange rate used for conversion, with the exchange spread included: it is the rate <code>
        destination.amount
      </code>
      
       is calculated with. May be <code>
        null
      </code>
      
       for same-currency operations.
    </td>
  </tr>
</tbody>
</table>

::note
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](https://docs.stablegate.com/docs/guide/orders#response-fields).
::

## 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.


## Sitemap

See the full [sitemap](https://docs.stablegate.com/sitemap.md) for all pages.
