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

# FPS bank deposit via the REST API

> Generate GBP Faster Payments (FPS) deposit instructions and monitor incoming transfers using the Uphold REST API, with automatic origin account linking after first deposit.

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

## Prerequisites

* The user has [completed onboarding](/developer-guides/user-onboarding/overview) and has the required capabilities enabled.

## Walkthrough

```mermaid theme={null}
sequenceDiagram
  autonumber
  participant Usr as User
  participant U as Your App
  participant B as Your Backend
  participant A as Uphold
  participant F as Bank

  Usr->>U: Choose account to fund
  U->>B: Set up deposit method
  B->>A: Set up account deposit method
  A-->>B: { depositMethod }
  B-->>U: { depositMethod }
  U-->>Usr: Display bank instructions
  Usr->>F: Initiate bank transfer
  F-->>A: Incoming transfer received
  A->>A: Link origin as external account
  A-->>B: webhook: transaction.created (processing)
  F-->>A: Settlement confirmed
  A-->>B: webhook: transaction.status-changed (completed/failed)
  B-->>Usr: Notify the user
```

***

## Check available rails

Call [List Rails](/rest-apis/core-api/assets/list-rails) to verify FPS supports the `deposit` feature before proceeding.

```http theme={null}
GET /core/rails?type=bank&network=fps&asset=GBP
```

A successful response includes the rail details and its features.

```json theme={null}
{
  "rails": [
    {
      "type": "bank",
      "network": "fps",
      "method": "bank-transfer",
      "asset": "GBP",
      "decimals": 2,
      "features": [
        "deposit",
        "withdraw"
      ]
    }
  ]
}
```

## Select destination account

FPS push bank deposits can target any account. If the selected account is not in GBP, 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](/rest-apis/core-api/assets/introduction#features-and-deposits-/-withdrawals).

### Find an existing account

Call [List accounts](/rest-apis/core-api/accounts/list-accounts) to retrieve the user's accounts and let them pick the one they want to fund.

```http theme={null}
GET /core/accounts
```

```json theme={null}
{
  "accounts": [
    {
      "id": "a00507fe-628c-4f27-ae81-e1c40b2a8fb8",
      "ownerId": "e4ce04dc-67b7-4e9f-af91-482cb6f9fc4a",
      "label": "My GBP account",
      "asset": "GBP",
      "balance": {
        "total": "500.00",
        "available": "500.00"
      }
    }
  ]
}
```

### Create a new account

If the user has no accounts, create one with [Create account](/rest-apis/core-api/accounts/create-account) before proceeding.

```http theme={null}
POST /core/accounts
{
  "label": "My GBP account",
  "asset": "GBP"
}
```

```json theme={null}
{
  "account": {
    "id": "a00507fe-628c-4f27-ae81-e1c40b2a8fb8",
    "ownerId": "e4ce04dc-67b7-4e9f-af91-482cb6f9fc4a",
    "label": "My GBP account",
    "asset": "GBP",
    "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 FPS 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](https://www.lhv.ee/en/principles-of-processing-customer-data) and the [Personal Deposit Accounts Terms and Conditions](https://uphold.com/en-gb/legal/unique-account-number-terms-of-use).

Once the user confirms, call [Accept terms of service](/rest-apis/core-api/terms-of-service/accept-terms-of-service) to register their acceptance.

```http theme={null}
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](/rest-apis/core-api/accounts/set-up-account-deposit-method) with the target account id and the desired network. For subsequent calls, use [Get account deposit method](/rest-apis/core-api/accounts/get-account-deposit-method) instead.

```http theme={null}
PUT /core/accounts/{accountId}/deposit-method?type=bank&network=fps&asset=GBP
```

A successful response includes the necessary bank details and reference for the user to initiate the transfer.

```json theme={null}
{
  "depositMethod": {
    "type": "bank",
    "status": "ok",
    "details": {
      "network": "fps",
      "asset": "GBP",
      "sortCode": "123456",
      "accountNumber": "12345678",
      "reference": "UH12345678",
      "beneficiary": "John Doe",
      "bankName": "Example Bank",
      "bankAddress": {
        "line1": "123 Bank Street",
        "line2": "London, United Kingdom"
      }
    }
  }
}
```

<Note>The deposit method may initially return `status: processing` while the details are being prepared. Call [Get account deposit method](/rest-apis/core-api/accounts/get-account-deposit-method) to make sure the deposit method is ready (`status: ok`) before displaying instructions to the user.</Note>

Provide the **sort code**, **account number**, and **reference** to the user. Include the **beneficiary name**, **bank name**, and **bank address** to help the user confirm the legitimacy of the instructions.

<Info>Deposits sent without the reference are still credited, but funds will be deposited into the user's default GBP account.</Info>

## Monitor for the incoming transfer

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

* Webhook events (recommended):
  * [core.transaction.created](/rest-apis/core-api/transactions/webhooks/transaction-created)
    * `status: processing` → bank transfer received, pending posting
  * [core.transaction.status-changed](/rest-apis/core-api/transactions/webhooks/transaction-status-changed)
    * `status: completed` → funds settled
    * `status: failed` → irrecoverable error
* Polling (fallback): [Get transaction](/rest-apis/core-api/transactions/get-transaction)

## Sample transaction

In a successful FPS 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 GBP account if the transfer was sent without a reference, or the selected account doesn't exist anymore.

```json [expandable] theme={null}
{
  "transaction": {
    "id": "b1bbbc0f-dae2-4e94-9e6d-4b9d5a1f3c1f",
    "origin": {
      "asset": "GBP",
      "amount": "250.00",
      "node": {
        "type": "external-account",
        "id": "aa6e6efa-8d73-497c-8278-0347f459bd68",
        "ownerId": "e4ce04dc-67b7-4e9f-af91-482cb6f9fc4a"
      }
    },
    "destination": {
      "asset": "GBP",
      "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": "GBP",
      "amount": "250.00",
      "target": "origin"
    }
  }
}
```

The new external account can be then retrieved with [Get external account](/rest-apis/core-api/external-accounts/get-external-account) to show the sender's bank details alongside the transaction, or to withdraw funds to the same account in the future.

```json [expandable] theme={null}
{
  "externalAccount": {
    "id": "aa6e6efa-8d73-497c-8278-0347f459bd68",
    "ownerId": "e4ce04dc-67b7-4e9f-af91-482cb6f9fc4a",
    "type": "bank",
    "status": "ok",
    "label": "GBP Bank Account",
    "asset": "GBP",
    "network": "fps",
    "features": [
      "withdraw"
    ],
    "details": {
      "accountNumber": "12345678",
      "sortCode": "123456"
    },
    "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.

<Check>You now support FPS bank transfer deposits via the REST API.</Check>
