# Transfer to another PayZu account (/en/docs/conta-digital/endpoints/internal-transfers/post_internal_transfer)

## POST /transactions/internal-transfer

`POST https://api.hub.payzu.com.br/api/v1/transactions/internal-transfer`

Scope: `INTERNAL_TRANSFER`. Sends money from your account to another PayZu account, identified by its Pix key. The amount does not go through Pix, and the response already carries the result: `CONFIRMED` means money delivered. The fee is added on top. On a `502` where the bank did not respond or refused temporarily, the transfer stays `REQUESTED` and only the same `Idempotency-Key` returns the original; a definitive refusal leaves the transfer `FAILED`. Request limit: 5 per minute per credential and 10 per account.

### Header params

| Field | Type | Required | Details |
| --- | --- | --- | --- |
| `Idempotency-Key` | string | no | Unique value per operation, 1 to 255 visible ASCII characters, no spaces. Repeating the key with the same amount and destination returns the original operation; with a different amount or destination, `409`. Scoped to the account, no expiration. — minLength: 1; maxLength: 255 |

### Body params

| Field | Type | Required | Details |
| --- | --- | --- | --- |
| `amount` | integer | yes | Amount that reaches the destination. The fee is added on top. In cents. — minimum: 1 |
| `toPixKey` | string | yes | Pix key of another PayZu account. — minLength: 1; maxLength: 77 |
| `comment` | string | no | Text shown on the receipt. — maxLength: 140 |
| `callbackUrl` | string | no | Public HTTPS URL that receives every webhook of this operation, in addition to the registered endpoints. Up to 2048 characters. Requires the account callback secret. The `INTERNAL_TRANSFER_RECEIVED` webhook, which belongs to the destination account, is not sent to it. — format: uri; maxLength: 2048 |

### Responses

**201** Transfer registered.

| Field | Type | Required | Details |
| --- | --- | --- | --- |
| `id` | string | yes | Transfer identifier. The lookup accepts this `id` and the webhook `transferId`. |
| `status` | string | yes | `REQUESTED`: no result yet, after a `502` where the bank did not respond or refused temporarily. `CONFIRMED`: the amount is in the other account. `FAILED`: it did not go out. — `REQUESTED`, `CONFIRMED`, `FAILED` |
| `side` | string | yes | Side your account is on: `SENT` or `RECEIVED`. — `SENT`, `RECEIVED` |
| `amount` | integer | yes | Amount that reached the destination. In cents. |
| `serviceFee` | integer | yes | Fee. `0` on the receiving side. In cents. |
| `totalDebited` | integer | yes | `amount + serviceFee`. `0` on the receiving side. In cents. |
| `counterparty` | object | yes | The other account. |
| `counterparty.name` | string | yes | Name of the other account. |
| `counterparty.document` | string | yes | Document of the other account: masked CPF or formatted CNPJ. Empty when unknown. |
| `counterparty.pixKey` | string | yes | Key of the other account. In full in the `POST` response; in lookups and lists, CPF, email and phone keys are masked. |
| `comment` | string | null | yes | Receipt text. |
| `providerRejectedReason` | string | null | yes | Message ready to display, set when `FAILED`. |
| `callbackUrl` | string | null | yes | The `callbackUrl` sent on creation. `null` when none was sent. `null` on the receiving side. |
| `createdAt` | string | yes | Date and time in ISO 8601, UTC. — format: date-time |
| `confirmedAt` | string | null | yes | When it completed. `null` until it completes. — format: date-time |
| `failedAt` | string | null | yes | When it failed. `null` if it did not fail. — format: date-time |

**400** Invalid request.

| Field | Type | Required | Details |
| --- | --- | --- | --- |
| `message` | string | yes | Description in Portuguese, ready to display. It may change at any time. |
| `code` | string | yes | Stable error code. Your system decides what to do based on it. |
| `details` | object | no | Structured error context, when available. |

**401** Missing, invalid or expired credential.

| Field | Type | Required | Details |
| --- | --- | --- | --- |
| `message` | string | yes | Description in Portuguese, ready to display. It may change at any time. |
| `code` | string | yes | Stable error code. Your system decides what to do based on it. |
| `details` | object | no | Structured error context, when available. |

**403** Not allowed: scope, IP or disabled operation.

| Field | Type | Required | Details |
| --- | --- | --- | --- |
| `message` | string | yes | Description in Portuguese, ready to display. It may change at any time. |
| `code` | string | yes | Stable error code. Your system decides what to do based on it. |
| `details` | object | no | Structured error context, when available. |

**404** Not found, or from another account.

| Field | Type | Required | Details |
| --- | --- | --- | --- |
| `message` | string | yes | Description in Portuguese, ready to display. It may change at any time. |
| `code` | string | yes | Stable error code. Your system decides what to do based on it. |
| `details` | object | no | Structured error context, when available. |

**409** Conflict with the current state.

| Field | Type | Required | Details |
| --- | --- | --- | --- |
| `message` | string | yes | Description in Portuguese, ready to display. It may change at any time. |
| `code` | string | yes | Stable error code. Your system decides what to do based on it. |
| `details` | object | no | Structured error context, when available. |

**412** A step is missing before this operation.

| Field | Type | Required | Details |
| --- | --- | --- | --- |
| `message` | string | yes | Description in Portuguese, ready to display. It may change at any time. |
| `code` | string | yes | Stable error code. Your system decides what to do based on it. |
| `details` | object | no | Structured error context, when available. |

**422** Business rule refusal.

| Field | Type | Required | Details |
| --- | --- | --- | --- |
| `message` | string | yes | Description in Portuguese, ready to display. It may change at any time. |
| `code` | string | yes | Stable error code. Your system decides what to do based on it. |
| `details` | object | no | Structured error context, when available. |

**429** Request limit exceeded.

| Field | Type | Required | Details |
| --- | --- | --- | --- |
| `message` | string | yes | Description in Portuguese, ready to display. It may change at any time. |
| `code` | string | yes | Stable error code. Your system decides what to do based on it. |
| `details` | object | no | Structured error context, when available. |

**502** The bank did not respond or refused.

| Field | Type | Required | Details |
| --- | --- | --- | --- |
| `message` | string | yes | Description in Portuguese, ready to display. It may change at any time. |
| `code` | string | yes | Stable error code. Your system decides what to do based on it. |
| `details` | object | no | Structured error context, when available. |

**503** Lookup service or rate limiter unavailable; nothing was done.

| Field | Type | Required | Details |
| --- | --- | --- | --- |
| `message` | string | yes | Description in Portuguese, ready to display. It may change at any time. |
| `code` | string | yes | Stable error code. Your system decides what to do based on it. |
| `details` | object | no | Structured error context, when available. |