> ## Documentation Index
> Fetch the complete documentation index at: https://docs.mollie.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Connect for Platforms: Balance Transfers

Balance Transfers let you control the flow of funds between different organizations within your platform. Whether you’re collecting invoices, redistributing revenue or applying changes post-settlement - this feature allows you to do it all in one place, within Mollie’s ecosystem.

## What is a Balance Transfer?

Balance Transfers move funds between two Mollie organizations *that already own those funds*.

It **must not** be used to process merchant or consumer funds **on behalf of others** or to:

* Receive shopper funds into your platform and forward them to sellers.
* Aggregate or split consumer payments or act as merchant of record for others.
* Hold or escrow third-party funds, intermediate settlements or net consumer payments across multiple merchants.
* Create pass-through “transit” flows where the platform becomes a part of the settlement.

It is **allowed** to be used for:

* Collecting platform fees or royalties owed to the platform by a connected merchant (with prior consent).
* Post-delivery adjustments between connected merchants, where both parties are the legal owners of the balances being moved.
* Correcting or applying penalties that do not effect shopper funds or replace settlement.

Example use cases:

* **SaaS platforms** collecting monthly or per-transaction fees.
* **Marketplaces** adjusting balances post-delivery.
* **Franchisors** charging revenue-based or fixed monthly fees.

<Callout icon="📘" theme="info">
  Partners are responsible for [PSD2](https://help.mollie.com/hc/en-us/articles/360035609413-What-are-PSD2-and-Strong-Customer-Authentication) compliance. Mollie may review and block transfers that indicate the platform is in the money flow. If unsure, contact your compliance advisor or [Mollie support ](https://www.mollie.com/contact/merchants)before going live.
</Callout>

## Setup & Permissions

<Callout icon="📘" theme="info">
  Contact your Mollie point of contact to enable Balance Transfers in your Organization.
</Callout>

To use Balance Transfers, connect sub-merchants via your [OAuth application](https://docs.mollie.com/reference/oauth-api#/) with the following scopes:

* `balance-transfers.read`
* `balance-transfers.write`

Every time you create a Balance Transfer, ensure that both the source and destination accounts are:

* Active
* Can receive payments
* Can send settlements
* Have sufficient balance (validated via pre-execution reserve check)

<Callout icon="🚧" theme="warn">
  You must have a **documented consent** from your sub-merchants authorizing balance movements.
</Callout>

## How it works

1. Authenticate the transfer using the source organization's <Anchor label="advanced access token" target="_blank" href="https://help.mollie.com/hc/en-us/articles/360010774314-What-is-an-Organization-Access-Token">advanced access token</Anchor>.
2. Initiate a transfer with an API call (see [API Overview](https://docs.mollie.com/docs/connect-platforms-balance-transfers#/api-overview) below).
3. Track your transfer's status asynchronously using [Webhooks](https://docs.mollie.com/reference/webhooks-new#/) or via the [GET endpoint](https://docs.mollie.com/docs/connect-for-platforms-balance-transfers#/get-a-transfer).

Transfers are always initiated between two Mollie merchant accounts. Transfers can be made between two of your users, or you can be either the *source* or the *destination* of the transfer.

## API Overview

### Create a transfer

To create a Balance Transfer, make a `POST` request to our Public API endpoint.

Descriptions you provide in `source.description` | `destination.description` will show up in Mollie dashboards and reports for both organizations.

```json JSON
POST /v2/connect/balance-transfers

{
    "amount": {
        "currency": "EUR",
        "value": "0.10"
    },
    "description": "transfer test",
    "destination": {
        "description": "description for the destination",
        "id": "org_12659708",
        "type": "organization"
    },
    "source": {
        "description": "description for the source",
        "id": "org_19120883",
        "type": "organization"
    },
    "testmode": false
}
```

Balance Transfer requests are processed **asynchronously**. Use the returned `id` to query your transfer's status or listen to any updates using Webhooks.

### Get a transfer

Retrieve the current status of a specific transfer.

```json JSON
GET /v2/connect/balance-transfers/{id}
```

### List transfers

Paginate through previous transfers. Supports the following query parameters: `limit` `sort` `from` `testmode`

```json JSON
GET /v2/connect/balance-transfers
```

### Webhooks

To receive new updates for your transfers using Webhooks:

* Set up a Webhook using our [next-gen webhook framework](https://docs.mollie.com/reference/webhooks-new).
* Listen for status changes like: `connect-balance-transfer.succeeded` or `connect-balance-transfer.failed`.

If you subscribe to [full payload (snapshot)](https://docs.mollie.com/reference/webhooks-new#/whats-new) webhooks, you can look at the field `statusReason.code` to find out the reason for a specific balance transfer status:

* `request_created` - Balance transfer request was created.
* `success` - Balance transfer completed successfully.
* `source_not_allowed` - Balance transfers from the source organization are not allowed.
* `destination_not_allowed` - Balance transfers to the destination organization are not allowed.
* `insufficient_funds` - Source does not have enough balance.
* `invalid_source_balance` - Invalid balance for source organization.
* `invalid_destination_balance` - Invalid balance for destination organization.
* `transfer_request_expired` - Request for balance transfer has expired.
* `transfer_limit_reached` - Transfer limit has been exceeded.

```json
{
    "_embedded": {
        "entity": {
            "amount": {
                "currency": "EUR",
                "value": "0.10"
            },
            "createdAt": "2025-10-07T11:59:09.05704Z",
            "description": "description for the initiator",
            "destination": {
                "description": "description for the destination",
                "id": "org_12659708",
                "type": "organization"
            },
            "executedAt": "2025-10-07T11:59:12.810532Z",
            "id": "cbtr_29mJGPbimEY4vspUWBFFJ",
            "mode": "live",
            "resource": "connect-balance-transfer",
            "source": {
                "description": "description for the source",
                "id": "org_19120883",
                "type": "organization"
            },
            "status": "succeeded",
            "statusReason": {
                "code": "success",
                "message": "Balance transfer completed successfully."
            }
        }
    },
    "_links": {
        "documentation": {
            "href": "https://docs.mollie.com/guides/webhooks",
            "type": "text/html"
        },
        "self": {
            "href": "https://api.mollie.com/v2/events/event_pWB8XELiETjy4tiqWBFFJ",
            "type": "application/hal+json"
        }
    },
    "createdAt": "2025-10-07T11:59:13.0Z",
    "entityId": "cbtr_29mJGPbimEY4vspUWBFFJ",
    "id": "event_pWB8XELiETjy4tiqWBFFJ",
    "resource": "event",
    "type": "connect-balance-transfer.succeeded"
}
```

### Current limits

* Default limit for **live transfers** is `EUR 1,000` per month per sub-merchant (combined debits & credits).
* There are currently no limits for **test transfers** (`testmode : true`).

<Callout icon="📘" theme="info">
  Need higher production limits? Reach out to your Mollie point of contact to set different transfer limits.
</Callout>

### Legal notice

Mollie executes transfers a partner has initiated under the following circumstances:

* The Partner initiating the transfer has their **sub-merchant's consent**.
* The **amount** and **purpose** of the transfer are valid.

Partners are legally responsible for all submitted transfer requests along with the instructions they provided when initiated.