# Transfer funds between sellers Building with an AI agent? Start at https://docs.payme.io/agents.md - Sandbox: `POST https://sandbox.payme.io/api/sales` - Production: `POST https://live.payme.io/api/sales` ## Credentials - Request body field `seller_payme_id` (required): The MPL of the seller that receives the funds. It also authenticates the call. - Request body field `payme_client_key` (optional): Partners: your client key. Both sellers must belong to this partner. Moves funds from one seller's PayMe balance (`payment.origin_seller_id`) to another seller's (`seller_payme_id`). PayMe records the transfer as a completed sale on the receiving seller, with `sale_payment_method` `funds-transfer`. Amounts are in minor units (`1000` = 10.00). - **Authentication:** `seller_payme_id`, the receiving seller's MPL, authenticates the call. Partners also send `payme_client_key`. - **Same partner, different accounts:** both sellers must belong to the same partner, and they must be two different accounts (error `20`). - **Services:** the origin seller needs the `funds-transfer` service and the receiving seller the `funds-transfer Destination` service (error `720`). To enable them, ask and give both MPLs. - **Validated origin:** the origin seller's account must be validated (error `109`). - **A failed transfer still returns HTTP `200`**, with `status_code` `1`, `payme_status` `error` and the reason in `status_error_code` and `status_error_details`. Check `status_code`, not only the HTTP status. ### Errors HTTP status | Error code | Message | When ---|---|---|--- `500` | `1` | Required parameter is missing | `seller_payme_id` or `payment.origin_seller_id` is missing. `status_additional_info` names it. `400` | `353` | Invalid description | `product_name` is missing. `500` | `352` | Invalid price, out of min-max bounds | `sale_price` is missing or not a number. `400` | `252` | Currency is not allowed for this seller | `currency` isn't enabled for the receiving seller. `500` | `20` | Validation error | The two sellers are the same account (`Funds must be transferred between different accounts`), or they belong to different partners (`Merchant-Seller inconsistency`). `500` | `720` | The service was not activated | A seller lacks the funds-transfer service. `status_additional_info` is `funds-transfer` (origin seller) or `funds-transfer Destination` (receiving seller). `400` | `109` | Seller not validated | The origin seller's account isn't validated. `500` | `251` | Seller was not found | A seller key is unknown. ## Parameters This endpoint takes no path, query or header parameters. ## Request body Content type: `application/json` | Field | Type | Required | Description | | --- | --- | --- | --- | | `seller_payme_id` | string | yes | The MPL of the seller that receives the funds. It also authenticates the call. | | `payme_client_key` | string | no | Partners: your client key. Both sellers must belong to this partner. | | `sale_price` | integer | yes | The amount to transfer, in minor units (`1000` = 10.00). | | `currency` | string | yes | ISO 4217 currency code, e.g. `ILS`. It must be enabled for the receiving seller (error `252`). | | `product_name` | string | yes | What the transfer is for. It becomes the sale's description (error `353` if missing). | | `payment` | object | yes | The transfer details. | | `payment.method` | string | yes | Must be `funds-transfer`. Without it, PayMe doesn't make a transfer. | | `payment.origin_seller_id` | string | yes | The MPL of the seller whose balance is debited. It must differ from `seller_payme_id`. | ### Request example ```json { "seller_payme_id": "MPLDEMO-MPLDEMO-MPLDEMO-7654321", "sale_price": 15000, "currency": "ILS", "product_name": "Monthly settlement", "payment": { "method": "funds-transfer", "origin_seller_id": "MPLDEMO-MPLDEMO-MPLDEMO-1234567" } } ``` ## Code samples ### curl ```bash curl -X POST 'https://sandbox.payme.io/api/sales' \ -H 'Content-Type: application/json' \ --data-raw '{ "seller_payme_id": "MPLDEMO-MPLDEMO-MPLDEMO-7654321", "sale_price": 15000, "currency": "ILS", "product_name": "Monthly settlement", "payment": { "method": "funds-transfer", "origin_seller_id": "MPLDEMO-MPLDEMO-MPLDEMO-1234567" } }' ``` ### Node.js ```javascript const response = await fetch("https://sandbox.payme.io/api/sales", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ "seller_payme_id": "MPLDEMO-MPLDEMO-MPLDEMO-7654321", "sale_price": 15000, "currency": "ILS", "product_name": "Monthly settlement", "payment": { "method": "funds-transfer", "origin_seller_id": "MPLDEMO-MPLDEMO-MPLDEMO-1234567" } }), }); console.log(await response.text()); ``` ### Python ```python import requests response = requests.post( "https://sandbox.payme.io/api/sales", json={ "seller_payme_id": "MPLDEMO-MPLDEMO-MPLDEMO-7654321", "sale_price": 15000, "currency": "ILS", "product_name": "Monthly settlement", "payment": { "method": "funds-transfer", "origin_seller_id": "MPLDEMO-MPLDEMO-MPLDEMO-1234567", }, }, ) print(response.text) ``` ### PHP ```php 'POST', CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ 'Content-Type: application/json', ], CURLOPT_POSTFIELDS => $body, ]); $response = curl_exec($ch); curl_close($ch); echo $response; ``` ## Responses ### 200 — The transfer result, as a sale on the receiving seller. The response also carries the other fields of a sale response, such as `buyer_*`, `payme_transaction_card_brand` and `installments`. They describe card sales; don't rely on them for a transfer. (success) | Field | Type | Description | | --- | --- | --- | | `status_code` | integer | `0` – the transfer succeeded; `1` – it failed (see `status_error_code`). | | `payme_status` | string | `success` or `error`. | | `status_error_code` | integer | `0` on success; the error code otherwise. | | `status_error_details` | string | The error message. Only when the transfer failed. | | `payme_sale_id` | string | The sale created on the receiving seller (`SALE…`). | | `payme_sale_code` | integer | The sale's numeric ID. | | `sale_created` | string | When the sale was created, `YYYY-MM-DD HH:MM:SS`. | | `sale_status` | string | `completed` when the transfer succeeded. | | `payme_sale_status` | string | Same as `sale_status`. | | `sale_payment_method` | string | `funds-transfer`. | | `currency` | string | The currency, as sent. | | `price` | integer | The amount transferred, in minor units. | | `sale_description` | string | Your `product_name`. | | `payme_signature` | string | The sale signature. See [Verifying a callback](/payments/getting-started/callbacks#verifying-a-callback-payme_signature). | | `payme_transaction_id` | string | The transaction on the receiving seller (`TRAN…`). | | `payme_transaction_total` | integer | The transaction amount, in minor units. | | `sale_paid_date` | string | When the transfer ran, `YYYY-MM-DD HH:MM:SS`. | | `sale_release_date` | string | The release date of the funds to the receiving seller, `YYYY-MM-DD HH:MM:SS`. | | `session` | string | PayMe session ID. Quote it when you contact PayMe support. | ```json { "status_code": 0, "payme_status": "success", "status_error_code": 0, "payme_sale_id": "SALE1700-000000AA-EXAMPLE1-SALE0001", "payme_sale_code": 8965519, "sale_created": "2026-11-09 16:28:08", "sale_status": "completed", "payme_sale_status": "completed", "sale_payment_method": "funds-transfer", "currency": "ILS", "price": 15000, "sale_description": "Monthly settlement", "payme_signature": "9c1d6f0e2b7a4c3d8e5f6a7b8c9d0e1f", "payme_transaction_id": "TRAN1700-000000AA-EXAMPLE1-TXN00001", "payme_transaction_total": 15000, "sale_paid_date": "2026-11-09 16:28:08", "sale_release_date": "2026-11-09 16:28:09", "session": "FhT3aXe7" } ``` ### 400 — A missing `product_name`, a currency the receiving seller can't use, or an origin seller that isn't validated. (error) | Field | Type | Description | | --- | --- | --- | | `status_code` | integer | `1` on failure. | | `status_error_details` | string | The error message. | | `status_additional_info` | string | More detail, such as the field or value that failed. | | `status_error_code` | integer | PayMe error code. See the error table above. | | `session` | string | PayMe session ID. Quote it when you contact PayMe support. | ```json { "status_code": 1, "status_error_details": "Invalid description", "status_additional_info": "product_name", "status_error_code": 353, "session": "FhT3aXe7" } ``` ### 500 — A missing field or key, sellers that can't transfer to each other, or a service that isn't enabled. (error) | Field | Type | Description | | --- | --- | --- | | `status_code` | integer | `1` on failure. | | `status_error_details` | string | The error message. | | `status_additional_info` | string | More detail, such as the field or value that failed. | | `status_error_code` | integer | PayMe error code. See the error table above. | | `session` | string | PayMe session ID. Quote it when you contact PayMe support. | ```json { "status_code": 1, "status_error_details": "The service was not activated", "status_additional_info": "funds-transfer", "status_error_code": 720, "session": "FhT3aXe7" } ```