POST /employers/{employerId}/employees/{employeeId}/transfers

Initiate a pension transfer into Penfold for an employee. This requests the transfer of an existing pension pot from another provider into the employee's Penfold workplace pension.

The transfer will be submitted to the previous provider (via Origo where supported) and progress through standard transfer statuses.

Path parameters

  • employerId string(uuid) Required

    Penfold employer UUID

  • employeeId string Required

    Unique identifier for the employee

application/json

Body Required

  • providerName string Required

    Name of the pension provider the pot is being transferred from.

  • policyNumber string Required

    Policy or plan number at the previous provider.

  • estimatedAmountPence integer Required

    Estimated value of the pension pot in pence.

Responses

  • 201 application/json

    Transfer initiated successfully.

    Hide response attributes Show response attributes object
    • id string Required

      Unique identifier for the transfer.

    • reference string Required

      Penfold transfer reference (e.g. PEN76432-1).

    • providerName string Required

      Name of the previous pension provider.

    • policyNumber string Required

      Policy or plan number at the previous provider.

    • estimatedAmountPence integer Required

      Estimated value of the pension pot in pence.

    • finalAmountPence integer | null

      Actual amount received in pence. Null until funds arrive.

    • status string Required

      Simplified status of the transfer. Internally Penfold tracks ~25 granular statuses; these are collapsed here assuming most transfers follow the happy path. Rejected transfers will typically need to be resolved on the Penfold platform directly.

      • Requested: Transfer has been submitted
      • InProgress: Transfer is being processed with the previous provider
      • FundsReceived: Funds have arrived at Penfold
      • Complete: Funds invested in the employee's pension pot
      • Rejected: Previous provider rejected the transfer — resolve via Penfold platform
      • Cancelled: Transfer was cancelled

      Values are Requested, InProgress, FundsReceived, Complete, Rejected, or Cancelled.

    • rejectionReason string | null

      Reason the transfer was rejected (if applicable).

    • createdAt string(date-time) Required

      When the transfer was initiated (ISO 8601).

  • 400 application/json

    Request body failed validation

    Hide response attributes Show response attributes object
    • error string Required

      A descriptive error message.

    • validationErrors array[object]
      Hide validationErrors attributes Show validationErrors attributes object
      • field string Required

        The name of the field that failed validation.

      • message string Required

        A descriptive error message.

  • 401 application/json

    Missing or invalid authentication token

    Hide response attribute Show response attribute object
    • error string Required
  • 404 application/json

    Resource not found

    Hide response attribute Show response attribute object
    • error string Required
  • 500 application/json

    Internal server error

    Hide response attribute Show response attribute object
    • error string Required
POST /employers/{employerId}/employees/{employeeId}/transfers
curl \
 --request POST 'https://partner-api.getpenfold.com/v1/employers/{employerId}/employees/{employeeId}/transfers' \
 --header "Authorization: Bearer $ACCESS_TOKEN" \
 --header "Content-Type: application/json" \
 --data '{"policyNumber":"SW12345678","providerName":"Scottish Widows","estimatedAmountPence":2500000}'
Request example
{
  "policyNumber": "SW12345678",
  "providerName": "Scottish Widows",
  "estimatedAmountPence": 2500000
}
Response examples (201)
{
  "id": "t1a2b3c4-d5e6-7890-abcd-ef1234567890",
  "status": "Requested",
  "createdAt": "2025-03-15T14:30:00Z",
  "reference": "PEN76432-1",
  "policyNumber": "SW12345678",
  "providerName": "Scottish Widows",
  "estimatedAmountPence": 2500000
}
Response examples (400)
{
  "error": "validation failed",
  "validationErrors": [
    {
      "field": "companyNumber",
      "message": "companyNumber is required"
    },
    {
      "field": "primaryContactEmail",
      "message": "must be a valid email address"
    }
  ]
}
Response examples (401)
{
  "error": "unauthorized"
}
Response examples (404)
{
  "error": "not found"
}
Response examples (500)
{
  "error": "internal server error"
}