# API Direta (Transferências Inteligentes)

Sem ambiente Sandbox
Smart Transfers não está disponível no Sandbox no momento. Para testar sua integração, use o ambiente de Produção com contas reais.

Com as Transferências Inteligentes, seu usuário aprova uma Autorização de Pagamento uma vez no banco, e você pode então acionar transferências Pix para outra conta que ele possua, sempre que necessário, dentro dos limites aprovados. Neste guia, mostraremos:

- o fluxo geral de dados
- como criar uma Autorização de Pagamento e seus limites
- como acionar uma Cobrança contra uma Autorização de Pagamento autorizada
- como acompanhar autorizações e Cobranças com webhooks
- como cancelar uma Cobrança agendada ou uma autorização, e como alterar a conta beneficiária


Pré-requisitos
Por favor, certifique-se de ter concluído todas as etapas em nosso artigo dedicado de pré-requisitos antes de continuar este guia.

Cabeçalho de versão necessário
Toda solicitação neste guia deve incluir o cabeçalho `X-Belvo-API-Resource-Version: Payments-BR.V2`. Sem ele, a Belvo responde com `404 - Not Found`.

## Visão geral do fluxo de dados

Como você pode ver no diagrama abaixo, o fluxo envolve:

1. Criar uma Autorização de Pagamento e redirecionar seu usuário para o banco dele para aprová-la.
2. Aguardar a autorização se tornar `AUTHORIZED`.
3. Criar uma Cobrança cada vez que você quiser mover fundos.
4. Acompanhar cada Cobrança até que ela esteja `SETTLED` (ou `FAILED`).



```mermaid
sequenceDiagram
    autonumber
    participant App as Your application
    participant Belvo as Belvo
    participant Bank as User's bank

    App->>Belvo: POST /payments/br/payment-authorizations/
    Belvo-->>App: 201 - Created (authorization_url)
    App->>Bank: Redirect the user to authorization_url
    Note over Bank: The user reviews and approves the limits
    Bank-->>App: User returns to your return_url
    Belvo-->>App: WEBHOOK PAYMENT_AUTHORIZATION
    App->>Belvo: GET /payments/br/payment-authorizations/{id}/
    Belvo-->>App: 200 - OK (status: AUTHORIZED)

    rect rgba(0, 100, 255, .05)
        Note over App,Bank: Repeat whenever you need to move funds
        App->>Belvo: POST /payments/br/payment-authorizations/{id}/charges/
        Belvo->>Bank: Pix transfer request
        Belvo-->>App: 201 - Created
        Belvo-->>App: WEBHOOK CHARGE
        App->>Belvo: GET /payments/br/payment-authorizations/{id}/charges/{charge_id}/
        Belvo-->>App: 200 - OK (status: SETTLED)
    end
```

## Criar uma Autorização de Pagamento

A Autorização de Pagamento é o consentimento que seu usuário dá no banco. Ela define a conta que recebe os fundos e os limites que cada Cobrança deve respeitar.

Você pode criar a Autorização de Pagamento de duas maneiras:

- **Com um cliente e conta bancária existentes:** envie o `id` de um cliente e de uma conta bancária que você já criou na Belvo, em `payer.customer` e `beneficiary.target`.
- **Com um novo cliente e conta bancária:** envie os detalhes deles na mesma solicitação: `payer.customer` com o `identifier` e `name` do pagador, e `beneficiary.target` com o `holder` e `details` da conta. A Belvo cria o cliente e a conta bancária junto com a Autorização de Pagamento.


Para criar uma, faça uma solicitação POST Criar uma Autorização de Pagamento:

Com cliente e conta bancária existentes

