> ## Documentation Index
> Fetch the complete documentation index at: https://guides.saber.money/llms.txt
> Use this file to discover all available pages before exploring further.

# EUR/GBP Onramp

> Buy stablecoin with Euros or Pounds Sterling via an Open Banking redirect.

EUR/GBP onramp lets your users convert Euros or Pounds Sterling into stablecoin. Every onramp flow follows the same four steps: **Create User → KYC → Bank Account Linkage → Transaction** — though EUR/GBP onramp handles the linkage step a little differently, as covered below.

<Info>
  Both USDT and USDC are supported for EUR/GBP onramp.
</Info>

<Steps>
  <Step title="Create User">
    ```http theme={null}
    POST /api/v2/user
    ```

    ```json theme={null}
    {
      "email": "user@example.com",
      "phone": "+491701234567"
    }
    ```

    Response:

    ```json theme={null}
    {
      "success": true,
      "data": {
        "user_id": "550e8400-e29b-41d4-a716-446655440000"
      }
    }
    ```

    Save `user_id` — every subsequent call needs it as the `X-User-Id` header.
  </Step>

  <Step title="KYC">
    EUR/GBP supports two KYC methods. For onramp specifically, the user's **address (address line 1, town, country)** is mandatory.

    <Tabs>
      <Tab title="KYC Sharing">
        ```http theme={null}
        POST /api/v2/user/kyc
        ```

        Headers: `X-User-Id: <user_id>`

        ```json theme={null}
        {
          "legal_name": "Hans Mueller",
          "poi": "<proof-of-identity-document-id>",
          "poa": "<proof-of-address-document-id>",
          "dob": "1990-01-31",
          "email": "user@example.com",
          "phone": "+491701234567",
          "country_iso3": "DEU",
          "address_line_1": "10 Musterstrasse",
          "town": "Berlin",
          "country": "DEU"
        }
        ```

        Response:

        ```json theme={null}
        { "success": true, "data": {} }
        ```

        <Note>
          Since KYC Sharing means Saber isn't collecting the KYC itself, the client must explicitly pass `address_line_1`, `town`, and `country` in this call.
        </Note>

        See [KYC Sharing](/user/kyc/sharing) for the full field reference. Saber may request supporting KYC documents at any time — these must be shared within 72 hours of the request.
      </Tab>

      <Tab title="KYC Widget">
        Redirect the user to a signed URL:

        ```javascript theme={null}
        const sigString = clientId + timestamp + "sdk" + userId
        const secret = HmacSHA256(sigString, clientSecret).toString().toUpperCase()
        // redirect to: https://app.saber.money/kyc?client_id=...&user_id=...&timestamp=...&secret=...&redirect_url=<url-encoded-url>
        ```

        The URL is valid for **10 minutes** from generation. Append the optional `redirect_url` as the last query parameter (URL-encoded) to send the user back to your app when they exit the flow.

        <Info>
          Since the address fields are captured as part of the widget's own KYC flow, no separate address submission is needed here.
        </Info>

        See [KYC Hosted Widget](/user/kyc/widget) for the full parameter reference.
      </Tab>
    </Tabs>
  </Step>

  <Step title="Bank Account Linkage">
    <Info>
      There is no bank account registration step for EUR/GBP onramp — funds are pulled directly via an Open Banking redirect at payment time, covered in the next step.
    </Info>
  </Step>

  <Step title="Transaction">
    Two variants:

    * **Pool Buy** — collected funds are converted to stablecoin and deposited into the pool wallet on the Saber system.
    * **External Buy** — collected funds are converted to stablecoin and sent to a specified wallet address on a given network.

    The flow is identical for both — the only difference is that External Buy requires `wallet_address` and `network` in the request. See [Available Networks and Tokens](/client/pool-account/supported-networks) for supported networks and per-network limits.

    Two kinds of quotes are available — a **Live Quote** (informational, executes at market rate) or a **Locked Quote** (rate held \~30-60s, supplied as `quote_id` in the buy request):

    Live quote:

    ```http theme={null}
    GET /api/v2/wallet/s/quote?from_currency=EUR&to_currency=USDT&from_amount=100
    ```

    Locked quote:

    ```http theme={null}
    GET /api/v2/wallet/w/quote?from_currency=EUR&to_currency=USDT&from_amount=100
    ```

    Save `id` from the locked-quote response as `quote_id`.

    <Tabs>
      <Tab title="Pool Buy">
        ```http theme={null}
        POST /api/v2/wallet/transaction/pool/buy
        ```

        ```json theme={null}
        {
          "fiat_symbol": "EUR",
          "crypto_symbol": "USDT",
          "fiat_amount": 100,
          "payment_method": "open_banking",
          "quote_id": "<quote_id>"
        }
        ```

        <Note>
          `quote_id` is only required when using a Locked Quote — omit it when using a Live Quote.
        </Note>
      </Tab>

      <Tab title="External Buy">
        ```json theme={null}
        {
          "fiat_symbol": "EUR",
          "crypto_symbol": "USDT",
          "fiat_amount": 100,
          "payment_method": "open_banking",
          "quote_id": "<quote_id>",
          "wallet_address": "0x318d2aae4c99c2e74f7b5949fa1c34df837789b8",
          "network": "BSC"
        }
        ```
      </Tab>
    </Tabs>

    **Response:** the `payment_method: open_banking` response includes a payment URL. Redirect the user there to select their bank and complete payment.

    ```json theme={null}
    {
      "success": true,
      "data": {
        "id": "xxxxxx",
        "status": "CREATED",
        "payment_url": "https://pay.saber.money/...",
        "expiry": "xxxxxx"
      }
    }
    ```

    <Warning>
      The payment URL is valid for **1 hour**. If the user doesn't complete payment within that window, the link expires.
    </Warning>

    See [EUR/GBP Open Banking best practices](/onramp/currencies/eur-gbp-best-practices) for guidance on handling the redirect flow well.
  </Step>
