Make a payout to your business account

Make a secure payout to a preconfigured business account.

When you onboard with TrueLayer, you can link your merchant account to an existing business bank account. Once you have done this, there is a specific type of payout you can make which can only be sent to the linked business account.

Business account payouts are useful for withdrawing funds from your merchant account. As they can only be made to a single predefined account, they reduce the change of human error.

Business account payouts are useful for withdrawing funds from your merchant account. As they can only be made to a single predefined account, they reduce the chance of human error.

📘

Sweeping in Console

Instead of making multiple manual payouts to your business account, you can set up regular payments from your merchant account to your business account from the merchant account dashboard in Console. Alternatively, you canConfigure merchant account sweeping.

Business account payout overview

  1. Authentication: Properly configure authentication before your request. This means you need a suitable access_token and headers for your request.
  2. Request configuration: Provide information including the value of the payout, the bank details of the beneficiary of the payout and metadata.
  3. Monitoring: Set up webhooks for your payout so that you can track its progress and confirm its success.

1. Authenticate your business account payout

Before you can make an business account payout, you must secure your requests.

1.1 Generate an access_token

You must include an access_token with the payments scope in order to make a business account payout. This should be included as a Bearer header along with your payout request.

1.2 Include headers for signing and idempotency

All requests to the Payments API v3, including payouts, should include a valid Tl-Signature header for security purposes. Learn how to sign your requests.

To help with payment signatures, try our signing libraries.

It's also important that your requests include a valid Idempotency-Key header. This should be a unique key, and enables you to run your request multiple times without duplicating it.

2. Configure your business account payout

After setting up your access_token and headers, you're ready to configure and create your business account payout request.

To create a payout, send a POST request to the /payouts endpoint.

2.1 Request parameters

The table below contains an overview of all the parameters you need to specify to initiate a business account payout.

ParameterDescription
merchant_account_idThe unique id of the merchant account to make the business account payout from.
amount_in_minorThe value of the payout in a minor denomination.

A minor denomination is the smallest unit of the specified currency, so 1 is equivalent to a penny or a cent.
currencyThe currency of the payment, provided as a 3-letter ISO 4217 currency code. For example, GBP for pounds, or EUR for euros.

The currency of your linked business account must match your merchant account.
beneficiary.typeThis must be set to business_account for a business account payout.
beneficiary.referenceA reference for the payout.

You see this reference alongside this payout on your statement or banking app.
metadataThis parameter is optional.

You can include up to 10 key-value pairs in this object. This is typically used to attach metadata that helps you reconcile your payout.

2.2 Merchant account id

Include the id of the merchant account you want to pay out from in your request. You include it in the merchant_account_id parameter. This ensures that you make the payout from the correct account.

The business account you want to pay must be linked to this merchant account.

You can get the id to use in merchant_account_id through two methods:

This is an example of the merchant_account_id parameter filled out correctly:

{  
	"merchant_account_id": "2a485b0a-a29c-4aa2-bcef-b34d0f6f8d51",  
//...  
}

2.3 Payout amount and currency

When you make a business account payout, you must specify the value and currency of the payout.

To specify the value of your payout, provide a numeric value for the amount_in_minor parameter. This should be the value of your payout in a minor denomination. This means that a value of 1500 corresponds to 15 GBP or 15 EUR.

To specify the currency of your payout, provide a three-letter ISO 4217 currency code for the currency parameter. For example:

  • GBP for pounds sterling
  • EUR for euros.

This an example of the amount_in_minor and currency parameters filled out correctly:

{
//...
	"amount_in_minor": 1500,
	"currency": "GBP",
//...
}

2.4 Payout scheme selection

You can select a payment scheme for your payout to be made through by using the scheme_selection object. Unlike creating a payment, the scheme_selection object for payouts is not contained within a provider selection object.

There are three different values that you can set for scheme selection:

instant_preferred

Preferably selects a payment scheme that supports instant payments for the currency and geography that you're making the payment in. However, the API will fall back to a non-instant scheme if instant payments are unavailable. The payout_executed webhook will specify the actual scheme used. This is optimal when you don't mind if a payout settles slowly, and can help you avoid fees and payment failures.

instant_only

Automatically selects a payment scheme that supports instant payments for the currency and geography that you're making the payment in. This type is optimal when you need payments to settle quickly.

preselected

Selects a payment scheme compatible with the currency of the payment and geographic region that you are paying in. This is useful if you want full control over the scheme that a payout goes through.

When you use a preselected scheme, you need to specify a scheme_id. Ensure that your scheme ID is compatible with the currency that you are using. Possible scheme IDs are:

  • faster_payments_service
  • sepa_credit_transfer_instant
  • sepa_credit_transfer

See this code block for examples of each scheme selection type.

{
  //[...]
	"scheme_selection": {
		"type" : "instant_preferred"
	}
}
{
  //[...]
	"scheme_selection": {
		"type" : "instant_only"
	}
}
{
  //[...]
	"scheme_selection": {
		"type" : "preselected",
		"scheme_id": "polish_domestic_express"
	}
}

We recommend using instant_preferred or instant_only for the best user experience.

<€100,000 payouts

Payouts that are €100,000 or over automatically move through the SEPA Credit scheme.

The payout appears as normal in the payments view on Console, with SEPA Credit displayed as the scheme.

Do not use the instant_only scheme selection object for these payments, as they will immediately fail.

2.5 Beneficiary details