```shell Criar uma Autorização de Pagamento
curl --request POST 'https://api.belvo.com/payments/br/payment-authorizations/' \
  -u SECRET_ID:SECRET_PASSWORD \
  -H 'Content-Type: application/json' \
  -H 'X-Belvo-API-Resource-Version: Payments-BR.V2' \
  --data '{
    "payment_method": "PIX_OF_SMART_TRANSFERS",
    "description": "Recarga da sua conta Acme",
    "external_id": "c169a8a9-e9f5-48db-9f4a-818caef9356b",
    "return_url": "https://www.acmecorp.com/smart-transfers/return",
    "expiration_date_time": "2027-10-16T23:59:59Z",
    "payer": {
      "customer": "4714c93c-0132-4da4-b8fe-659515e1b1b6",
      "institution": "600f1b4a-1ef9-4f89-b341-1a35f0c32cc0"
    },
    "beneficiary": {
      "type": "BANK_ACCOUNT",
      "target": "a80d5a9d-20ae-479a-8dd7-ff3443bcbbfc"
    },
    "payment_method_configuration": {
      "total_allowed_amount": "5000.00",
      "payment_transaction_limit": "500.00",
      "periodic_limits": {
        "day": {
          "quantity_limit": 2,
          "transaction_limit": "500.00"
        },
        "month": {
          "transaction_limit": "2000.00"
        }
      },
      "start_date_time": "2026-10-16T14:30:00Z"
    },
    "metadata": {
      "internal_reference_id": "GGq73487w2"
    }
  }'
```

Com novo cliente e conta bancária

```shell Criar uma Autorização de Pagamento
curl --request POST 'https://api.belvo.com/payments/br/payment-authorizations/' \
  -u SECRET_ID:SECRET_PASSWORD \
  -H 'Content-Type: application/json' \
  -H 'X-Belvo-API-Resource-Version: Payments-BR.V2' \
  --data '{
    "payment_method": "PIX_OF_SMART_TRANSFERS",
    "description": "Recarga da sua conta Acme",
    "external_id": "c169a8a9-e9f5-48db-9f4a-818caef9356b",
    "return_url": "https://www.acmecorp.com/smart-transfers/return",
    "expiration_date_time": "2027-10-16T23:59:59Z",
    "payer": {
      "customer": {
        "identifier": "12345678909",
        "name": "Caetano Veloso"
      },
      "institution": "600f1b4a-1ef9-4f89-b341-1a35f0c32cc0"
    },
    "beneficiary": {
      "type": "BANK_ACCOUNT",
      "target": {
        "holder": {
          "identifier": "12345678909",
          "name": "Caetano Veloso"
        },
        "details": {
          "account_type": "CHECKINGS",
          "agency": "0001",
          "institution": "f512d996-583a-4a91-8b5b-eba2e103b068",
          "number": "457220"
        }
      }
    },
    "payment_method_configuration": {
      "total_allowed_amount": "5000.00",
      "payment_transaction_limit": "500.00",
      "periodic_limits": {
        "day": {
          "quantity_limit": 2,
          "transaction_limit": "500.00"
        },
        "month": {
          "transaction_limit": "2000.00"
        }
      },
      "start_date_time": "2026-10-16T14:30:00Z"
    },
    "metadata": {
      "internal_reference_id": "GGq73487w2"
    }
  }'
```

O beneficiário deve ser a própria conta do pagador
Smart Transfers só movimenta dinheiro entre contas de mesma titularidade, seja pessoa física ou jurídica. Para um pagador individual, `beneficiary.target.holder.identifier` deve ser o CPF do pagador (`payer.customer.identifier`). Para um pagador empresarial, o CNPJ do beneficiário deve compartilhar a raiz do CNPJ do pagador (primeiros oito dígitos).

Se você enviar um titular diferente, a autorização será criada com status `FAILED` e a solicitação retornará um erro. Se você usar um `id` de conta bancária existente como alvo, certifique-se de que ela pertence ao pagador.

