# Card payments

The payer transfers money to the recipient's card number from their bank app.
The payment works like an [SBP payment](sbp.md): the same API method, statuses,
callbacks and retry rules. What differs is `payment_method` and what `requisite` holds.

| | SBP | Card |
| --- | --- | --- |
| `payment_method` | `sbp` | `card_transfer` |
| `requisite` | phone number: `+79991234567` | card number: `2200123456789010` |
| How the payer pays | "SBP transfer" by phone number | "Card transfer" by card number |

## Create a payment { #create }

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

```json
{
  "merchant_payment_id": "order-1002",
  "amount": "12500.00",
  "payment_method": "card_transfer",
  "bank_code": "sber"
}
```

All fields and rules are in [SBP payments → Request fields](sbp.md#request-fields).
`bank_code` is the payer's bank, a code from our bank catalog (not a BIC): requisites are
picked for it. `is_intrabank: true` together with `bank_code` means a transfer within that
bank: the recipient card is at the same bank as the payer's. Both are rare filters: without
them, requisites come from any bank.

Response `201 Created`:

```json
{
  "id": "7a2d4c1e-9b3f-4e8a-b1c2-3d4e5f6a7b8c",
  "merchant_payment_id": "order-1002",
  "flow": "runtime_live",
  "status": "processing",
  "amount": 12500,
  "initial_amount": 12500,
  "currency": "RUB",
  "geo_code": "RU",
  "payment_method": "card_transfer",
  "bank_code": "sber",
  "is_intrabank": false,
  "callback_url": null,
  "is_test": false,
  "merchant_information": {
    "course": 100.00,
    "rate": 11.00,
    "amount_usdt": "125.0000",
    "amount_rate": "11125.0000",
    "amount_usdt_rate": "111.2500"
  },
  "requisite": "2200123456789010",
  "holder_name": "Мария П.",
  "created_at": "2026-09-29T09:30:00Z",
  "updated_at": "2026-09-29T09:30:01Z"
}
```

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

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

- **Card number** from `requisite` — in groups of four (`2200 1234 5678 9010`), with a
  "Copy" button that copies the number **without spaces**.
- **Recipient** from `holder_name` — the bank shows this name before the transfer.
- **Amount** — exactly `amount`. Warn that bank fees are paid on top: what arrives on the
  card is what gets credited.
- **Deadline** — a countdown from `created_at` over your project's payment lifetime
  (15 minutes by default).

!!! warning "The card number is for this payment only"
    Do not store the card 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). Once a card is issued,
the payment ends only as `completed` or `canceled`, each with a callback; `error` means no
card was issued and shows in the create response.

## Edge cases { #edge-cases }

Everything in [SBP payments → Edge cases](sbp.md#edge-cases) applies to cards too.
Card-specific:

- **Transfer with a fee.** If the payer's bank deducts a fee from the transfer, less
  arrives on the card. The actual amount may be confirmed on a payment re-check; the
  callback then says `completed` with a new `amount`.
- **No cards of the requested bank.** With `bank_code` the choice is narrower; if nothing
  fits, the payment closes with `provider_no_requisites` or the answer is
  `422 payment_not_routable`. Try without `bank_code`.