# Account transfer

The payer sends money to the recipient's bank account by account number. The payment works
like an [SBP payment](sbp.md): the same API method, statuses, callbacks and retry rules. What
differs is `payment_method` and the requisite.

| | Card transfer | Account transfer |
| --- | --- | --- |
| `payment_method` | `card_transfer` | `account_transfer` |
| What the payer gets | a card number in `requisite` | an account number in `requisite` |
| How the payer pays | a transfer by card number | a transfer by account number in the bank app |

## Create a payment { #create }

`POST /api/v1/payments` with `payment_method: "account_transfer"`. The request is
[signed](signing.md) the same way as for SBP.

```json
{
  "merchant_payment_id": "order-1004",
  "amount": "30000.00",
  "payment_method": "account_transfer",
  "bank_code": "Промсвязьбанк",
  "is_intrabank": true
}
```

All fields and rules are in [SBP payments → Request fields](sbp.md#request-fields); allowed
methods, banks and amounts are in [Contract limits](sbp.md#contract-limits). The method must be
in your project's contract.

`bank_code` is the payer's bank, a name from the [bank directory](banks.md) (not a BIC).
`is_intrabank: true` together with `bank_code` means a transfer within that bank: the recipient
account is in the same bank as the payer's (for example, Promsvyazbank → Promsvyazbank).
Without these fields the account is picked from all available banks. Transfers within
Promsvyazbank, the link into the bank app and what to show the payer are on the
[Promsvyazbank](psb.md) page.

## Response { #response }

Response `201 Created`:

```json
{
  "id": "9c4e2f1a-6b7d-4c8e-a1f2-3b4c5d6e7f80",
  "merchant_payment_id": "order-1004",
  "status": "processing",
  "amount": 30000,
  "initial_amount": 30000,
  "currency": "RUB",
  "geo_code": "RU",
  "payment_method": "account_transfer",
  "bank_code": "Промсвязьбанк",
  "is_intrabank": true,
  "requisite": "40817810000000000001",
  "requisite_bank": "Промсвязьбанк",
  "holder_name": "Иван С.",
  "created_at": "2026-10-13T09:30:00Z",
  "updated_at": "2026-10-13T09:30:01Z"
}
```

- `requisite` — the recipient's account number;
- `holder_name` — the recipient as the payer will see them in the bank;
- `requisite_bank` — the account's bank.

The other response fields and `merchant_information` are the same as for SBP:
[Response](sbp.md#response) and [`merchant_information`](sbp.md#merchant-information).

## What to show the payer { #payer-screen }

- **Account number** — the whole `requisite`, with a "Copy" button. Do not shorten it, and if
  you group digits with spaces, let the payer copy the number without them.
- **Recipient and bank** — `holder_name` and `requisite_bank`: the payer checks the transfer
  against them.
- **Amount** — exactly `amount`, in one transfer.
- **Time limit** — a countdown from `created_at` for your project's payment lifetime
  (15 minutes by default).

!!! warning "The account is for this payment only"
    Do not store the account number or show it again. Create a new payment for a new
    transfer.

## Statuses and result { #result }

Statuses, callbacks and polling are the same as for SBP:
[Statuses](sbp.md#statuses) and [Getting the result](sbp.md#result).

## Edge cases { #edge-cases }

Everything in [SBP payments → Edge cases](sbp.md#edge-cases) applies to account transfers as
well. In addition:

- **No accounts in the requested bank.** `bank_code` and `is_intrabank` narrow the choice; if
  nothing fits, the response is `422 payment_not_routable`. Retry without these fields.
- **The method is not in the contract** — `422 payment_not_covered`: ask
  your manager to enable `account_transfer`.