| Parâmetro | Obrigatório | Descrição |
|  --- | --- | --- |
| `payment_method` | true | Deve ser `PIX_OF_SMART_TRANSFERS`. |
| `description` | true | Uma descrição para sua referência interna. Mantenha em até 128 caracteres. |
| `external_id` | opcional (altamente recomendado) | Seu próprio identificador para esta autorização, como um **UUID**. A Belvo não impõe unicidade, então use-o para correlacionar a autorização com seus registros, não para evitar duplicatas. |
| `return_url` | true | A URL para a qual seu usuário é redirecionado após aprovar (ou rejeitar) a autorização no banco. Em caso de falha, a Belvo adiciona os parâmetros de consulta `error` e `error_description`. |
| `expiration_date_time` | opcional | Quando a autorização para de aceitar Cobranças, no formato ISO 8601. Deve estar no futuro e após `start_date_time`. O consentimento expira às 23:59:59 UTC nessa data. Se você omitir, a autorização não expira em uma data (ainda pode ser consumida ou revogada). |
| `payer.customer` | true | A pessoa ou empresa que paga. Pode ser um `id` de cliente existente na Belvo, ou um objeto com o `identifier` (CPF ou CNPJ) e `name` do pagador. Se o cliente ainda não existir, a Belvo o cria. |
| `payer.institution` | true | O `id` da Belvo do banco do pagador. Use o endpoint Listar todas as instituições de pagamento para obtê-lo. |
| `payer.account_details` | opcional | A conta específica a ser debitada. Se você omitir, o usuário escolhe a conta no banco. Veja Debitar uma conta específica abaixo. |
| `beneficiary.type` | true | Deve ser `BANK_ACCOUNT`. |
| `beneficiary.target` | true | A conta que recebe os fundos. Pode ser um `id` de conta bancária existente, ou um objeto de conta bancária com `holder` (`identifier`, `name`) e `details` (`account_type`: `CHECKINGS`, `SAVINGS` ou `PAYMENTS`; `agency`; `institution`; `number`). Deve ser de titularidade do pagador (veja o aviso acima). |
| `payment_method_configuration` | true | Os limites para esta autorização. O objeto é obrigatório, mas cada campo dentro dele é opcional. Veja Limites de autorização abaixo. |
| `metadata` | opcional | Até 50 pares chave-valor para seu próprio uso. Chaves de até 40 caracteres, valores de string de até 500 caracteres, sem aninhamento. |


### Debitar uma conta específica

Por padrão, o usuário escolhe de qual de suas contas deseja pagar quando aprova a autorização no banco. Se você já souber qual conta debitar, por exemplo, porque monitora seu saldo com a Agregação Bancária, envie os detalhes dessa conta em `payer.account_details`. O usuário só poderá aprovar a autorização para essa conta, e cada Cobrança a debitará.


```json payer with account_details
"payer": {
  "customer": "4714c93c-0132-4da4-b8fe-659515e1b1b6",
  "institution": "600f1b4a-1ef9-4f89-b341-1a35f0c32cc0",
  "account_details": {
    "account_type": "CACC",
    "ispb": "12345678",
    "issuer": "6272",
    "number": "11188222"
  }
}
```

| Campo  | Descrição |
|  --- | --- |
| `account_type` | O tipo de conta: `CACC` (corrente), `SVGS` (poupança), `SLRY` (salário) ou `TRAN` (conta de pagamento). |
| `ispb` | O código ISPB de 8 dígitos do banco do pagador. |
| `issuer` | O código da agência da conta, até 4 dígitos. Na Agregação Bancária, este é o `agency` da conta. |
| `number` | O número da conta, até 20 dígitos. Na Agregação Bancária, este é o `number` da conta. |


Se você enviar `account_details`, inclua todos os quatro campos. `payer.institution` ainda é necessário e deve ser a instituição de pagamentos do mesmo banco que o `ispb`.

### Limites de autorização

Os limites em `payment_method_configuration` são o que seu usuário vê e aprova no banco, então defina-os para cobrir as transferências que você espera realizar, e nada mais.