For a business account payout, the beneficiary object is simpler than for other types of payout. You need to provide values for two parameters: type and reference. This is because the account being paid can only be the business account linked to the merchant account the payout is from.

2.5.1 type parameter

In a business account payout, you must use a value of business_account for the type parameter.

You can use a value of payment_source or external_account for a closed-loop payout or open-loop payout respectively.

2.5.2 reference parameter

Include a string for the reference parameter in your payout. This reference appears alongside the payout in your statement or banking app.

A common approach to take is to programmatically generate a reference that starts with a string that identifies your business. Then attach a number to it, which you and your user can use to reconcile the payout if needed.

We recommend that you keep your reference under 18 characters, and include no special characters other than - or ..

2.6 Optional metadata

You don't need to include any values for the metadata object. However, if your business needs to include extra metadata in your payout requests (for internal processes for example), you can choose to include up to 10 key value pairs.

To include metadata, provide key value pairs in the object in the format below:

{
//...
  "metadata": {
    "Metadata_key_1": "Metadata_value_1",
    "Metadata_key_2": "Metadata_value_2",
    "Metadata_key_3": "Metadata_value_3"
  }
}

Business account payout example request

When you specify the mandatory parameters above in your request, you can initiate a business account payout.

The code block below contains an example of a business account payout request:

POST /v3/payouts HTTP/1.1
Content-Type: application/json
Idempotency-Key: {RANDOM_UUID}
Tl-Signature:{SIGNATURE}
Authorization: Bearer {ACCESS_TOKEN}
Host: api.truelayer-sandbox.com

{
	"merchant_account_id": "2a485b0a-a29c-4aa2-bcef-b34d0f6f8d51",
	"amount_in_minor": 1,
	"currency": "GBP",
	"beneficiary": {
		"type": "business_account",
		"reference": "ma-withdrawal-172",
		},
	}
}

Below is an example of the response to a successful request, including the payout id:

{  
  "id": "769bd377-dc7f-4e55-a04b-848f2dcb42ec"  
}

3. Monitor your business account payout

When you make a successful business account payout, you receive a response that contains the payout id only:

{
	"id": "393c24a8-bfae-47b8-884d-66534bf3f6fd"
}

You also receive a webhook when you make payout is executed, which contains extra information.

You can use the id and webhook you receive to confirm whether your payout was successful, and take action if needed.

Payout webhooks

We recommend that you use webhooks to monitor all of the requests you make with the Payments API v3. You receive webhooks for all events in your integration.

Webhooks for your integration are sent to the Webhook URI you have set on the Payments > Settings page in Console. You should ensure that you have set up request signing for your webhook notifications to ensure that they are reliable and not from external sources.

The two webhooks that you receive for a business account payout are payout_executed or payout_failed. You should receive these very soon after your payout request.

This is an example of a payout_executed webhook for a business account payout:

{
  "type": "payout_executed",
  "event_id": "66eb019a-f103-4c0f-ae2e-c4a9f3bcb82d",
  "event_version": 1,
  "payout_id": "796cab79-cd1a-4e01-8241-93ac28bf4260",
  "executed_at": "2024-01-17T12:09:54.117Z",
  "beneficiary": {
    "type": "business_account"
  },
  "scheme_id": "internal_transfer"
}
{
  "type": "payout_failed",
  "event_id": "24089aed-4fd4-9e13-f8b2-f458f30c836c",
  "event_version": 1,
  "payout_id": "0a495e9f-2f41-4669-ba33-85407c0b26cb",
  "failed_at": "2024-01-12T14:56:05.117850644Z",
  "failure_reason": "insufficient_funds",
  "beneficiary": {
    "type": "business_account"
  },
}

GET payouts endpoint

You can use the payout id you received when you made the payout to get information about it.

To do so, make a POST request to the /v3/payouts/{id} endpoint, including the payout id as a path parameter.

You receive a response in this format:

{
  "id": "0cd1b0f7-71bc-4d24-b209-95259dadcc20",
  "merchant_account_id": "AB8FA060-3F1B-4AE8-9692-4AA3131020D0",
  "amount_in_minor": 0,
  "currency": "GBP",
  "beneficiary": {
    "type": "business_account",
    "reference": "string",
  },
  "metadata": {
    "prop1": "value1",
    "prop2": "value2"
  },
  "scheme_id": "faster_payments_service",
  "status": "pending",
  "created_at": "string"
}

The status object is especially important, as you can use this to check the progression of your payout through its lifecycle.

Payout lifecycle

After you create a payout, it moves through a series of different states depending on its outcome. See the full list of payout statuses for more information.

This is the journey a payout usually follows:

  1. When a payout is first made, it has a status of pending before authorisation starts.
  2. After the payout has been authorised, it has a status of authorized.
    It usually takes just a few seconds for a successful payout to transition through the pending and authorized statuses.
  3. Depending on whether the payment scheme executes the payout, it transitions to one of two statuses:
    1. payout_executed if the payout was successful.
    2. payout_failed if the payout could not be executed.

If a payout fails, the webhook contains a failure_reason that you can use to identify why it failed.

A return occurs when a payout or refund is executed, but rejected by a banking provider. The money moves back to your merchant account.

The reasons for a return are decided by banks. For example, if the account you're attempting to pay has been closed by the bank, or is under investigation.

This occurs in less than 0.01% of payouts, but you must make sure that your system can handle a payout transitioning from executed to failed.