# Partners: Importing outbound payments

> Currently, Outbound Payments APIs are limited to the UK and operate solely through the Faster Payments scheme.

The Outbound Payment Import API lets you create a batch of outbound payments in a single API call, then have your merchant approve the entire batch through the GoCardless dashboard. This is designed for partner integrations and removes two requirements that apply to [individual outbound payments](/partners/send-money).

- **No API request signing** — import endpoints do not require request signing.
- **No per-payment approval** — the merchant approves all payments in the batch at once, instead of approving each payment individually.

## Prerequisites

Before creating an import, ensure the following are in place:

- Your merchant must be fully onboarded with GoCardless and have Outbound Payments enabled at the merchant level.
- The merchant's [payment account](/sending-money/funding) must be funded with a sufficient balance to cover the total import amount.
- Recipient bank accounts must already exist for each payee — see [Create a recipient](/sending-money/create-recipient)
- The person authorising the import on the dashboard must have a GoCardless Dashboard user account with read-write or admin permissions and SMS-based two-factor authentication enabled.
- You must have a valid access token for the merchant — see [Making API calls on behalf of your merchant](/partners/send-money#making_api_calls_on_behalf_of_your_merchant).

## How it works

The import workflow has four stages:

#### [1. Create the import](#create_the_import)

Submit all payment entries in a single API call. GoCardless begins validating the entries and running bank account holder verification checks.

#### [2. Wait for validation](#wait_for_validation)

Poll the API until all entries have been validated and verification checks are complete.

#### [3. Authorise the import](#authorise_the_import)

Share the authorisation link with your merchant. They review the import on the GoCardless dashboard and approve it by completing Strong Customer Authentication (SCA) via SMS.

#### [4. Track the result](#track_the_result)

Once authorised, each entry is automatically converted into an individual outbound payment. Use [webhooks](/api-reference/#appendix-webhooks) to track the status of each payment.

![Partners -> Outbound payment import -> Outbound payment import state machine](https://images.ctfassets.net/b2dmfxhmyqno/2QQuBsLzjKj1pftMsWhNiW/7b65d080dc43c4780320a587317ae228/outbound_payment_import_state_machine.png)

### Import statuses

| Status       | Description                                                                                                                                                                              |
| ------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `created`    | The import has been received.                                                                                                                                                            |
| `validating` | Entry validation and bank account holder verification are in progress.                                                                                                                   |
| `valid`      | All entries passed validation and verification checks are complete. Ready for approval.                                                                                                  |
| `invalid`    | One or more entries failed validation. The import cannot be authorised.                                                                                                                  |
| `processing` | Approval received. Payments are being created.                                                                                                                                           |
| `processed`  | All entries have been converted into outbound payments.                                                                                                                                  |
| `cancelled`  | The import was cancelled. Unused imports expire after 3 calendar days. Imports abandoned during approval are cancelled within 5 minutes of the approval starting (when we send the SMS). |

## Create the import

> Imports are capped at **1000 entries**. If you need to send more payments, create multiple imports.

Submit a [Create an outbound payment import](/api-reference/#outbound-payment-imports-create-an-outbound-payment-import) request with an array of payment entries. For information on the entry parameters, please refer to the API reference linked.

> **Action:** Call the [Create an outbound payment import](/api-reference/#outbound-payment-imports-create-an-outbound-payment-import) endpoint.

The top-level `links.creditor` field is optional. If omitted, the creditor is inferred from the access token used to make the request. You can set it explicitly when calling on behalf of a specific merchant.

The response includes:

- **`authorisation_url`** — The link to the GoCardless dashboard where the merchant reviews and authorises the import. Save this URL — you will share it with the merchant in [Step 3](#authorise_the_import).
- `**status**` — Initially `validating` while GoCardless checks each entry and runs bank account holder verification.
- `**entry_counts**` — A summary of validation and verification results, updated as checks complete.

## Wait for validation

After creation, GoCardless validates each entry and runs [bank account holder verification](/sending-money/bank-account-holder-verification) checks. The import remains in `validating` status until all checks are complete, then transitions to `valid` or `invalid`.

There are no webhook notifications for import status changes. You must poll the API to check when validation completes.

Validation takes about half a minute to a minute

> **Action:** Poll the [Get an outbound payment import](/api-reference/#outbound-payment-imports-get-an-outbound-payment-import) endpoint until the status changes from `validating`

When validation and verification checks are complete, the response will show the updated status and verification counts:

```http
HTTP/1.1 200 OK
Content-Type: application/json
{
  "outbound_payment_imports": {
    "id": "IM123",
    "created_at": "2024-09-05T12:20:04.397Z",
    "status": "valid",
    "amount_sum": 3500,
    "currency": "GBP",
    "authorisation_url": "https://manage.gocardless.com/imports/IM123",
    "entry_counts": {
      "total": 2,
      "valid": 2,
      "invalid": 0,
      "verified": 2,
      "verified_with_full_match": 1,
      "verified_with_partial_match": 1,
      "verified_with_no_match": 0,
      "verified_with_unable_to_match": 0,
      "processed": 0,
      "failed_to_process": 0
    },
    "links": {
      "creditor": "CR123"
    }
  }
}
```

### Bank account holder verification

Bank account holder verification runs automatically during validation. The `entry_counts` object on the import provides a summary of results:

| Field                         | Meaning                                                                                                                                                                          |
| ----------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| verified                      | Total number of entries verified.                                                                                                                                                |
| verified_with_full_match      | The recipient's name fully matches the name on the bank account.                                                                                                                 |
| verified_with_partial_match   | The recipient name is a close but not an exact match.                                                                                                                            |
| verified_with_no_match        | The recipient's name does not match the name on the bank account.                                                                                                                |
| verified_with_unable_to_match | The verification could not return a definitive result. This is because the recipient's bank does not support the verification check, or the verification service is unavailable. |

Verification results do not block an import from reaching `valid` status. Even entries with a `no_match` result can proceed — the verification results are displayed on the dashboard during authorisation, so the approver can make an informed decision.

You can also retrieve individual verification results by using the [List outbound payment import entries](/api-reference/#outbound-payment-import-entries-list-outbound-payment-import-entries) endpoint.

Each entry in the response includes a `verification_result` field with one of: `full_match`, `partial_match`, `no_match`, `unable_to_match`, or `null` (if verification has not yet been completed).

For more details, see [Bank account holder verification](/sending-money/bank-account-holder-verification).

## Authorise the import

Once the import reaches `valid` status, it must be authorised through the GoCardless dashboard. The `authorisation_url` from the import creation response is a standard web link. You can present it in your application as a redirect or new window, or share it via email or a notification in your platform.

> **Action:** Share the `authorisation_url` with the user who will authorise the import.

> Imports that are not authorised within **3 calendar days** of creation are automatically cancelled.

### What the approver sees

When the approver visits the authorisation link, they sign in to the GoCardless dashboard and are taken to the import review pages.

**1. Sign in to GoCardless**

The approver enters their GoCardless dashboard credentials.

![Screenshot: Sign in page](https://images.ctfassets.net/b2dmfxhmyqno/5eZ2q8pMY3hxUoSKcTn45y/22e39147a827b828cc1d177df79b32d6/Screenshot_2026-03-30_at_12.46.09.png)

**2. Review the import summary**

The import process page displays a summary of the import, including:

- The total number of payments
- The total value of valid payments
- The available balance on the source payment account

A summary of bank account holder verification results by category (full match, partial match, no match, unable to match).

![Partners -> Outbound payment imports -> Screenshot: Process](https://images.ctfassets.net/b2dmfxhmyqno/2jwtCYNI50wnr5RafXjl58/5d238b534432b77b306a8ba85a9aad9c/Screenshot_2026-03-30_at_13.04.17.png)

**3. Review individual entries**

From the summary page, the approver can click through to review individual entries on the import detail page. This page shows a paginated table of all entries with the amount, recipient, reference, and bank account holder verification result for each.

![Partners -> Outbound payment imports -> Screenshot: entry table](https://images.ctfassets.net/b2dmfxhmyqno/6czA78mlGik8oX6ucBDbat/072188de4d47fa9ae523a9520431fd9e/Screenshot_2026-03-31_at_15.45.19.png)

**4. Complete SCA and approve**

When the approver is satisfied, they click the approve button. GoCardless sends an SMS code to the approver's registered phone number. The approver enters this code to complete Strong Customer Authentication (SCA) and authorise all payments in the import.

![Partner -> Outbound payment imports -> Screenshot: SCA dialog](https://images.ctfassets.net/b2dmfxhmyqno/1mcsBe43Q5WvThIhU1HiyU/7786d29eb94e3c193bf8168abcc241b6/Screenshot_2026-03-30_at_13.08.43.png)

After entering the code, the import is authorised and transitions to `processing`. Each entry is automatically converted into an individual outbound payment — the resulting payments are submitted immediately and do not require separate approval.

![Partners -> Outbound payment imports -> Screenshot: checking details](https://images.ctfassets.net/b2dmfxhmyqno/4uOsGfujarsVZYEJUGXwNu/b30b831a29f14503ee2fac7d310fce3b/Screenshot_2026-03-30_at_13.09.19.png)

![Imports -> Outbound payment imports -> Screenshot: payments submitted](https://images.ctfassets.net/b2dmfxhmyqno/63Az4BJI3SZZkqHwWfFLJn/2e18e9f9a0c6f48209736a7031f205fc/Screenshot_2026-03-30_at_13.11.16.png)

> Authorisation is all-or-nothing. You cannot approve or reject individual entries within an import. If any entries need to be corrected or removed, you must create a new import without those entries.

## Track the result

After authorisation, the import moves through `processing` to `processed`. The import counts will contain `processed` and `failed_to_process`, indicating whether all payments were created successfully. To track the progress of the created payments, it is recommended to use webhooks.

### Check processing status

> **Action:** Poll the [Get an outbound payment import](/api-reference/#outbound-payment-imports-get-an-outbound-payment-import) endpoint until `status` is `processed.`

```http
GET https://api.gocardless.com/outbound_payment_import_entries?import=IM123 HTTP/1.1
HTTP/1.1 200 OK
Content-Type: application/json
{
  "outbound_payment_import_entries": [
    {
      "id": "IE123",
      "created_at": "2024-09-05T12:20:04.397Z",
      "processed_at": "2024-09-05T12:35:10.000Z",
      "entry_number": 1,
      "amount": 1000,
      "scheme": "faster_payments",
      "reference": "INV-001",
      "verification_result": "full_match",
      "validation_errors": null,
      "links": {
        "import": "IM123",
        "outbound_payment": "OUT00456",
        "recipient_bank_account": "BA0001234"
      }
    },
    {
      "id": "IE124",
      "created_at": "2024-09-05T12:20:04.397Z",
      "processed_at": "2024-09-05T12:35:10.000Z",
      "entry_number": 2,
      "amount": 2500,
      "scheme": "faster_payments",
      "reference": "INV-002",
      "verification_result": "partial_match",
      "validation_errors": null,
      "links": {
        "import": "IM123",
        "outbound_payment": "OUT00457",
        "recipient_bank_account": "BA0005678"
      }
    }
  ],
  "meta": {
    "cursors": {
      "before": null,
      "after": null
    },
    "limit": 50
  }
}
```

### Track the progress of created payments

> **Action:** set up [webhooks](/api-reference/#appendix-webhooks) using [this getting started guide](/getting-started/stay-up-to-date-with-webhooks-v2/). This is the recommended way of tracking the state of individual payments.

Once individual outbound payments are created from an import, they follow the standard [outbound payment lifecycle](/sending-money/get-outbound-payment-details) and generate webhook events as their status changes. Each outbound payment includes the ID of the import that created it in `links.outbound_payment_import`.

Alternatively, list outbound payment import entries using the [List outbound payment import entries](/api-reference/#outbound-payment-import-entries-list-outbound-payment-import-entries) endpoint. The `links.outbound_payment` field on each entry contains the ID of the created outbound payment. This ID can be used to track individual payment statuses through the standard [outbound payment APIs](/sending-money/get-outbound-payment-details).

## Handling invalid imports

If any entry fails validation, the entire import transitions to `invalid` and cannot be authorised. To identify the errors and recover:

1. List the import's entries using the [List outbound payment import entries](/api-reference/#outbound-payment-import-entries-list-outbound-payment-import-entries) endpoint.
2. Check the `validation_errors` field on each entry for per-field error details.
3. Fix the issues in your data.
4. Create a new import with the corrected entries.

An entry with validation errors looks like this:

```json
{
  "id": "IE125",
  "created_at": "2024-09-05T12:20:04.397Z",
  "processed_at": null,
  "entry_number": 3,
  "amount": null,
  "scheme": null,
  "reference": null,
  "verification_result": null,
  "validation_errors": {
    "outbound_payment": {
      "amount": ["must be greater than 0"],
      "scheme": ["is not included in the list"]
    }
  },
  "links": {
    "import": "IM124",
    "outbound_payment": null,
    "recipient_bank_account": "BA0009999"
  }
}
```

The `validation_errors.outbound_payment` object contains error messages keyed by field name: `amount`, `scheme`, `recipient_bank_account`, or `reference`.

> Invalid imports cannot be partially processed or edited. You must create a new import with corrected entries.

## Monitoring your imports

### List imports

Use the [List outbound payment imports](/api-reference/#outbound-payment-imports-list-outbound-payment-imports) endpoint. The import will contain the `status`, which tells whether it's ready to be approved & processed.

### List import entries

Use the [List outbound payment import entries](/api-reference/#outbound-payment-import-entries-list-outbound-payment-import-entries) endpoint. The entries will contain validation errors in case the import is `invalid`.

## Expiry and cancellation

Imports in `valid` status that are not authorised within **3 calendar days** of creation are automatically cancelled by the system.

There is no API endpoint to cancel an import. If you need to discard an import, create a new one and let the old one expire.

Once an import is cancelled — whether by expiry or otherwise — it cannot be reactivated. Create a new import instead.