| Campo | Descrição |
|  --- | --- |
| `total_allowed_amount` | O total máximo de todas as Cobranças durante a vigência da autorização, como uma string (mínimo `0.01`). Quando é totalmente utilizado, a autorização se torna `CONSUMED`. |
| `payment_transaction_limit` | O valor máximo de uma única Cobrança, como uma string. Não deve ser maior que `total_allowed_amount`. |
| `periodic_limits` | Limites por janela de calendário. Inclua qualquer um de `day`, `week`, `month` ou `year`. Cada janela que você incluir deve definir **pelo menos um** de `quantity_limit` (o número máximo de Cobranças bem-sucedidas nessa janela, mínimo `1`) e `transaction_limit` (o valor total máximo cobrado nessa janela, como uma string). Alcançar o limite de uma janela apenas bloqueia Cobranças até que a janela seja reiniciada; não consome a autorização. |
| `start_date_time` | Quando a autorização começa a aceitar Cobranças, no formato ISO 8601. Pode ser imediata, mas não no passado. Se você omitir, as Cobranças podem começar a partir do dia em que a autorização é criada. |


Quem verifica os limites
Quando você cria uma Cobrança, a Belvo a rejeita imediatamente se o valor estiver acima de `payment_transaction_limit` ou `total_allowed_amount`. Totais acumulados e os `periodic_limits` são aplicados pelo banco do usuário, então uma Cobrança que os exceda é criada e depois passa para `FAILED` com um `status_reason_code` como `CHARGE_PERIOD_LIMIT_REACHED`.

A resposta contém o `id` da autorização e o `authorization_url`:


```json Response: 201 - Created
{
  "id": "9fc68b84-f2d6-4142-b2ad-9d2d1ad70432", // [!code highlight]
  "created_at": "2026-10-16T14:30:02Z",
  "updated_at": "2026-10-16T14:30:02Z",
  "authorized_at": null,
  "status": "AWAITING_AUTHORIZATION",
  "status_reason_code": null,
  "status_reason_message": null,
  "status_updated_at": "2026-10-16T14:30:02Z",
  "payment_method": "PIX_OF_SMART_TRANSFERS",
  "description": "Recarga da sua conta Acme",
  "external_id": "c169a8a9-e9f5-48db-9f4a-818caef9356b",
  "return_url": "https://www.acmecorp.com/smart-transfers/return",
  "expiration_date_time": "2027-10-16T23:59:59Z",
  "payer": {
    "customer": "4714c93c-0132-4da4-b8fe-659515e1b1b6",
    "institution": "600f1b4a-1ef9-4f89-b341-1a35f0c32cc0",
    "representative_identifier": null,
    "bank_account": null
  },
  "beneficiary": {
    "type": "BANK_ACCOUNT",
    "target": "a80d5a9d-20ae-479a-8dd7-ff3443bcbbfc"
  },
  "payment_method_configuration": {
    "total_allowed_amount": "5000.00",
    "payment_transaction_limit": "500.00",
    "periodic_limits": {
      "day": {
        "quantity_limit": 2,
        "transaction_limit": "500.00"
      },
      "month": {
        "transaction_limit": "2000.00"
      }
    },
    "start_date_time": "2026-10-16T14:30:00Z",
    "authorization_url": "https://institution.example.com/authorize?client_id=..." // [!code highlight]
  },
  "charges": [],
  "metadata": {
    "internal_reference_id": "GGq73487w2"
  }
}
```

Certifique-se de salvar o `id`: você precisará dele para criar Cobranças. Em seguida, redirecione seu usuário para `payment_method_configuration.authorization_url`.

Validade da URL de autorização
Cada banco define por quanto tempo sua `authorization_url` permanece válida, podendo ser de apenas alguns minutos até cerca de 60 minutos. Se expirar antes que seu usuário aprove, crie uma nova Autorização de Pagamento. Uma autorização não pode ser renovada.

## Aguarde a autorização ser aprovada

Seu usuário aprova (ou rejeita) a autorização no banco e é então redirecionado para o seu `return_url`. Sempre que o status da autorização muda, a Belvo envia um webhook `PAYMENT_AUTHORIZATION`. Webhooks da versão 2 não carregam o status, então busque a autorização para lê-lo:


