---
title: "Create ISA transfer"
method: POST
path: "/isa/transfers"
tags: ["ISA"]
---

# Create ISA transfer

`POST /isa/transfers`

## Request

- Base URL: `https://sandbox.upvest.co`
- URL: `https://sandbox.upvest.co/isa/transfers`
- Auth: OAuth 2 (client credentials, token URL `https://sandbox.upvest.co/auth/token`, scopes: `isa_transfers:admin`)

Creates an ISA transfer, moving all or part of an end user's existing ISA into an Upvest Stocks and Shares ISA while preserving their current-year allowance.

Set `transfer_type` to `ISA_EXTERNAL` for a transfer between ISA managers, which requires `counterparty`, or to `ISA_INTERNAL` for a transfer within the same ISA manager, which requires `transfer_value` and `details`. Only cash transfers are supported, so `transfer_method` must be `CASH`.

See the ISA transfers implementation guide ([TOL](https://docs.upvest.co/products/tol/guides/tax_wrappers/pension_de/tax_wrappers/pension_de_isa_transfers_implementation) / [BYOL](https://docs.upvest.co/products/byol/guides/tax_wrappers/pension_de/tax_wrappers/pension_de_isa_transfers_implementation)) for the required fields per transfer type.

## Headers

- `idempotency-key` string, uuid, required

## Request body

- object
  - `direction` 'INCOMING' | 'OUTGOING', required: Direction of the ISA transfer * INCOMING - Transfer is incoming to the user. * OUTGOING - Transfer is outgoing from the user.
  - `transfer_type` 'ISA_INTERNAL' | 'ISA_EXTERNAL', required: Type of the securities transfer * ISA_INTERNAL - Transfer occurs within the same ISA manager. * ISA_EXTERNAL - Transfer occurs across different ISA managers, via Equisoft or others.
  - `transfer_value` string: A positive cash amount, as a decimal string with up to two decimal places.
  - `currency` 'GBP', required: Alphabetic three-letter [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html) currency code. * GBP - Great British Pound
  - `transfer_method` 'CASH', required: Method of the ISA transfer * CASH - Cash transfer. Other methods can be supported in the future, e.g. IN_SPECIE
  - `user_id` string, uuid, required: Unique identifier of the user, as a UUID.
  - `account_group_id` string, uuid, required: Universally Unique Identifier (UUID) of the account group.
  - `reference` string: Random string reference on which API clients can build logic.
  - `counterparty` object: The other ISA manager involved in an external ISA transfer.
    - `account_number` string, required: The account number is composed of valid Swift charset with a max length of 28 if provided. The account number helps other brokers identify the owner of the assets.
  - `transfer_date` string, date-time, required: The date when end user initiated the transfer. Relevant for tax year's end reporting. If not sent it will be the time we create the transfer internally on our side. [RFC 3339-5](https://datatracker.ietf.org/doc/html/rfc3339#section-5.6), [ISO8601 UTC](https://www.iso.org/iso-8601-date-and-time-format.html)
  - `details` object: The subscription details of an internal ISA transfer, used to apportion the transfer against the current tax year's allowance.
    - `current_year_subscription` object, required: Details related to the current year’s subscription being transferred. Required if transfer_type is ISA_INTERNAL.
      - `transfer_amount` string, required: A positive cash amount, as a decimal string with up to two decimal places.
      - `first_subscription_at` string, date-time: The date of the first subscription made to the ISA in the current tax year. [RFC 3339-5](https://datatracker.ietf.org/doc/html/rfc3339#section-5.6), [ISO8601 UTC](https://www.iso.org/iso-8601-date-and-time-format.html) Required if transfer_type is ISA_INTERNAL.

## Response `200`

ISA Transfer created

- object
  - `id` string, uuid, required: The unique identifier of the ISA transfer, as a UUID.
  - `created_at` string, date-time, required: Date and time when the resource was created. [RFC 3339-5](https://datatracker.ietf.org/doc/html/rfc3339#section-5.6), [ISO8601 UTC](https://www.iso.org/iso-8601-date-and-time-format.html)
  - `updated_at` string, date-time, required: Date and time when the resource was last updated. [RFC 3339-5](https://datatracker.ietf.org/doc/html/rfc3339#section-5.6), [ISO8601 UTC](https://www.iso.org/iso-8601-date-and-time-format.html)
  - `direction` 'INCOMING' | 'OUTGOING', required: Direction of the ISA transfer * INCOMING - Transfer is incoming to the user. * OUTGOING - Transfer is outgoing from the user.
  - `status` 'NEW' | 'DISCOVERY' | 'DISCOVERY_CONFIRMED' | 'INSTRUCTED' | 'PROCESSING' | 'SETTLED', required: Status of the transfer * NEW - Transfer is created. * DISCOVERY - Discovery with the ceding provider where information about the transfer is being exchanged and reviewed. Only relevant if type ISA_EXTERNAL. * DISCOVERY_CONFIRMED - Discovery is completed and transfer request is accepted by the ceding provider. Only relevant if type ISA_EXTERNAL. * INSTRUCTED - Transfer is instructed to the ceding provider. * PROCESSING - Transfer instruction is confirmed by the ceding provider. Transfer is being processed. * SETTLED - Transfer is completed.
  - `transfer_type` 'ISA_INTERNAL' | 'ISA_EXTERNAL', required: Type of the securities transfer * ISA_INTERNAL - Transfer occurs within the same ISA manager. * ISA_EXTERNAL - Transfer occurs across different ISA managers, via Equisoft or others.
  - `transfer_value` string: A positive cash amount, as a decimal string with up to two decimal places.
  - `currency` 'GBP', required: Alphabetic three-letter [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html) currency code. * GBP - Great British Pound
  - `transfer_method` 'CASH', required: Method of the ISA transfer * CASH - Cash transfer. Other methods can be supported in the future, e.g. IN_SPECIE
  - `user_id` string, uuid, required: Unique identifier of the user, as a UUID.
  - `account_group_id` string, uuid, required: Universally Unique Identifier (UUID) of the account group.
  - `reference` string, required: Random string reference on which API clients can build logic.
  - `counterparty` object: The other ISA manager involved in an external ISA transfer.
    - `account_number` string, required: The account number is composed of valid Swift charset with a max length of 28 if provided. The account number helps other brokers identify the owner of the assets.
  - `transfer_date` string, date-time, required: The date when end user initiated the transfer. Relevant for tax year's end reporting. [RFC 3339-5](https://datatracker.ietf.org/doc/html/rfc3339#section-5.6), [ISO8601 UTC](https://www.iso.org/iso-8601-date-and-time-format.html)
  - `details` object: The subscription details of an internal ISA transfer, used to apportion the transfer against the current tax year's allowance.
    - `current_year_subscription` object, required: Details related to the current year’s subscription being transferred. Required if transfer_type is ISA_INTERNAL.
      - `transfer_amount` string, required: A positive cash amount, as a decimal string with up to two decimal places.
      - `first_subscription_at` string, date-time: The date of the first subscription made to the ISA in the current tax year. [RFC 3339-5](https://datatracker.ietf.org/doc/html/rfc3339#section-5.6), [ISO8601 UTC](https://www.iso.org/iso-8601-date-and-time-format.html) Required if transfer_type is ISA_INTERNAL.

## Other responses

- `400`: Bad Request. The incoming request had a malformed parameter/object.
- `401`: Unauthorized. The caller has not been authenticated.
- `403`: Forbidden. The caller has been authenticated but is not allowed to take the requested action.
- `404`: Not Found. The requested resource could not be found.
- `406`: Not Acceptable. The resource does not have a current representation that would be acceptable to the user agent. "Accept" header defined unsupported value.
- `429`: Too Many Requests. The caller has exceeded their quota for the time period and has been throttled.
- `500`: Internal Server Error. The service encountered an unexpected error.
- `503`: Service Unavailable. The service handling for this request cannot be reached at this time.
- `504`: Gateway Timeout. The service gateway has reached its internal timeout.

## Changes

- **2026-10-23** `ca69534b631d`: 2 info
  - api tag `ISA` added
  - api tag `ISA Transfers` removed

[Operation history](https://skmtc.dev/upvest/apis/upvest-investment-api/changes/isa/transfers/post.md)

---

[API](https://skmtc.dev/upvest/apis/upvest-investment-api.md) · [All operations](https://skmtc.dev/upvest/apis/upvest-investment-api/llms.txt) · [OpenAPI document](https://skmtc.dev/upvest/apis/upvest-investment-api/revisions/ca69534b631d?raw)
