---
title: "Create transfers"
slug: "create-transfers"
updated: 2026-01-08T07:25:47Z
published: 2026-01-08T07:25:49Z
---

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

# Create transfers

Post/transfers

The Transfers API allows you to transfer balances: i) from your sub-accounts to your master account and vice versa, ii) between your sub-accounts. Use this to manage, or split payments between your platform and your sub accounts within the Xendit ecosystem.

> You can only create transfers using the Platform's API key. Sub-accounts that you manage through xenPlatform have no ability to create transfers through this endpoint

SecurityHTTPType basic

Body parameters<select class='api-response-data' aria-label='Media type'><option value='fbae950e-534a-46ba-892b-72061e979950'>application/json</option>
</select>object  referencestring    Required

A unique reference for this Transfer that you set when making the request

amountnumber    Required
source_user_idstring    Required

The source of the transfer. This is the user_id of either your master or sub account

destination_user_idstring    Required

The destination of the transfer. This is the `user_id` of either your master or sub account

Responses200<select class='api-response-data' aria-label='Media type'><option value='056480d4-e6a0-4c25-9076-15ededccd162'>application/json</option>
</select><select class='select-example' aria-label='Media type'><option value='ff8af8bd-e839-4912-a953-24af9c2ae036'>Transfer</option>
</select>Transfer