```json Webhook PAYMENT_AUTHORIZATION
{
  "schema_version": "2.0.0",
  "resource": "PAYMENT_AUTHORIZATION", // [!code highlight]
  "resource_id": "9fc68b84-f2d6-4142-b2ad-9d2d1ad70432", // [!code highlight]
  "resource_version": "V2",
  "timestamp": "2026-10-16T14:33:10Z"
}
```


```shell Obter a Autorização de Pagamento
curl --request GET 'https://api.belvo.com/payments/br/payment-authorizations/{payment_authorization_id}/' \
  -u SECRET_ID:SECRET_PASSWORD \
  -H 'X-Belvo-API-Resource-Version: Payments-BR.V2'
```

Uma vez que o `status` seja `AUTHORIZED`, você pode criar Cobranças. `payer.bank_account` então mostra a conta (mascarada) que o usuário escolheu para pagar. Se o status for `FAILED`, verifique `status_reason_code`; por exemplo, `USER_REJECTED` significa que seu usuário recusou no banco. Veja Referência de Status para todos os status.

## Criar uma Cobrança

Cada Cobrança move um valor da conta do pagador para a conta do beneficiário na autorização. Faça uma solicitação POST Criar uma Cobrança para o endpoint de Cobranças da autorização:


```shell Create a charge
curl --request POST 'https://api.belvo.com/payments/br/payment-authorizations/{payment_authorization_id}/charges/' \
  -u SECRET_ID:SECRET_PASSWORD \
  -H 'Content-Type: application/json' \
  -H 'X-Belvo-API-Resource-Version: Payments-BR.V2' \
  --data '{
    "amount": "150.50",
    "date": "2026-10-16",
    "statement_description": "Acme top-up",
    "external_id": "5f0b8f3e-3c1a-4a7e-9d61-1d2b7a1e9c42",
    "metadata": {
      "internal_reference_id": "GGq73487w2"
    }
  }'
```

| Parâmetro | Obrigatório | Descrição |
|  --- | --- | --- |
| `amount` | true | O valor a ser transferido, como uma string com duas casas decimais (mínimo `0.01`). Não deve ser maior que o `payment_transaction_limit` ou `total_allowed_amount` da autorização. |
| `date` | true | A data em que a transferência deve ocorrer, no formato `YYYY-MM-DD`. Pode ser hoje. Deve ser na data `start_date_time` da autorização (ou na data de criação, se você não definiu uma), comparada em UTC: tarde da noite em Brasília, "hoje" pode já ser amanhã em UTC. Uma data futura cria uma Cobrança `SCHEDULED`. |
| `statement_description` | true | A descrição exibida no extrato bancário do seu usuário (1 a 140 caracteres). |
| `external_id` | opcional (altamente recomendado) | Seu próprio identificador para esta Cobrança, como um **UUID**. A Belvo não impõe unicidade. |
| `metadata` | opcional | Pares chave-valor para seu próprio uso, com as mesmas regras da autorização. |


Cobranças sempre pagam o beneficiário da autorização
Você não pode enviar um beneficiário diferente em uma Cobrança. Toda Cobrança paga a conta definida na Autorização de Pagamento.


