Different direct API integration flows

A direct API integration differs if provider selection or additional input is necessary.

The required steps, and therefore actions you need to complete, for payment or mandate authorisation depend on whether:

  • The payment has the provider selection method user_selected.
  • The authorisation requires additional input, such as branch code in Germany.

The possible combinations of these scenarios mean there are four possible flows:

1. UK payment with a preselected provider

In this case, you must complete the redirect action.

2. EU payment with a preselected provider

In this case, you must complete the form and then redirect action if additional input is needed (although embedded flows don't need the redirect action).

If no additional input is needed, then you must complete the redirect action only.

3. UK payment with a user selected provider

In this case, you must complete the provider_selection then redirect actions.

4. EU payment with a user selected provider

In this case, you must complete the provider_selection action, followed by the form and then redirect action if additional input is needed (although embedded flows don't need the redirect action).

If no additional input is needed, then you must complete the provider_selection and then redirect actions only.

Direct API integration notes

Your direct API integration should have logic and UIs to handle the flows required for the payment or mandate types you plan to receive. When developing your integration you should note:

  • The examples on this page are illustrative and don't include any headers such as the access_token, Tl-Signature or Idempotency-Key.
  • A payment can still have a provider selection type of preselected even if users select a provider through a provider selection screen. However, in this case, the user must select a provider before the payment and you must provide the provider_id at payment creation.
    An alternative scenario is if a user has already made a payment. In this case, you can provide an option for them to pay with the same method they used previously. Then, you can create a preselected payment which uses the same provider_id as their previous payment.
  • If you are developing an integration flow for a provider that requires embedded authorisation (for example, German banks), you do not need to complete the redirect action after completing the form action.

πŸ“˜

Payments and mandate differences

The actions you need to complete to authorise a payment or mandate are very similar. The main difference is that the endpoints start with /payments or /mandates repesctively.

The examples on this page refer to the /payments endpoints, but you can substitute the path parameter with /mandates if needed.

UK preselected provider flow

In this flow, you create a payment or mandate with a value of preselected for the provider_selection.type object, and provide a provider ID. In most cases, you would develop a UI for the user to select this before payment creation.

The provider has already been selected, and UK providers do not require additional input. This means the only required steps are for you to start the authorisation flow and then complete the redirect action. The redirect takes the user to their bank so they can authorise the payment.

To integrate this flow:

  1. Develop a UI that enables users to initiate a payment with a specific UK provider, and then create a payment with the provider ID included.
    For example, this could include a provider selection screen before payment creation.

  2. Send a POST request with the payment id to the /payments/{id}/authorization-flow endpoint.
    The response states the next action is redirect and contains the redirect uri which you set in Console.

  3. Redirect the user to the redirect uri so they can authorise their payment through the provider.

In this flow, you can enable the user to authorise the payment and be redirected in a single action as the provider is already selected.

UK preselected request body and response

Use the tabs in this code block to see examples of:

{
    "amount_in_minor": 1,
    "currency": "GBP",
    "payment_method": {
        "type": "bank_transfer",
        "provider_selection": {
            "type": "preselected",
            "provider_id": "mock-payments-gb-redirect",
            "scheme_id": "faster_payments_service"
        },
        "beneficiary": {
            "type": "merchant_account",
            "account_holder_name": "Merchant Account name",
            "merchant_account_id": "2a485b0a-a29c-4aa2-bcef-b34d0f6f8d51"
        }
    },
    "user": {
        "id": "57e9ae89-01fd-4779-8775-5b7de9a85a64",
        "name": "test user",
        "email": "[email protected]",
        "phone": "+441234567890"
    }
}
{
  "provider_selection": {},
    "redirect": {
    "return_uri": "https://console.truelayer.com/redirect-page"
  }
}
{
  "status": "authorizing",
  "authorization_flow": {
    "actions": {
      "next": {
        "type": "redirect",
        "uri": "https://pay-mock-connect.truelayer-sandbox.com/login/cf235b86-d633-42e5-9981-405723197ac5#token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJjZjIzNWI4Ni1kNjMzLTQyZTUtOTk4MS00MDU3MjMxOTdhYzUiLCJzY29wZSI6InBheS1tb2NrLWNvbm5lY3QtYXBpIiwibmJmIjoxNjc4ODg4MDE2LCJleHAiOjE2Nzg4OTE2MTYsImlzcyI6Imh0dHBzOi8vcGF5LW1vY2stY29ubmVjdC50cnVlbGF5ZXItc2FuZGJveC5jb20iLCJhdWQiOiJodHRwczovL3BheS1tb2NrLWNvbm5lY3QudHJ1ZWxheWVyLXNhbmRib3guY29tIn0.SEaRgmRlIuI1sixxL2o93hL0sr-9rz68-aY_pF0u0iY"
      }
    }
  }
}

EU preselected provider flow

In this flow, you create a payment or mandate with a value of preselected for the provider_selection.type object, and provide a provider ID. In most cases, you would develop a UI for the user to select this before payment creation.

The provider has already been selected, but some EU providers require additional input. This means you need to start the authorisation flow, then check the response to see whether you need to submit additional input with a form action. If so, you need to have developed a UI that enables the user to submit it.

After submitting additional input, or if no additional input was required, you must complete the redirect action. The redirect takes the user to their bank so they can authorise the payment.

πŸ“˜

Embedded flows

If you are submitting additional input as part of an embedded flow, you don't need to redirect the user. This is because they've already been redirected to the provider to submit additional information, where they also authorise the payment.

To integrate this flow:

  1. Develop a UI that enables users to initiate a payment with a specific EU provider.
    This might include a screen that enables the user to select a provider before payment creation.
  2. When the user initiates the payment through this UI, create a payment and send a POST request with the payment id to the /payments/{id}/authorization-flowendpoint.
  3. Check the response you receive from the start authorisation flow request.
    1. If the next action is form, additional input is required. You should perform steps 4 and 5.
    2. If the next action is redirect, you must redirect the user to the redirect uri also included in the response. No further action is required.
  4. For the form action, check the type and details for each of the inputswithin the object. Ensure that your UI is able to accommodate the data collection required by each of the inputs.
  5. Display a UI that enables the user to provide the information required for each of the inputs.
    If the provider requires additional data, you might have to complete consecutive form actions.
  6. After you provide the information needed for the form action or actions, redirect the user to the redirect uri so they can authorise their payment through the provider.
    This step isn't needed for embedded flows.

EU preselected request body and response

Use the tabs in this code block to see examples of:

  • The payment creation request.
  • The POST request sent to /payments/{id}/authorization-flow to start the authorisation flow.
  • The response returned from /payments/{id}/authorization-flow if the form action is needed. This contains extra information about what's required for the form.
    If the redirect action is needed at this step, redirect the user to the link in the actions.next.uri object.
  • The POST request sent to the .../authorization-flow/actions/form endpoint to submit additional information for the form.
  • An example of the response after you submit the additional information needed for the form if there are no extra form actions to complete.
{
    "amount_in_minor": 1,
    "currency": "EUR",
    "payment_method": {
        "type": "bank_transfer",
        "provider_selection": {
            "type": "preselected",
            "provider_id": "mock-payments-de-redirect",
            "scheme_id": "sepa_credit_transfer"
        },
        "beneficiary": {
            "type": "merchant_account",
            "account_holder_name": "Merchant Account name",
            "merchant_account_id": "2a485b0a-a29c-4aa2-bcef-b34d0f6f8d51"
        }
    },
    "user": {
        "id": "57e9ae89-01fd-4779-8775-5b7de9a85a64",
        "name": "Test user",
        "email": "[email protected]",
        "phone": "+441234567890"
    }
}'
{
  "provider_selection": {},
    "redirect": {
    "return_uri": "https://console.truelayer.com/redirect-page"
  },
    "form": {
        "input_types": [
            "text"
        ]
    }
}
{
    "status": "authorizing",
    "authorization_flow": {
        "actions": {
            "next": {
                "type": "form",
                "inputs": [
                    {
                        "type": "text",
                        "id": "psu-branch-code",
                        "mandatory": true,
                        "display_text": {
                            "key": "psu-branch-code.display-text",
                            "default": "Branch"
                        },
                        "format": "any",
                        "sensitive": false,
                        "min_length": 3,
                        "max_length": 3,
                        "regexes": [
                            {
                                "regex": "^\\d{3}$",
                                "message": {
                                    "key": "psu-branch-code.regex",
                                    "default": "Value is invalid."
                                }
                            }
                        ]
                    },
                    {
                        "type": "text",
                        "id": "psu-account-number",
                        "mandatory": true,
                        "display_text": {
                            "key": "psu-account-number.display-text",
                            "default": "Account"
                        },
                        "format": "numerical",
                        "sensitive": false,
                        "min_length": 7,
                        "max_length": 7,
                        "regexes": [
                            {
                                "regex": "^\\d{7}$",
                                "message": {
                                    "key": "psu-account-number.regex",
                                    "default": "Value is invalid."
                                }
                            }
                        ]
                    },
                    {
                        "type": "text",
                        "id": "psu-sub-account",
                        "mandatory": true,
                        "display_text": {
                            "key": "psu-sub-account.display-text",
                            "default": "Sub-account"
                        },
                        "format": "numerical",
                        "sensitive": false,
                        "min_length": 2,
                        "max_length": 2,
                        "regexes": [
                            {
                                "regex": "^\\d{2}$",
                                "message": {
                                    "key": "psu-sub-account.regex",
                                    "default": "Value is invalid."
                                }
                            }
                        ]
                    }
                ]
            }
        }
    }
}
{
  "inputs": {
        "psu-branch-code": "123",
        "psu-account-number":"1234567",
        "psu-sub-account":"12"
    }
}
{
    "status": "authorizing",
    "authorization_flow": {
        "actions": {
            "next": {
                "type": "redirect",
                "uri": "https://pay-mock-connect.truelayer-sandbox.com/login/11955128-17ef-4989-a870-23762723d15b#token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiIxMTk1NTEyOC0xN2VmLTQ5ODktYTg3MC0yMzc2MjcyM2QxNWIiLCJzY29wZSI6InBheS1tb2NrLWNvbm5lY3QtYXBpIiwibmJmIjoxNjc5MzMxNTA3LCJleHAiOjE2NzkzMzUxMDcsImlzcyI6Imh0dHBzOi8vcGF5LW1vY2stY29ubmVjdC50cnVlbGF5ZXItc2FuZGJveC5jb20iLCJhdWQiOiJodHRwczovL3BheS1tb2NrLWNvbm5lY3QudHJ1ZWxheWVyLXNhbmRib3guY29tIn0.rEnGW6TY3eaLJspx6y4bXRxz1uA_Xya2ekzWASyml4E"
            }
        }
    }
}

UK user selected provider flow

In this flow, you create a payment or mandate with a value of user_selected for the provider_selection.type object. You then start the authorisation flow. The response contains a list of providers based on the value you provide for the provider_selection.filter object.

You need to create a UI for the user to select a provider from the list of providers you receive in the response. When they select a provider, you should submit the relevant provider_id through a request to the .../authorization-flow/actions/provider-selection endpoint.

After the user successfully selects a provider through your UI and you submit the provider_id, the response should contain redirect as the next action. Redirect the user to the redirect uri so they can authorise their payment through the provider.

To integrate this flow:

  1. Develop a UI that enables users to initiate a payment with no provider selected.
  2. When the user initiates the payment through this UI, create a payment and send a POST request with the payment id to the /payments/{id}/authorization-flow endpoint.
  3. Check the actions.next.providers object in the response you receive and retrieve resources and IDs for the providers.
  4. Display a UI that enables the user to select a provider to make the payment through.
  5. After the user selects a provider, submit the relevant provider_id through a request to the .../authorization-flow/actions/provider-selection endpoint.
    If successful, the response should contain the redirect action.
  6. Redirect the user to the redirect uri so they can authorise their payment through the provider.

UK user selected request body and response

Use the tabs in this code block to see examples of:

{
    "amount_in_minor": 1,
    "currency": "GBP",
    "payment_method": {
        "type": "bank_transfer",
        "provider_selection": {
            "type": "user_selected"
        },
        "beneficiary": {
            "type": "merchant_account",
            "account_holder_name": "Merchant Account name",
            "merchant_account_id": "200552da-13da-43c5-a9ba-04ee1502ac57"
        }
    },
    "user": {
        "id": "cd101303-9124-4831-9fec-ef574ed22ecd",
        "name": "Test User",
        "email": "[email protected]",
        "phone": "+441234567890"
    }
}
{
  "provider_selection": {},
    "redirect": {
    "return_uri": "https://console.truelayer.com/redirect-page"
  }
}
{
    "status": "authorizing",
    "authorization_flow": {
        "actions": {
            "next": {
                "type": "provider_selection",
                "providers": [
                    {
                        "id": "mock-payments-gb-redirect",
                        "display_name": "Mock UK Payments - Redirect Flow",
                        "icon_uri": "https://truelayer-provider-assets.s3.amazonaws.com/uk/icons/mock-payments-gb-redirect.svg",
                        "logo_uri": "https://truelayer-provider-assets.s3.amazonaws.com/uk/logos/mock-payments-gb-redirect.svg",
                        "bg_color": "#FFFFFF",
                        "country_code": "GB"
                    }
                ]
            }
        }
    }
}
{
  "provider_id": "mock-payments-gb-redirect"
}
{
    "status": "authorizing",
    "authorization_flow": {
        "actions": {
            "next": {
                "type": "redirect",
                "uri": "https://pay-mock-connect.truelayer-sandbox.com/login/0bd4f72a-b508-4643-b5a0-eb90eab0f887#token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiIwYmQ0ZjcyYS1iNTA4LTQ2NDMtYjVhMC1lYjkwZWFiMGY4ODciLCJzY29wZSI6InBheS1tb2NrLWNvbm5lY3QtYXBpIiwibmJmIjoxNjc5NDEyMjk4LCJleHAiOjE2Nzk0MTU4OTgsImlzcyI6Imh0dHBzOi8vcGF5LW1vY2stY29ubmVjdC50cnVlbGF5ZXItc2FuZGJveC5jb20iLCJhdWQiOiJodHRwczovL3BheS1tb2NrLWNvbm5lY3QudHJ1ZWxheWVyLXNhbmRib3guY29tIn0.ksBNQV6H_Xhf7t6I9z9ZROblBFwwFz1HpM42autp37A"
            }
        }
    }
}

EU user selected provider flow

In this flow, you create a payment or mandate with a value of user_selected for the provider_selection.type object. You then start the authorisation flow. The response contains a list of providers based on the value you provide for the provider_selection.filter object.

You need to create a UI for the user to select a provider from the list of providers you receive in the response. When they select a provider, you should submit the relevant provider_id through a request to the .../authorization-flow/actions/provider-selection endpoint.

Some EU providers require additional input. The response you receive when you submit the provider_id informs you whether you need to submit additional input through a form action. If so, you need to have developed a UI that enables the user to submit it.

After submitting additional input, or if no additional input was required, you must complete the redirect action. The redirect takes the user to their bank so they can authorise the payment.

πŸ“˜

Embedded flows

If you are submitting additional input as part of an embedded flow, you don't need to redirect the user. This is because they've already been redirected to the provider to submit additional information, where they also authorise the payment.

To integrate this flow:

  1. Develop a UI that enables users to initiate a payment with no provider selected.
  2. When the user initiates the payment through this UI, create a payment and send a POST request with the payment id to the /payments/{id}/authorization-flow endpoint.
  3. Check the actions.next.providers object in the response you receive and retrieve resources and IDs for the providers.
  4. Display a UI that enables the user to select a provider to make the payment through.
  5. After the user selects a provider, submit the relevant provider_id through a request to the .../authorization-flow/actions/provider-selection endpoint.
  6. Check the response you receive from the start authorisation flow request.
    1. If the next action is form, additional input is required. You should perform steps 7 and 8.
    2. If the next action is redirect, you must redirect the user to the redirect uri also included in the response. No further action is required.
  7. For the form action, check the type and details for each of the inputswithin the object. Ensure that your UI is able to accommodate the data collection required by each of the inputs.
  8. Display a UI that enables the user to provide the information required for each of the inputs.
    If the provider requires additional data, you might have to complete consecutive form actions.
  9. After you provide the information needed for the form action or actions, redirect the user to the redirect uri so they can authorise their payment through the provider.
    This step isn't needed for embedded flows.

EU user selected request body and response

Use the tabs in this code block to see examples of:

{
    "amount_in_minor": 1,
    "currency": "EUR",
    "payment_method": {
        "type": "bank_transfer",
        "provider_selection": {
            "type": "user_selected"
        },
        "beneficiary": {
            "type": "merchant_account",
            "account_holder_name": "Merchant Account name",
            "merchant_account_id": "2a485b0a-a29c-4aa2-bcef-b34d0f6f8d51"
        }
    },
    "user": {
        "id": "e0ef56e1-ae93-491b-9028-cd0199355170",
        "name": "Test User",
        "email": "[email protected]",
        "phone": "+441234567890"
    }
}
{
  "provider_selection": {},
    "redirect": {
    "return_uri": "https://console.truelayer.com/redirect-page"
  },
    "form": {
        "input_types": [
            "text",
        ]
    }
}
{
    "status": "authorizing",
    "authorization_flow": {
        "actions": {
            "next": {
                "type": "provider_selection",
                "providers": [
                    {
                        "id": "mock-payments-de-embedded",
                        "display_name": "Mock European Payments – Embedded Flow",
                        "icon_uri": "https://truelayer-provider-assets.s3.amazonaws.com/global/icons/mock-payments-de-embedded.svg",
                        "logo_uri": "https://truelayer-provider-assets.s3.amazonaws.com/global/logos/mock-payments-de-embedded.svg",
                        "bg_color": "#FFFFFF",
                        "country_code": "DE"
                    },
                    {
                        "id": "mock-payments-de-redirect",
                        "display_name": "Mock German Payments – Redirect Flow",
                        "icon_uri": "https://truelayer-provider-assets.s3.amazonaws.com/global/icons/mock-payments-es-redirect.svg",
                        "logo_uri": "https://truelayer-provider-assets.s3.amazonaws.com/global/logos/mock-payments-es-redirect.svg",
                        "bg_color": "#FFFFFF",
                        "country_code": "DE"
                    },
                    {
                        "id": "mock-payments-de-redirect-additional-input-text",
                        "display_name": "Mock German Payments – Redirect Flow with additional inputs",
                        "icon_uri": "https://truelayer-provider-assets.s3.amazonaws.com/global/icons/mock-payments-es-redirect.svg",
                        "logo_uri": "https://truelayer-provider-assets.s3.amazonaws.com/global/logos/mock-payments-es-redirect.svg",
                        "bg_color": "#FFFFFF",
                        "country_code": "DE"
                    },
                    {
                        "id": "mock-payments-es-redirect",
                        "display_name": "Mock Spain Payments – Redirect Flow",
                        "icon_uri": "https://truelayer-provider-assets.s3.amazonaws.com/global/icons/mock-payments-es-redirect.svg",
                        "logo_uri": "https://truelayer-provider-assets.s3.amazonaws.com/global/logos/mock-payments-es-redirect.svg",
                        "bg_color": "#FFFFFF",
                        "country_code": "ES"
                    },
                    {
                        "id": "mock-payments-fr-redirect",
                        "display_name": "Mock France Payments – Redirect Flow",
                        "icon_uri": "https://truelayer-provider-assets.s3.amazonaws.com/global/icons/mock-payments-es-redirect.svg",
                        "logo_uri": "https://truelayer-provider-assets.s3.amazonaws.com/global/logos/mock-payments-es-redirect.svg",
                        "bg_color": "#FFFFFF",
                        "country_code": "FR"
                    },
                    {
                        "id": "mock-payments-fr-redirect-additional-input",
                        "display_name": "Mock France Payments – Redirect Flow - Additional Input",
                        "icon_uri": "https://truelayer-provider-assets.s3.amazonaws.com/global/icons/mock-payments-es-redirect.svg",
                        "logo_uri": "https://truelayer-provider-assets.s3.amazonaws.com/global/logos/mock-payments-es-redirect.svg",
                        "bg_color": "#FFFFFF",
                        "country_code": "FR"
                    },
                    {
                        "id": "mock-payments-ie-redirect",
                        "display_name": "Mock Ireland Payments – Redirect Flow",
                        "icon_uri": "https://truelayer-provider-assets.s3.amazonaws.com/global/icons/mock-payments-es-redirect.svg",
                        "logo_uri": "https://truelayer-provider-assets.s3.amazonaws.com/global/logos/mock-payments-es-redirect.svg",
                        "bg_color": "#FFFFFF",
                        "country_code": "IE"
                    },
                    {
                        "id": "mock-payments-it-redirect",
                        "display_name": "Mock Italy Payments – Redirect Flow",
                        "icon_uri": "https://truelayer-provider-assets.s3.amazonaws.com/global/icons/mock-payments-es-redirect.svg",
                        "logo_uri": "https://truelayer-provider-assets.s3.amazonaws.com/global/logos/mock-payments-es-redirect.svg",
                        "bg_color": "#FFFFFF",
                        "country_code": "IT"
                    },
                    {
                        "id": "mock-payments-lt-redirect",
                        "display_name": "Mock Lithuania Payments – Redirect Flow",
                        "icon_uri": "https://truelayer-provider-assets.s3.amazonaws.com/global/icons/mock-payments-es-redirect.svg",
                        "logo_uri": "https://truelayer-provider-assets.s3.amazonaws.com/global/logos/mock-payments-es-redirect.svg",
                        "bg_color": "#FFFFFF",
                        "country_code": "LT"
                    },
                    {
                        "id": "mock-payments-nl-redirect",
                        "display_name": "Mock Netherlands Payments – Redirect Flow",
                        "icon_uri": "https://truelayer-provider-assets.s3.amazonaws.com/global/icons/mock-payments-es-redirect.svg",
                        "logo_uri": "https://truelayer-provider-assets.s3.amazonaws.com/global/logos/mock-payments-es-redirect.svg",
                        "bg_color": "#FFFFFF",
                        "country_code": "NL",
                        "search_aliases": [
                            "Mock Dutch Payments - Redirect Flow"
                        ]
                    },
                    {
                        "id": "mock-payments-pl-redirect",
                        "display_name": "Mock Poland Payments – Redirect Flow",
                        "icon_uri": "https://truelayer-provider-assets.s3.amazonaws.com/global/icons/mock-payments-es-redirect.svg",
                        "logo_uri": "https://truelayer-provider-assets.s3.amazonaws.com/global/logos/mock-payments-es-redirect.svg",
                        "bg_color": "#FFFFFF",
                        "country_code": "PL"
                    },
                    {
                        "id": "mock-payments-pt-redirect",
                        "display_name": "Mock Portugal Payments – Redirect Flow",
                        "icon_uri": "https://truelayer-provider-assets.s3.amazonaws.com/global/icons/mock-payments-es-redirect.svg",
                        "logo_uri": "https://truelayer-provider-assets.s3.amazonaws.com/global/logos/mock-payments-es-redirect.svg",
                        "bg_color": "#FFFFFF",
                        "country_code": "PT"
                    }
                ]
            }
        }
    }
}
{
  "provider_id": "mock-payments-de-redirect-additional-input-text"
}
{
    "status": "authorizing",
    "authorization_flow": {
        "actions": {
            "next": {
                "type": "form",
                "inputs": [
                    {
                        "type": "text",
                        "id": "psu-branch-code",
                        "mandatory": true,
                        "display_text": {
                            "key": "psu-branch-code.display-text",
                            "default": "Branch"
                        },
                        "format": "any",
                        "sensitive": false,
                        "min_length": 3,
                        "max_length": 3,
                        "regexes": [
                            {
                                "regex": "^\\d{3}$",
                                "message": {
                                    "key": "psu-branch-code.regex",
                                    "default": "Value is invalid."
                                }
                            }
                        ]
                    },
                    {
                        "type": "text",
                        "id": "psu-account-number",
                        "mandatory": true,
                        "display_text": {
                            "key": "psu-account-number.display-text",
                            "default": "Account"
                        },
                        "format": "numerical",
                        "sensitive": false,
                        "min_length": 7,
                        "max_length": 7,
                        "regexes": [
                            {
                                "regex": "^\\d{7}$",
                                "message": {
                                    "key": "psu-account-number.regex",
                                    "default": "Value is invalid."
                                }
                            }
                        ]
                    },
                    {
                        "type": "text",
                        "id": "psu-sub-account",
                        "mandatory": true,
                        "display_text": {
                            "key": "psu-sub-account.display-text",
                            "default": "Sub-account"
                        },
                        "format": "numerical",
                        "sensitive": false,
                        "min_length": 2,
                        "max_length": 2,
                        "regexes": [
                            {
                                "regex": "^\\d{2}$",
                                "message": {
                                    "key": "psu-sub-account.regex",
                                    "default": "Value is invalid."
                                }
                            }
                        ]
                    }
                ]
            }
        }
    }
}
{
  "inputs": {
        "psu-branch-code": "123",
        "psu-account-number":"1234567",
        "psu-sub-account":"12"
    }
}
{
    "status": "authorizing",
    "authorization_flow": {
        "actions": {
            "next": {
                "type": "redirect",
                "uri": "https://pay-mock-connect.truelayer-sandbox.com/login/bed1030c-b2c5-4f49-ad67-d63a0d51e854#token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJiZWQxMDMwYy1iMmM1LTRmNDktYWQ2Ny1kNjNhMGQ1MWU4NTQiLCJzY29wZSI6InBheS1tb2NrLWNvbm5lY3QtYXBpIiwibmJmIjoxNjc5NTgyODk5LCJleHAiOjE2Nzk1ODY0OTksImlzcyI6Imh0dHBzOi8vcGF5LW1vY2stY29ubmVjdC50cnVlbGF5ZXItc2FuZGJveC5jb20iLCJhdWQiOiJodHRwczovL3BheS1tb2NrLWNvbm5lY3QudHJ1ZWxheWVyLXNhbmRib3guY29tIn0.9Sc660VEPaYP-dDAqJ_0uhXyOCqNIV4dHOVdm35g4UE"
            }
        }
    }
}