Skip to content

ISA transfers webhooks

Throughout the ISA transfer lifecycle, Upvest sends webhook events to notify you of progress. There is no endpoint to read a transfer back, so webhooks are the only way to observe a transfer after you create it.

Transfer events

The ISA_TRANSFER.* event types notify you of changes to an ISA transfer's lifecycle.

EventWhen it fires
ISA_TRANSFER.NEWImmediately after POST /isa/transfers completes successfully.
ISA_TRANSFER.PROCESSINGWhen Upvest starts processing the transfer.
ISA_TRANSFER.SETTLEDWhen the transfer is complete, the cash has been credited, and any current year subscription has been applied to the allowance.
ISA_TRANSFER.CANCELLEDWhen the transfer is cancelled. No funds move.

Every payload uses the standard event envelope — id, created_at, type, object, and webhook_id — where object is the ISA transfer in its new state. The object.status always matches the event type.

Lifecycle

NEW → PROCESSING → SETTLED
 │         │
 └─────────┴─────► CANCELLED

SETTLED and CANCELLED are terminal. For what each status means, see Transfer lifecycle.

Example webhook payload

The example below shows an ISA_TRANSFER.NEW event. The PROCESSING, SETTLED, and CANCELLED events have the same shape, with type and object.status set to the matching value and object.updated_at moved on.

{
  "id": "b1084bce-ca4a-4fed-9a8c-70919be40d8b",
  "created_at": "2024-01-22T14:10:00.00Z",
  "type": "ISA_TRANSFER.NEW",
  "object": {
    "id": "3a4b1383-11b3-4987-9f6f-593ae0991c1d",
    "created_at": "2025-11-09T14:10:00.00Z",
    "updated_at": "2025-11-09T14:10:00.00Z",
    "status": "NEW",
    "direction": "INCOMING",
    "type": "NO_ISA_MANAGER_CHANGE",
    "method": "CASH",
    "user_id": "4b2e2e64-7544-4c3f-a98d-dfdc03d487aa",
    "account_group_id": "79e9f9a2-dd29-4b54-9cca-b4c31956beb3",
    "cash_amount": "10000.00",
    "currency": "GBP",
    "counterparty": {
      "account_number": "5WJSZB3C8"
    },
    "current_year_subscription": {
      "tax_year": "2025/2026",
      "cash_amount": "3000.00",
      "first_subscription_at": "2025-09-14T12:10:00.00Z"
    }
  },
  "webhook_id": "106d3f64-f26b-457c-acb7-aef05f239d79"
}
1

Set up a webhook listener

Configure your webhook endpoint and subscribe to the ISA_TRANSFER event category. For setup instructions, refer to Implementing webhooks.

2

Create a transfer

Create the transfer with POST /isa/transfers. You receive an ISA_TRANSFER.NEW event immediately.

3

Track processing

Handle ISA_TRANSFER.PROCESSING to show the end user that the transfer is underway.

4

Handle settlement

On ISA_TRANSFER.SETTLED, confirm completion to the end user. Expect two further events for the same transfer: a CASH_TRANSACTION.EXECUTED event for the credited cash, with object.type set to ISA_TRANSFER, and — where the transfer included a current year subscription — an ISA_WRAPPER_ALLOWANCE.UPDATED event for the receiving wrapper.

5

Handle cancellation

On ISA_TRANSFER.CANCELLED, release any pending state in your application. No cash is credited and the end user's allowance is unchanged.