```json Response: 201 - Created
{
  "id": "0d3ffb69-f83b-456e-ad8e-208d0998d71d", // [!code highlight]
  "created_at": "2026-10-16T15:00:01Z",
  "status": "PENDING",
  "status_reason_code": null,
  "status_reason_message": null,
  "status_updated_at": "2026-10-16T15:00:01Z",
  "payment_authorization": "9fc68b84-f2d6-4142-b2ad-9d2d1ad70432",
  "payment_method": "PIX_OF_SMART_TRANSFERS",
  "amount": "150.50",
  "date": "2026-10-16",
  "statement_description": "Acme top-up",
  "end_to_end_id": "E12345678202610161500abcDEF12345",
  "beneficiary": {
    "bank_account": {
      "id": "a80d5a9d-20ae-479a-8dd7-ff3443bcbbfc",
      "details": {
        "account_type": "CHECKINGS",
        "agency": "0001",
        "code": "260",
        "institution": "f512d996-583a-4a91-8b5b-eba2e103b068",
        "number": "**7220"
      },
      "holder": {
        "identifier": "12345678909",
        "name": "Caetano Veloso"
      }
    }
  },
  "payer": {},
  "external_id": "5f0b8f3e-3c1a-4a7e-9d61-1d2b7a1e9c42",
  "metadata": {
    "internal_reference_id": "GGq73487w2"
  },
  "previous": null,
  "next": null
}
```

Certifique-se de salvar o `id` da Cobrança. O `end_to_end_id` é o identificador de ponta a ponta do Pix para a transferência; use-o para reconciliar o pagamento. `payer` permanece vazio até que o banco retorne a conta debitada.

Um 201 não significa que a Cobrança foi bem-sucedida
Se o banco rejeitar a Cobrança imediatamente, a Belvo ainda responde com `201 - Created`, mas o `status` da Cobrança já é `FAILED`, e **nenhum webhook é enviado** para essa transição. Sempre verifique o `status` na resposta antes de esperar por um webhook.

## Ouça os webhooks de Charge

A Belvo envia um webhook `CHARGE` sempre que o status de uma Charge muda. Assim como na autorização, busque a Charge para ler seu status:


```json Webhook CHARGE
{
  "schema_version": "2.0.0",
  "resource": "CHARGE", // [!code highlight]
  "resource_id": "0d3ffb69-f83b-456e-ad8e-208d0998d71d", // [!code highlight]
  "resource_version": "V2",
  "timestamp": "2026-10-16T15:00:07Z"
}
```


```shell Obtenha a charge
curl --request GET 'https://api.belvo.com/payments/br/payment-authorizations/{payment_authorization_id}/charges/{charge_id}/' \
  -u SECRET_ID:SECRET_PASSWORD \
  -H 'X-Belvo-API-Resource-Version: Payments-BR.V2'
```

Uma Charge é bem-sucedida quando seu `status` é `SETTLED`. Para o formato do webhook, entrega e política de reintento, veja Webhooks de Pagamentos (Brasil).

O que SETTLED confirma
`SETTLED` confirma que os fundos **saíram da conta do pagador**. A Belvo trabalha com o banco do pagador via Open Finance, então não vê o lado do beneficiário. Confirme o crédito na conta receptora você mesmo.

Concluído!
Você criou uma Autorização de Pagamento, esperou seu usuário aprová-la e moveu fundos com uma Charge. Crie mais Charges contra a mesma autorização sempre que precisar, dentro de seus limites.

## Cancelar uma Cobrança ou uma autorização

| Ação | Endpoint | Quando é permitido |
|  --- | --- | --- |
| Cancelar uma Cobrança agendada | `POST /payments/br/payment-authorizations/{payment_authorization_id}/charges/{charge_id}/cancel/` | A Cobrança está `PENDING` ou `SCHEDULED`, sua `date` é posterior a hoje (horário de Brasília, limite 23:59), e a autorização está `AUTHORIZED`. A Cobrança se torna `CANCELED`. |
| Cancelar a autorização | `POST /payments/br/payment-authorizations/{payment_authorization_id}/cancel/` | A autorização está `AUTHORIZED`. Ela se torna `REVOKED`, e não podem ser criadas mais Cobranças. |


Ambos retornam `204 - No Content`. A mudança de status ocorre de forma assíncrona, e você recebe um webhook quando isso acontece. Você não pode tentar novamente uma Cobrança de Smart Transfers falhada: crie uma nova Cobrança em vez disso.

## Alterar a conta beneficiária