</Steps>

## Checking status

```http theme={null}
GET /api/v2/wallet/transaction?transaction_type={POOL_BUY|EXTERNAL_BUY}&transaction_id={id}
```

Status values mirror the offramp equivalents (`CREATED`, `PROCESSING`/`PAYMENT_INITIATED`, `COMPLETED`, `FAILED`, `CANCELLED`, `REFUND_INITIATED`, `REFUND_COMPLETED`, etc.).

Poll until the status reaches a terminal state, or configure a webhook URL to receive completion pushes instead — see [Order Lifecycle and Webhooks](/onramp/operations/lifecycle).

## User limits and EDD

Each user has a lifetime transaction limit (currently \$200,000 USD equivalent — this figure is suggestive and subject to change; confirm current limits with Saber). Once a user's limit is breached, no further transactions can be created until Enhanced Due Diligence (EDD) is completed to raise it.

EDD is completed via the [EDD Hosted Widget](/users/limits-edd/widget), with a turnaround time of 2-3 working days.

## Related pages

<CardGroup cols={2}>
  <Card title="EUR/GBP Open Banking best practices" icon="building-columns" href="/onramp/currencies/eur-gbp-best-practices" cta="View guide" arrow="true" />

  <Card title="Onramp Operations" icon="arrow-right-arrow-left" href="/onramp/available-flows" cta="View guide" arrow="true" />

  <Card title="User KYC" icon="id-card" href="/user/kyc/overview" cta="View guide" arrow="true" />
</CardGroup>


## Related topics

- [Overview](/user/bank-account/overview.md)
- [Available Flows](/onramp/available-flows.md)
- [EUR/GBP Openbanking: Best Practices](/onramp/currencies/eur-gbp-best-practices.md)
- [EUR/GBP Offramp](/offramp/currencies/eur-gbp.md)
