Managing Recipients

List, filter, update and delete a corporation's recipients, and add or remove their payment details.

Before You Start

Read the following guides before proceeding:

GuideWhy
Getting StartedPlatform overview and setup
Api BasicsRequired headers and request configuration
AuthenticationHow to obtain the corporation token
Creating a RecipientPayment details fields and their formats

Overview

Recipients belong to the corporation, not to the employee who created them. Every employee with a
corporation token can read them; changing them requires TransactionManage or TransactionSu.

OperationPermission
List, filter, read oneNone — any authenticated employee
Create, update, delete a recipientTransactionSu, TransactionManage
Create, update, delete payment detailsTransactionSu, TransactionManage
Increment usageTransactionSu, TransactionCreate, TransactionManage

List Recipients

GET /api/v1/recipients

Query parameters:

ParameterDescription
page_number1-indexed page number
page_sizePage size. Defaults to 25
sortname for ascending name order (default), or usage for descending usage count

Response:

{
  "data": [
    {
      "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "personal_info": {
        "first_name": "Alex",
        "last_name": "Grey",
        "is_business": false,
        "nick_name": ""
      },
      "payment_details": [
        {
          "id": "64120850-73a1-4df5-a074-d463258c9deb",
          "type": "Sepa",
          "currencies": ["EUR"],
          "sepa": { "iban": "DE89370400440532013000", "bic": "COBADEFF" }
        }
      ]
    }
  ]
}
FieldDescription
data[].idRecipient id
data[].personal_infoStored identity
data[].payment_details[]One entry per rail. id is recipient_payment_details_id on a corridor transfer
data[].name_checkPresent on the create and update responses; absent from list responses

Filters

Four filter endpoints, each returning the same shape as the list. All take the same pagination and
sort parameters.

EndpointRequired parameterSelects
GET /api/v1/recipients/filter/namenameRecipients whose full name contains the substring
GET /api/v1/recipients/filter/catalogcatalog_indexRecipients whose full name starts with that letter. A single letter, ^[a-zA-Z]$
GET /api/v1/recipients/filter/currencycurrencyRecipients with details accepting that currency
GET /api/v1/recipients/filter/typetypeRecipients holding details of that type

type accepts Crypto, Sepa, FasterPayment, Ach, Swift, Spei, Card, Pix, FpsHk,
Imps, Instapay, BiFast, Nip, Ipp, Pse.

The filters are not combinable — each takes exactly one criterion. To filter on two dimensions, filter
on the more selective one and narrow the result client-side.


Read One Recipient

GET /api/v1/recipients/{recipientId}

Path parameters:

ParameterDescription
{recipientId}Recipient id

Returns a single recipient in the same shape as one data[] entry.


Update the Identity

PUT /api/v2/recipients/{recipientId}

Requires TransactionSu or TransactionManage. Takes the same body as
POST /api/v2/recipients — identity fields plus a type and its details object — and updates both in
one call.

PUT /api/v1/recipients/{recipientId}

Updates the identity only:

{
  "first_name": "Alex",
  "last_name": "Grey",
  "is_business": false,
  "nick_name": "Alex — EUR"
}
FieldTypeRequiredDescription
is_businessbooleanYestrue for a company, false for a person
first_namestringConditionalRequired when is_business is false
last_namestringConditionalRequired when is_business is false
company_namestringConditionalRequired when is_business is true
nick_namestringNoAt most 127 characters

Add Payment Details

POST /api/v1/recipients/{recipientId}/payment_details

Requires TransactionSu or TransactionManage. Use this to add a second rail to an existing
recipient.

Request body:

{
  "type": "FasterPayment",
  "currencies": ["GBP"],
  "faster_payments": {
    "account_number": "12345678",
    "sort_code": "123456"
  }
}
FieldTypeRequiredDescription
typestringYesThe rail these details cover
currenciesarray of stringYesCurrencies these details accept
<type object>objectYesThe details object matching type

Response:

Returns the created payment details, including their id.

Field names and formats are identical to
Creating a Recipient — including faster_payments on the way in and
faster_payment on the way out.


Update Payment Details

