Create a payment on a mandate

Create a payment within the constraints of a VRP or on a Direct Debit mandate.

After you have created a payment mandate and your user has authorised it, you can create a payment on the mandate. Once you create the payment, you can track and monitor it in the same way as a non-recurring payment.

As your user has authorised a mandate, the flow for a payment on a mandate differs from a non-recurring payment. After payment creation, there's no authorisation required, so it executes immediately.

1. Authenticate a payment on a mandate

To create a payment on a mandate, you must authenticate your request. This ensures only you can create payments on the mandate. Authentication requires you to:

  • Generate an access_token with the following scopes:
    • payments
    • recurring_payments:sweeping , if you are creating a sweeping VRP mandate
  • Generate public and private keys and set up request signing for the Tl-Signature header
  • Include an Idempotency-Key header to safely retry requests without creating duplicate payments

2. Configure a payment on a mandate

To create a payment on a VRP mandate, you must make a POST request to the /v3/payments endpoint with the details of the payment.

A payment on a mandate must include the following fields:

  • payment_method.type - Must be mandate
  • payment_method.mandate_id - A UUID which corresponds to the authorised mandate
  • amount_in_minor - The payment amount in minor units (eg pence for GBP)
  • currency - The currency the payment should be made in: either GBP or EUR
  • reference - A reference for the payment

Additional parameters for wave 1 VRP

When you create a payment on a wave 1 VRP mandate, you must also state whether the user is present for the payment using the user_interaction field inside the payment_method. Do this using the present or not_present values.

Examples of payments where the user is not_present include utility bill payments which get taken automatically out of a user’s account.

Examples of payments where the user is present include ‘topping up’ a utility bill account, where the user chooses to pay a specific amount within the constraints of a mandate which has already been set up.

Below are examples of sweeping and wave 1 VRP.

curl --request POST \
  --url https://api.truelayer-sandbox.com/v3/payments \
  --header 'Content-Type: application/json' \
  --header 'Idempotency-Key: <UUID>' \
  --header 'Tl-Signature: <SIGNATURE>' \
  --header 'Authorization: Bearer <ACCESS_TOKEN>' \
  --data '{
  "payment_method": {
    "type": "mandate",
    "mandate_id": "e98927aa-6d67-43ee-973a-4666bfa68cc7",
    "user_interaction": "not_present"
  },
  "amount_in_minor": 12500,
  "currency": "GBP",
  "reference": "UTIL-MAR-2026"
}'
curl --request POST \
  --url https://api.truelayer-sandbox.com/v3/payments \
  --header 'Content-Type: application/json' \
  --header 'Idempotency-Key: <UUID>' \
  --header 'Tl-Signature: <SIGNATURE>' \
  --header 'Authorization: Bearer <ACCESS_TOKEN>' \
  --data '{
  "payment_method": {
    "type": "mandate",
    "mandate_id": "a12345bc-6d67-43ee-973a-4666bfa68cc7"
  },
  "amount_in_minor": 50000,
  "currency": "GBP",
  "reference": "savings-transfer"
}'

3. Execute the payment

Once you create a payment on an authorised mandate, it executes immediately without requiring further user authorisation. The payment will:

  1. Validate against the mandate's constraints (amount limits, valid dates, periodic limits)
  2. Execute immediately if within constraints
  3. Fail if outside mandate constraints or if mandate is invalid/revoked

4. Monitor the payment

You can track and monitor payments on a mandate in the same way as non-recurring payments:

  • Set up webhooks to receive real-time payment status updates
  • Use GET /v3/payments/{id} to retrieve payment details
  • Optionally, you can check the payment status in Console