```json
{
  "created": "2020-11-30T02:47:53.061Z",
  "transfer_id": "bd1cc56b-ce7f-4ad7-8901-3eaa689e90eb",
  "source_user_id": "`5cafeb170a2b18519b1b8768",
  "destination_user_id": "5f8d0c0603ffe06b7d4d9fcf",
  "status": "SUCCESSFUL",
  "amount": "90000",
  "reference": "Monthly_Transfers_1234"
}
```

object  

Object that would be generated upon creation of a Transfer

createdstring  (date-time)    

Timestamp of when the object was created

transfer_idstring    

A unique reference for this Transfer set by Xendit systems

referencestring    

A unique reference for this Transfer that you set when making the request

source_user_idstring    

The source of the transfer. This is the user_id of either your master or sub account

destination_user_idstring    

The destination of the transfer. This is the `user_id` of either your master or sub account

statusstring    

The status of the Transfer. Available values `SUCCESSFUL`,`PENDING`, `FAILED`

amountnumber    

The amount that was transferred

400<select class='api-response-data' aria-label='Media type'><option value='267e1462-084b-43dd-bf4e-a66493fd2674'>application/json</option>
</select><select class='select-example' aria-label='Media type'><option value='43774a43-b4ba-4aa0-9527-a41bd1a19cc9'>API_VALIDATION_ERROR</option>
<option value='092a2d25-5679-487f-add7-75fecdca20f2'>INVALID_JSON_FORMAT</option>
<option value='e69ddd27-6b22-4dd9-8aca-e3783de499b4'>INVALID_SOURCE_OR_DESTINATION_ERROR</option>
<option value='56f68726-043a-4173-8527-81a0e4c91a38'>INSUFFICIENT_BALANCE</option>
<option value='f3a15a3d-16a9-4eb1-8856-a45ade043214'>MISMATCH_PAYLOAD_FOR_REFERENCE</option>
<option value='1c27fc93-a90d-4dc0-9446-f67168c8a438'>INVALID_AMOUNT</option>
</select>API_VALIDATION_ERROR

```json
{
  "error_code": "API_VALIDATION_ERROR",
  "message": "Inputs are failing validation. The errors field contains details about which fields are violating validation.",
  "errors": [
    "Detailed description here"
  ]
}
```

INVALID_JSON_FORMAT

```json
{
  "error_code": "INVALID_JSON_FORMAT",
  "message": "The request body is not a valid JSON format.",
  "errors": [
    "Detailed description here"
  ]
}
```

INVALID_SOURCE_OR_DESTINATION_ERROR

```json
{
  "error_code": "INVALID_SOURCE_OR_DESTINATION_ERROR",
  "message": "Source or destination account does not exist. Please input a valid business ID within your xenPlatform account.",
  "errors": [
    "Detailed description here"
  ]
}
```

INSUFFICIENT_BALANCE

```json
{
  "error_code": "INSUFFICIENT_BALANCE",
  "message": "The cash balance of your source account is insufficient.",
  "errors": [
    "Detailed description here"
  ]
}
```

MISMATCH_PAYLOAD_FOR_REFERENCE

```json
{
  "error_code": "MISMATCH_PAYLOAD_FOR_REFERENCE",
  "message": "Reference has been used before. If you'd like to retry this transfer, please use the same payload as your previous request.",
  "errors": [
    "Detailed description here"
  ]
}
```

INVALID_AMOUNT

```json
{
  "error_code": "INVALID_AMOUNT",
  "message": "Transfer amount has to be greater than 0, Transfer amount of IDR currency should not have decimal point, Transfer amount of PHP currency can only have max 2 decimal point.",
  "errors": [
    "Detailed description here"
  ]
}
```

object  

Inputs are failing validation. The errors field contains details about which fields are violating validation.

error_codestring    Valid values[
  "API_VALIDATION_ERROR",
  "INVALID_CONFIGURATION",
  "INVALID_JSON_FORMAT",
  "TYPE_AND_CONFIGURATION_CONFLICT",
  "INVALID_SOURCE_OR_DESTINATION_ERROR",
  "INSUFFICIENT_BALANCE",
  "INVALID_FEE_AMOUNT",
  "DUPLICATE_ERROR",
  "INVALID_AMOUNT",
  "INSUFFICIENT_ACCOUNT_HOLDER_DATA",
  "MISMATCH_PAYLOAD_FOR_REFERENCE",
  "INVALID_URL_FORMAT"
]
messagestring    
errors Array  OneOfstringstring
objectobject

401

Validation error

<select class='api-response-data' aria-label='Media type'><option value='8d5a2baa-9ad7-415c-bda0-e369bdabf384'>application/json</option>
</select><select class='select-example' aria-label='Media type'><option value='536cdbaa-2810-415e-b503-b8e3933e66f6'>INVALID_API_KEY</option>
</select>INVALID_API_KEY

```json
{
  "error_code": "INVALID_API_KEY",
  "message": "The API key format is invalid",
  "errors": [
    "Detailed description here"
  ]
}
```

object  

Invalid API key

error_codestring    Valid values[
  "INVALID_API_KEY"
]
messagestring    
errors Array  OneOfstringstring
objectobject

403<select class='api-response-data' aria-label='Media type'><option value='a77d8e79-3b42-4fe5-a736-4491363565d9'>application/json</option>
</select><select class='select-example' aria-label='Media type'><option value='9cbe4442-4598-46bb-8888-bd34c3cc0593'>REQUEST_FORBIDDEN_ERROR</option>
<option value='02d1b264-e79c-4482-b4e0-2ef51c7d0d64'>DUPLICATE_REFERENCE</option>
<option value='18a70ddb-8103-4145-b77b-60ebc068d0c3'>XEN_PLATFORM_SUB_ACCOUNT_NOT_LIVE</option>
<option value='326d15b2-6cc3-49b3-9f71-786093344a5a'>API_KEY_ENVIRONMENT_NOT_MATCH</option>
</select>REQUEST_FORBIDDEN_ERROR

```json
{
  "error_code": "REQUEST_FORBIDDEN_ERROR",
  "message": "API key in use does not have necessary permissions to perform the request. Please assign proper permissions for the key",
  "errors": [
    "Detailed description here"
  ]
}
```

DUPLICATE_REFERENCE

```json
{
  "error_code": "DUPLICATE_REFERENCE",
  "message": "The reference parameter should be unique.",
  "errors": [
    "Detailed description here"
  ]
}
```

XEN_PLATFORM_SUB_ACCOUNT_NOT_LIVE

```json
{
  "error_code": "XEN_PLATFORM_SUB_ACCOUNT_NOT_LIVE",
  "message": "Your source or destination account is not live yet. Please specify live accounts for live transfers.",
  "errors": [
    "Detailed description here"
  ]
}
```

API_KEY_ENVIRONMENT_NOT_MATCH

```json
{
  "error_code": "API_KEY_ENVIRONMENT_NOT_MATCH",
  "message": "Use your LIVE API key to transfer between LIVE accounts, or use TEST API key to transfer between TEST accounts.",
  "errors": [
    "Detailed description here"
  ]
}
```

object  

Forbidden request

error_codestring    Valid values[
  "REQUEST_FORBIDDEN_ERROR",
  "FEATURE_NOT_ACTIVATED",
  "DUPLICATE_REFERENCE",
  "XEN_PLATFORM_SUB_ACCOUNT_NOT_LIVE",
  "API_KEY_ENVIRONMENT_NOT_MATCH",
  "CHANNEL_ACTIVATION_IN_PROGRESS",
  "CHANNEL_HAS_BEEN_ACTIVATED",
  "KYC_VERIFICATION_IN_PROGRESS"
]
messagestring    
errors Array  OneOfstringstring
objectobject

425<select class='api-response-data' aria-label='Media type'><option value='5b464518-3709-4d62-ad97-ae9027403ee3'>application/json</option>
</select><select class='select-example' aria-label='Media type'><option value='b106c9b0-db28-4454-8dce-69a461d63da7'>TRANSFER_IN_PROGRESS</option>
</select>TRANSFER_IN_PROGRESS

```json
{
  "error_code": "TRANSFER_IN_PROGRESS",
  "message": "Transfer is currently being processed. Use `GET Transfer By Reference` to check its latest status",
  "errors": [
    "Detailed description here"
  ]
}
```

object  

Transfer is currently being processed. Use GET Transfer By Reference to check its latest status

error_codestring    Valid values[
  "TRANSFER_IN_PROGRESS"
]
messagestring    
errors Array  OneOfstringstring
objectobject