PUT /api/v1/recipients/{recipientId}/payment_details/{paymentDetailsId}

Requires TransactionSu or TransactionManage.

Path parameters:

ParameterDescription
{recipientId}Recipient id
{paymentDetailsId}payment_details[].id from the recipient

Takes the same body as the create-details call and replaces the details.


Delete Payment Details

DELETE /api/v1/recipients/{recipientId}/payment_details/{paymentDetailsId}

Requires TransactionSu or TransactionManage.

Response:

{}

Removes one rail from the recipient, leaving the recipient itself in place.


Delete a Recipient

DELETE /api/v1/recipients/{recipientId}

Requires TransactionSu or TransactionManage.

Response:

{}

Deleting a recipient invalidates every recipient_id reference to it. A corridor estimate naming a
deleted recipient fails with Recipient not found or does not belong to you — the same error a
foreign recipient produces.


Increment Usage

POST /api/v1/recipients/{recipientId}/usage

Requires TransactionSu, TransactionCreate or TransactionManage.

Response:

{}

Increments the recipient's usage counter, which is what sort=usage orders by. The API does not
increment it automatically — a transfer to a recipient does not change its usage count. Call this after
a successful payout if you want most-recently-used ordering to reflect real activity.


Code

// Add a second rail to an existing recipient
const response = await fetch(`${baseUrl}/api/v1/recipients/${recipientId}/payment_details`, {
  method: 'POST',
  headers: {
    'Authorization': `Bearer ${corporationToken}`,
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    type: 'FasterPayment',
    currencies: ['GBP'],
    faster_payments: { account_number: '12345678', sort_code: '123456' }
  })
});
const details = await response.json();
# Add a second rail to an existing recipient
response = requests.post(
    f"{base_url}/api/v1/recipients/{recipient_id}/payment_details",
    headers={
        "Authorization": f"Bearer {corporation_token}",
        "Content-Type": "application/json",
    },
    json={
        "type": "FasterPayment",
        "currencies": ["GBP"],
        "faster_payments": {"account_number": "12345678", "sort_code": "123456"},
    },
)
details = response.json()
// Add a second rail to an existing recipient
body, _ := json.Marshal(map[string]interface{}{
    "type":       "FasterPayment",
    "currencies": []string{"GBP"},
    "faster_payments": map[string]string{
        "account_number": "12345678",
        "sort_code":      "123456",
    },
})

req, _ := http.NewRequest("POST", baseURL+"/api/v1/recipients/"+recipientId+"/payment_details", bytes.NewBuffer(body))
req.Header.Set("Authorization", "Bearer "+corporationToken)
req.Header.Set("Content-Type", "application/json")

resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()

Webhooks

Endpoint: POST {your_webhook_base_url}/v2/webhooks/recipients

Delivered when a recipient is created or updated. See Webhooks.


Error Handling

{
  "error_reason": "ErrorInvalidField",
  "error_description": "Invalid format for catalog index",
  "error_category": {
    "category": "CategoryValidationFailure",
    "http_status_code": 400
  },
  "error_details": [
    { "key": "field", "details": "catalog_index" }
  ]
}

Validation Errors (400)

Error ReasonError DetailsDescriptionResolution
ErrorMissingFieldfield: catalog_indexThe filter requires the parameterSend a single letter
ErrorInvalidFieldfield: catalog_indexNot a single letter^[a-zA-Z]$
ErrorMissingFieldfield: currencyThe currency filter requires itSend a currency code
ErrorMissingFieldfield: nameThe name filter requires itSend a substring
ErrorInvalidFieldfield: typeUnrecognised details typeUse a value from the type list
ErrorInvalidFieldfield: recipient_idNot a UUIDSend the recipient's id

Permission Errors (403)

Error ReasonDescriptionResolution
ErrorPermissionDeniedUser does not have required permissionsWrites need TransactionManage or TransactionSu

Server Errors (500)

Error ReasonDescriptionResolution
ErrorGeneralRecipient lookup failureThe recipient does not exist, or belongs to another corporation
ErrorGeneralPayment details failureThe details id does not belong to that recipient

Did this page help you?