---
title: "Quickstart"
description: "Seven requests take a new customer from nothing to a paid-out on-ramp order. Each step links to the page that explains the details; the bodies here are the shortest working form."
canonical_url: "https://docs.stablegate.com/docs/guide/getting-started/quickstart"
---
# Quickstart

> Seven requests take a new customer from nothing to a paid-out on-ramp order. Each step links to the page that explains the details; the bodies here are the shortest working form.

Seven requests take a new customer from nothing to a paid-out on-ramp order. Each step links to the page that explains the details; the bodies here are the shortest working form.

Send `X-Api-Key` with every request — see [Authentication](https://docs.stablegate.com/docs/guide/getting-started/authentication) for where the key comes from and for the client samples in other languages.

## []{id="1-create-the-customer"}1. Create the customer

::code-switcher{body="{"type":"individual","email":"max.mustermann@example.com","first_name":"Max","last_name":"Mustermann","country_code":"DE"}" method="POST" path="/v1/customers/"}
```bash
curl https://api.stablegate.com/v1/customers/ \
  --request POST \
  --header 'X-Api-Key: YOUR_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
  "type": "individual",
  "email": "max.mustermann@example.com",
  "first_name": "Max",
  "last_name": "Mustermann",
  "country_code": "DE"
}'
```
::

The response carries the customer `uuid`. Keep it: every later call needs it. Details — [Customers](https://docs.stablegate.com/docs/guide/customers#create-a-customer).

## []{id="2-verify-the-customer"}2. Verify the customer

Instant verification needs nothing from the customer beyond their identity details:

::code-switcher{body="{"first_name":"Max","last_name":"Mustermann","date_of_birth":"1990-05-17"}" method="POST" path="/v1/customers/CUSTOMER_UUID/verification/instant/"}
```bash
curl https://api.stablegate.com/v1/customers/CUSTOMER_UUID/verification/instant/ \
  --request POST \
  --header 'X-Api-Key: YOUR_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
  "first_name": "Max",
  "last_name": "Mustermann",
  "date_of_birth": "1990-05-17"
}'
```
::

Stablegate screens the name against sanctions and politically exposed persons and approves the application when the screening is clear — usually within minutes. Poll [Check the Verification State](https://docs.stablegate.com/docs/guide/customers#check-the-verification-state) until `application.status` is `approved`; `kyc_level_key` then holds `light`.

::code-switcher{method="GET" path="/v1/customers/CUSTOMER_UUID/verification/"}
```bash
curl https://api.stablegate.com/v1/customers/CUSTOMER_UUID/verification/ \
  --header 'X-Api-Key: YOUR_API_KEY'
```
::

Standard verification works the same way but the customer uploads documents: [Create a Verification Link](https://docs.stablegate.com/docs/guide/customers#create-a-verification-link).

## []{id="3-register-where-the-money-goes"}3. Register where the money goes

For an on-ramp the customer receives crypto, so register their wallet:

::code-switcher{body="{"rail":"ethereum","address":"0xDC1dCb46fC96C46c4F294866AFCA81874041bB2","name":"Max — main"}" method="POST" path="/v1/customers/CUSTOMER_UUID/wallets/"}
```bash
curl https://api.stablegate.com/v1/customers/CUSTOMER_UUID/wallets/ \
  --request POST \
  --header 'X-Api-Key: YOUR_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
  "rail": "ethereum",
  "address": "0xDC1dCb46fC96C46c4F294866AFCA81874041bB2",
  "name": "Max — main"
}'
```
::

Ethereum and Polygon wallets also need an ownership signature — [External Accounts](https://docs.stablegate.com/docs/guide/external-accounts#create-a-wallet). For an off-ramp register a bank account instead.

## []{id="4-check-what-the-order-will-cost"}4. Check what the order will cost

::code-switcher{body="{"source":{"rail":"sepa","asset":"EUR","amount":1000},"destination":{"rail":"ethereum","asset":"USDC"}}" method="POST" path="/v1/customers/CUSTOMER_UUID/check-fees/"}
```bash
curl https://api.stablegate.com/v1/customers/CUSTOMER_UUID/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"
  }
}'
```
::

The answer holds the commission, the amount the customer receives, the rate and how long the rate holds. Limits are a separate call — `POST /v1/customers/CUSTOMER_UUID/check-limits/` returns an empty array when the order fits.

## []{id="5-create-the-order"}5. Create the order

::code-switcher{body="{"source":{"rail":"sepa","asset":"EUR","amount":1000},"destination":{"rail":"ethereum","asset":"USDC","client_account_uuid":"WALLET_UUID"}}" idempotency-key="onramp-2026-11-10-001" method="POST" path="/v1/customers/CUSTOMER_UUID/orders/"}
```bash
curl https://api.stablegate.com/v1/customers/CUSTOMER_UUID/orders/ \
  --request POST \
  --header 'X-Api-Key: YOUR_API_KEY' \
  --header 'Content-Type: application/json' \
  --header 'Idempotency-Key: onramp-2026-11-10-001' \
  --data '{
  "source": {
    "rail": "sepa",
    "asset": "EUR",
    "amount": 1000
  },
  "destination": {
    "rail": "ethereum",
    "asset": "USDC",
    "client_account_uuid": "WALLET_UUID"
  }
}'
```
::

The response is the order: `reference` is the payment reference the customer must put on the transfer, `source.deposit_bank_info` holds the account to pay into, `state` stays `new` until the money arrives.

## []{id="6-follow-the-deposit-and-the-payout"}6. Follow the deposit and the payout

Either poll the order or wait for the webhook.

::code-switcher{method="GET" path="/v1/customers/CUSTOMER_UUID/orders/ORDER_UUID/"}
```bash
curl https://api.stablegate.com/v1/customers/CUSTOMER_UUID/orders/ORDER_UUID/ \
  --header 'X-Api-Key: YOUR_API_KEY'
```
::

`source.deposit_status` moves to `detected` when the transfer lands, and `state` goes `new` → `processing` → `done`. Webhooks are described in [Webhooks](https://docs.stablegate.com/docs/guide/webhooks): one event per status change, and one per deposit status change.

## What to expect and when

<table>
<thead>
  <tr>
    <th>
      Step
    </th>
    
    <th>
      How long it takes
    </th>
  </tr>
</thead>

<tbody>
  <tr>
    <td>
      Instant verification
    </td>
    
    <td>
      Minutes; longer when the screening returns a match and compliance reviews it
    </td>
  </tr>
  
  <tr>
    <td>
      SEPA deposit
    </td>
    
    <td>
      Usually the same or next banking day, <code>
        sepa_instant
      </code>
      
       in seconds; <code>
        deposit_status
      </code>
      
       shows the arrival
    </td>
  </tr>
  
  <tr>
    <td>
      Payout to a wallet
    </td>
    
    <td>
      Minutes after the order reaches <code>
        processing
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      Payout to a bank account
    </td>
    
    <td>
      Same or next banking day
    </td>
  </tr>
</tbody>
</table>

::note
`Idempotency-Key` is optional but cheap: a retried request with the same key returns the first result instead of creating a second order. See [Idempotency](https://docs.stablegate.com/docs/guide/getting-started/idempotency).
::


## Sitemap

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