# Выпуск карты

## Endpoint

```
POST /cards/request
```

Заголовок `Idempotency-Key` **обязателен** — при одинаковом ключе
повторный вызов вернёт результат первого запроса и не потратит сток.

## Пример запроса

```bash
curl -X POST 'https://b2b.lumowallet.io/cards/request' \
  -H 'X-API-Key: YOUR_API_KEY' \
  -H 'Idempotency-Key: 550e8400-e29b-41d4-a716-446655440000'
```

## Варианты ответа

### Карта выдана сразу

```json
{
  "status": "assigned",
  "card": {
    "id": "8c7f1823-0d43-4618-86ee-fa0c77643cb2",
    "status": "assigned",
    "maskedPan": "4466 ** ** 1234",
    "expiry": "03/29",
    "assignedAt": "2026-04-23T12:00:00Z",
    "createdAt": "2026-04-23T12:00:00Z"
  }
}
```

### Карта поставлена в очередь

```json
{
  "status": "pending",
  "request": {
    "id": "2077f4ef-a03d-4001-82e3-1965e44036e8",
    "status": "pending",
    "cardId": null,
    "createdAt": "2026-04-23T12:00:00Z"
  }
}
```

Когда карта выпустится, вы получите webhook `card.assigned` и поле
`cardId` заполнится. Также можно опрашивать
`GET /cards/requests/{requestId}`.

## Резервирование средств

На момент `POST /cards/request`:

1. Проверяется, что `availableBalance >= openingFee + minInitialDeposit`,
иначе — `400 INSUFFICIENT_FUNDS`.
2. Сумма `openingFee + minInitialDeposit` переводится в `frozenBalance`.
3. При выдаче (статус `assigned`): `openingFee` списывается с `balance`,
`minInitialDeposit` возвращается в доступный баланс.
4. При ошибке моста: вся сумма размораживается.


## Ошибки

| HTTP | Код | Значение |
|  --- | --- | --- |
| 400 | `INSUFFICIENT_FUNDS` | Не хватает `availableBalance` на резерв |
| 403 | `CARDS_NOT_ENABLED` | У компании не подключена программа карт |
| 422 | `BRIDGE_UNAVAILABLE` | Временная ошибка эквайера, попробуйте позже |


## Ограничение

Одна заявка за раз для заданного `Idempotency-Key`. Чтобы выпустить 10
карт — сделайте 10 вызовов с разными ключами.