Enquanto uma Autorização de Pagamento está `AUTHORIZED`, você pode trocar a conta que recebe os fundos para outra conta bancária que você já registrou, sem pedir ao seu usuário para aprovar uma nova autorização. Faça uma solicitação PATCH Alterar o beneficiário de uma Autorização de Pagamento:


```shell Alterar a conta beneficiária
curl --request PATCH 'https://api.belvo.com/payments/br/payment-authorizations/{payment_authorization_id}/' \
  -u SECRET_ID:SECRET_PASSWORD \
  -H 'Content-Type: application/json' \
  -H 'X-Belvo-API-Resource-Version: Payments-BR.V2' \
  --data '{
    "beneficiary": {
      "type": "BANK_ACCOUNT",
      "target": "b6278377-f710-4d1a-a026-7bab757256d0"
    }
  }'
```

`target` deve ser o `id` de uma conta bancária existente pertencente à **mesma pessoa ou empresa** que o beneficiário atual. A Belvo responde com `200 - OK` e a Autorização de Pagamento atualizada, e cobranças futuras pagam a nova conta. Se a autorização não estiver `AUTHORIZED`, a Belvo responde com `400 - Bad Request`.

## Referência de Statuses

### Autorização de Pagamento

| Status  | Significado |
|  --- | --- |
| `AWAITING_AUTHORIZATION` | Criado. Aguardando o usuário aprovar no banco. |
| `PARTIALLY_ACCEPTED` | Aguardando mais aprovações no banco (por exemplo, uma conta empresarial que precisa de várias assinaturas). |
| `AUTHORIZED` | Aprovado. Você pode criar Cobranças. |
| `FAILED` | Não aprovado ou não pôde ser criado. Veja `status_reason_code`. |
| `CONSUMED` | O `total_allowed_amount` foi utilizado, ou a autorização expirou. Não é possível criar mais Cobranças. (Atingir um limite de `periodic_limits` não consome a autorização.) |
| `REVOKED` | Cancelado por você, pelo usuário ou pelo banco. Não é possível criar mais Cobranças. |


### Cobrança

| Status  | Significado |
|  --- | --- |
| `PENDING` | Criada e em processamento. |
| `SCHEDULED` | Aceita pelo banco para uma `data` futura. |
| `SETTLED` | Os fundos saíram da conta do pagador. Final. |
| `FAILED` | A transferência não ocorreu. Veja `status_reason_code`. Final. |
| `CANCELED` | Você cancelou a Cobrança antes da data. Final. |


Para a lista completa de valores de `status_reason_code`, veja Códigos e Mensagens de Pagamentos Brasil.

## Erros e casos extremos

| Situação | O que acontece |
|  --- | --- |
| Cabeçalho `X-Belvo-API-Resource-Version` ausente, ou Smart Transfers não está habilitado para sua organização. | `404 - Not Found`. |
| Corpo da solicitação inválido. | `400 - Bad Request` com uma lista de erros `{field, code, message, request_id}`. |
| O banco ou a rede Open Finance rejeita a autorização durante a criação (por exemplo, o beneficiário não é mantido pelo pagador). | A autorização é salva como `FAILED`, e a solicitação atualmente retorna `500 - Internal Server Error` com uma lista de erros `{code, message}`, sem o `id` da autorização. Para encontrá-lo, liste as autorizações do cliente (`GET /payments/br/payment-authorizations/?customer={customer_id}`). |
| Você cria uma Cobrança em uma autorização que não está `AUTHORIZED`. | `400 - Bad Request`: `Payment Authorization is not AUTHORIZED.` |
| O banco rejeita uma Cobrança imediatamente. | `201 - Created` com `status: FAILED`, e sem webhook. |


Sem idempotência ainda
Esses endpoints ainda não suportam chaves de idempotência, e `external_id` não previne duplicatas. Se uma solicitação expirar, busque as Cobranças da autorização (`GET /payments/br/payment-authorizations/{payment_authorization_id}/charges/`) e verifique seu `external_id` antes de tentar novamente, para não transferir duas vezes.