Skip to main content

Documentation Index

Fetch the complete documentation index at: https://developer.uphold.com/llms.txt

Use this file to discover all available pages before exploring further.

This guide walks you through the steps to support SEPA bank deposits using the REST API — from generating deposit instructions to monitoring for the incoming transfer.

Prerequisites

Walkthrough


Check available rails

Call List Rails to verify SEPA supports the deposit feature before proceeding.
GET /core/rails?type=bank&network=sepa&asset=EUR
A successful response includes the rail details and its features.
{
  "rails": [
    {
      "type": "bank",
      "network": "sepa",
      "method": "bank-transfer",
      "asset": "EUR",
      "decimals": 2,
      "features": [
        "deposit",
        "withdraw"
      ]
    }
  ]
}

Select destination account

SEPA deposits can target any account. If the selected account is not in EUR, the deposited amount will be converted to the destination account’s currency at the time of settlement. Make sure the destination asset has the necessary features enabled.

Find an existing account

Call List accounts to retrieve the user’s accounts and let them pick the one they want to fund.
GET /core/accounts
{
  "accounts": [
    {
      "id": "a00507fe-628c-4f27-ae81-e1c40b2a8fb8",
      "ownerId": "e4ce04dc-67b7-4e9f-af91-482cb6f9fc4a",
      "label": "My EUR account",
      "asset": "EUR",
      "balance": {
        "total": "500.00",
        "available": "500.00"
      }
    }
  ]
}

Create a new account

If the user has no accounts, create one with Create account before proceeding.
POST /core/accounts
{
  "label": "My EUR account",
  "asset": "EUR"
}
{
  "account": {
    "id": "a00507fe-628c-4f27-ae81-e1c40b2a8fb8",
    "ownerId": "e4ce04dc-67b7-4e9f-af91-482cb6f9fc4a",
    "label": "My EUR account",
    "asset": "EUR",
    "balance": {
      "total": "0",
      "available": "0"
    }
  }
}

Terms and disclosures

Before generating deposit instructions, you must collect the user’s acceptance of the applicable terms of service and display the required regulatory disclaimer.

Accept terms of service

The user must accept the unique-account-number-viban terms of service before SEPA deposit instructions can be generated. Display the following copy to the user and prompt them to continue:
By selecting continue you agree to the LHV’s Principles of Processing Customer Data and the Personal Deposit Accounts Terms and Conditions.
Once the user confirms, call Accept terms of service to register their acceptance.
POST /core/terms-of-service/unique-account-number-viban/accept

EMD disclaimer

This disclaimer is required to comply with FCA regulations. Display it to users based in GB, the first time they link a credit/debit card or generate bank deposit details — it only needs to be shown once:
Uphold Europe Limited is an EMD Agent of Optimus Cards UK Limited (FRN: 902034). All received funds are held in a designated safekeeping account with a regulated bank and kept separate from Uphold’s own assets. These funds are not protected by the UK Financial Services Compensation Scheme.

Generate deposit method

Call Set up account deposit method with the target account id and the desired network. For subsequent calls, use Get account deposit method instead.
PUT /core/accounts/{accountId}/deposit-method?type=bank&network=sepa&asset=EUR
A successful response includes the necessary bank details and reference for the user to initiate the transfer.
{
  "depositMethod": {
    "type": "bank",
    "status": "ok",
    "details": {
      "network": "sepa",
      "asset": "EUR",
      "beneficiary": "John Doe",
      "bankName": "Example Bank",
      "bankAddress": {
        "line1": "123 Bank Street",
        "line2": "Vienna, Austria"
      },
      "bic": "EXAAAT2K",
      "iban": "AT487954841229809844",
      "reference": "UH12345678"
    }
  }
}
The deposit method may initially return status: processing while the details are being prepared. Call Get account deposit method to make sure the deposit method is ready (status: ok) before displaying instructions to the user.
Provide the IBAN, BIC, and reference to the user. Include the beneficiary name, bank name, and bank address to help the user confirm the legitimacy of the instructions.
Deposits sent without the reference are still credited, but funds will be deposited into the user’s default EUR account.

Monitor for the incoming transfer

Prefer webhooks for real-time updates, or fall back to polling if webhooks are not feasible.

Sample transaction

In a successful SEPA deposit, the origin is represented as an external-account node. This is because the origin bank details are automatically registered as an external account. The destination is the account selected when the deposit instructions were generated, or the user’s default EUR account if the transfer was sent without a reference, or the selected account doesn’t exist anymore.
{
  "transaction": {
    "id": "b1bbbc0f-dae2-4e94-9e6d-4b9d5a1f3c1f",
    "origin": {
      "asset": "EUR",
      "amount": "250.00",
      "node": {
        "type": "external-account",
        "id": "cc8e8abc-0f95-4b9f-8490-2569a67bd80e",
        "ownerId": "e4ce04dc-67b7-4e9f-af91-482cb6f9fc4a"
      }
    },
    "destination": {
      "asset": "EUR",
      "amount": "250.00",
      "node": {
        "type": "account",
        "id": "a00507fe-628c-4f27-ae81-e1c40b2a8fb8",
        "ownerId": "e4ce04dc-67b7-4e9f-af91-482cb6f9fc4a"
      }
    },
    "status": "completed",
    "quotedAt": "2025-01-10T11:02:39Z",
    "createdAt": "2025-01-10T11:12:39Z",
    "updatedAt": "2025-01-10T11:13:08Z",
    "denomination": {
      "asset": "EUR",
      "amount": "250.00",
      "target": "origin"
    }
  }
}
The new external account can be then retrieved with Get external account to show the sender’s bank details alongside the transaction, or to withdraw funds to the same account in the future.
{
  "externalAccount": {
    "id": "cc8e8abc-0f95-4b9f-8490-2569a67bd80e",
    "ownerId": "e4ce04dc-67b7-4e9f-af91-482cb6f9fc4a",
    "type": "bank",
    "status": "ok",
    "label": "EUR Bank Account",
    "asset": "EUR",
    "network": "sepa",
    "features": [
      "withdraw"
    ],
    "details": {
      "iban": "AT487954841229809844",
      "bic": "EXAAAT2K"
    },
    "createdAt": "2025-01-10T11:12:39Z",
    "updatedAt": "2025-01-10T11:13:08Z"
  }
}

Notify the user

Display an in-app confirmation when the transaction is completed, and send an email if applicable.
You now support SEPA bank transfer deposits via the REST API.