### Transfer a whole series to another reseller

`POST /api/v1/card-batches/{id}/transfer-whole`

Moves every card in the series from one manager to another at an agreed unit price, posting the matching ledger entries on both sides.

- Authentication: manager session (JWT) or API token
- Permission: `prm_cards_change_owner` (Transfer / change card owner)
- Risk: danger
- Rate limit bucket: `t_mutate`
- Idempotent on `request_id`: retrying with the same id returns the original result

#### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `id` | path | integer | yes | Series id. |
| `from_manager_id` | body | integer | yes | The current holder. |
| `to_manager_id` | body | integer | yes | The receiving reseller. |
| `unit_price` | body | number | yes | Price per card, major units. Must be sent explicitly — omitting it is an error, not a zero. |
| `request_id` | body | string | yes | Idempotency key. |

#### Request

```json
{
  "from_manager_id": 41,
  "to_manager_id": 57,
  "unit_price": 140.00,
  "request_id": "c8e1a4b9-7f30-4d62-b0a5-6e2c9d3f1074"
}
```

#### Errors

| Code | Status | When |
| --- | --- | --- |
| `ERR_VALIDATION` | 400 | unit_price omitted, or a request_id that is missing, too long or reserved |
| `ERR_CONFLICT` | 409 | the request_id is already bound to a different transfer |

#### Note

unit_price is a required tri-state and omitting it is refused rather than read as zero. A bare 0 from a client that simply left the field out would mean "give the stock away", which is exactly the defect this check exists to stop. A negative price inverts the transfer.

