Skip to content

ISA transfer webhooks

Throughout the ISA transfer lifecycle, Upvest sends webhook events to notify you of progress at each stage. Monitor these webhooks to track transfer discovery, instruction submission, processing, and settlement completion.

Transfer events

The ISA_TRANSFER.* event type notifies you of changes to an ISA transfer's lifecycle.

EventTriggerWhen It Fires
ISA_TRANSFER.NEWISA transfer is initiated.Immediately when POST /account_transfers completes successfully.
ISA_TRANSFER.DISCOVERYDiscovery phase begins.When the ceding provider receives and acknowledges the transfer request (external transfers only).
ISA_TRANSFER.DISCOVERY_CONFIRMEDDiscovery phase completes.When the ceding provider confirms transfer details and accepts the transfer (external transfers only).
ISA_TRANSFER.INSTRUCTEDTransfer instruction sent.When the transfer instruction is prepared and sent to the ceding provider.
ISA_TRANSFER.PROCESSINGTransfer is processing.When the ceding provider confirms receipt and begins processing the transfer.
ISA_TRANSFER.SETTLEDTransfer settlement complete.When the transfer is complete and funds have been received.

Lifecycle stages

ISA transfers follow distinct phases depending on transfer type (internal or external):

Internal transfers (within Upvest platform)

NEW → INSTRUCTED → PROCESSING → SETTLED
  • NEW: Transfer request received
  • INSTRUCTED: Transfer instruction processed
  • PROCESSING: Transfer execution in progress
  • SETTLED: Transfer complete

External transfers (from external provider)

NEW → DISCOVERY → DISCOVERY_CONFIRMED → INSTRUCTED → PROCESSING → SETTLED
  • NEW: Transfer request received
  • DISCOVERY: Discovery phase started with ceding provider
  • DISCOVERY_CONFIRMED: Ceding provider accepts transfer
  • INSTRUCTED: Transfer instruction sent to ceding provider
  • PROCESSING: Ceding provider processing the transfer
  • SETTLED: Transfer complete and funds received

Note: DISCOVERY and DISCOVERY_CONFIRMED phases are only relevant for external transfers. Internal transfers skip directly from NEW to INSTRUCTED.

Example webhook payloads

Transfer initiated event

When an ISA transfer is initiated, you receive an ISA_TRANSFER.NEW event:

{
  "id": "evt-isa-transfer-new-001",
  "created_at": "2024-03-01T09:00:00Z",
  "type": "ISA_TRANSFER.NEW",
  "object": {
    "id": "at-isa-001",
    "created_at": "2024-03-01T09:00:00Z",
    "updated_at": "2024-03-01T09:00:00Z",
    "type": "ACCOUNT_TRANSFER",
    "transfer_type": "ISA_TRANSFER",
    "direction": "INCOMING",
    "source_account_id": null,
    "destination_account_id": "acc-isa-001",
    "amount": 25000.00,
    "currency": "GBP",
    "status": "NEW",
    "external_transfer": true,
    "source_provider": "Old Brokerage Ltd"
  },
  "webhook_id": "wh-isa-transfer-new-001"
}

Discovery phase event

When a ceding provider acknowledges an external transfer and discovery begins, you receive an ISA_TRANSFER.DISCOVERY event:

{
  "id": "evt-isa-transfer-discovery-001",
  "created_at": "2024-03-03T14:30:00Z",
  "type": "ISA_TRANSFER.DISCOVERY",
  "object": {
    "id": "at-isa-001",
    "created_at": "2024-03-01T09:00:00Z",
    "updated_at": "2024-03-03T14:30:00Z",
    "type": "ACCOUNT_TRANSFER",
    "transfer_type": "ISA_TRANSFER",
    "direction": "INCOMING",
    "destination_account_id": "acc-isa-001",
    "amount": 25000.00,
    "currency": "GBP",
    "status": "DISCOVERY",
    "external_transfer": true,
    "source_provider": "Old Brokerage Ltd"
  },
  "webhook_id": "wh-isa-transfer-discovery-001"
}

Discovery confirmed event

When the ceding provider confirms they accept the transfer, you receive an ISA_TRANSFER.DISCOVERY_CONFIRMED event:

{
  "id": "evt-isa-transfer-discovery-confirmed-001",
  "created_at": "2024-03-05T10:00:00Z",
  "type": "ISA_TRANSFER.DISCOVERY_CONFIRMED",
  "object": {
    "id": "at-isa-001",
    "created_at": "2024-03-01T09:00:00Z",
    "updated_at": "2024-03-05T10:00:00Z",
    "type": "ACCOUNT_TRANSFER",
    "transfer_type": "ISA_TRANSFER",
    "direction": "INCOMING",
    "destination_account_id": "acc-isa-001",
    "amount": 25000.00,
    "currency": "GBP",
    "status": "DISCOVERY_CONFIRMED",
    "external_transfer": true,
    "source_provider": "Old Brokerage Ltd"
  },
  "webhook_id": "wh-isa-transfer-discovery-confirmed-001"
}

Transfer settled event

When an ISA transfer completes and settlement is confirmed, you receive an ISA_TRANSFER.SETTLED event:

{
  "id": "evt-isa-transfer-settled-001",
  "created_at": "2024-03-15T16:00:00Z",
  "type": "ISA_TRANSFER.SETTLED",
  "object": {
    "id": "at-isa-001",
    "created_at": "2024-03-01T09:00:00Z",
    "updated_at": "2024-03-15T16:00:00Z",
    "type": "ACCOUNT_TRANSFER",
    "transfer_type": "ISA_TRANSFER",
    "direction": "INCOMING",
    "destination_account_id": "acc-isa-001",
    "amount": 25000.00,
    "currency": "GBP",
    "status": "SETTLED",
    "external_transfer": true,
    "source_provider": "Old Brokerage Ltd",
    "settlement_date": "2024-03-15"
  },
  "webhook_id": "wh-isa-transfer-settled-001"
}

Use webhooks to track ISA transfer progress automatically:

1

Set up webhook listener

Configure your webhook endpoint to listen for ISA transfer events. See Implementing webhooks for setup instructions.

Subscribe to ISA_TRANSFER.* events.

2

Initiate a transfer

Create an ISA transfer via POST /account_transfers. You receive an ISA_TRANSFER.NEW event immediately.

3

Monitor discovery phase (external transfers)

For external transfers, wait for ISA_TRANSFER.DISCOVERY and then ISA_TRANSFER.DISCOVERY_CONFIRMED events. Internal transfers skip this phase.

4

Monitor instruction phase

Wait for the ISA_TRANSFER.INSTRUCTED webhook event indicating the transfer instruction was sent to the ceding provider.

5

Monitor processing phase

Monitor for the ISA_TRANSFER.PROCESSING webhook event indicating the ceding provider has begun processing the transfer.

6

Wait for settlement

Monitor for the ISA_TRANSFER.SETTLED webhook event indicating settlement is complete. Do not poll the transfer status endpoint; wait for the webhook instead.

7

Update user interface

Use the webhook stream to update your application's transfer status display in real time. Once ISA_TRANSFER.SETTLED is received, confirm successful transfer completion to the user.