Выписки
Заказ выписки в банк, ожидание готовности (асинхронно), скачивание в одном из 4 форматов: 1c v1.02 / 1c v1.03 / csv / json.
:::info Требования к токену Все endpoint'ы ниже требуют:
purpose=integration;scope_read_statements=true+ per-accountallow_read_statements=trueна целевом РС. :::
Жизненный цикл заявки
Поток асинхронный: POST создаёт запись в статусе processing и инициирует запрос в банк. Фоновый worker опрашивает банк каждые 30 секунд и обновляет статус. Клиент опрашивает GET /statements/{id} до status=ready, после чего качает в нужном формате.
POST /statements → status=processing
GET /statements/{id} → processing | ready | failed
GET /statements/{id}/export?format=1c → 1C v1.02 / v1.03 (cp1251)
GET /statements/{id}/export?format=csv → UTF-8 CSV
GET /statements/{id}/export?format=json → JSONRequest — POST /statements
POST /api/v1/integration/statements
Заказывает выписку за период. Идемпотентен по external_id: повтор с тем же external_id и теми же параметрами → 200 с существующим statement_id, банк не вызывается повторно.
Тело запроса (application/json)
| Поле | Тип | Обяз. | Описание |
|---|---|---|---|
bank_account_id | uuid | ✓ | РС, по которому заказываем выписку. |
external_id | string | ✓ | Ключ идемпотентности. trim()-нутый, non-empty, ≤256 символов. Должен быть уникальным per-token. Тот же ID + те же параметры → возвращает existing statement, банк не вызывается повторно. |
date_from | date (YYYY-MM-DD) | ✓ | Начало периода. |
date_to | date (YYYY-MM-DD) | ✓ | Конец периода (inclusive). Общая длина периода — не более 31 дня. Шире — 400 validation_error. |
curl --silent --show-error -X POST \
-H "Authorization: Bearer bcs_live_<TOKEN>" \
-H "Content-Type: application/json" \
-d '{
"bank_account_id": "<bank-account-uuid>",
"external_id": "ERP-stmt-2026-05-18-account-123",
"date_from": "2026-05-01",
"date_to": "2026-05-17"
}' \
"https://bsc.example.com/api/v1/integration/statements"{
"statement_id": "<uuid>",
"status": "processing",
"bank_account_id": "<bank-account-uuid>",
"external_id": "ERP-stmt-2026-05-18-account-123",
"date_from": "2026-05-01",
"date_to": "2026-05-17",
"created_at": "2026-05-18T09:48:29Z"
}:::warning Лимит периода — 31 день Этот предел продиктован самым строгим из поддерживаемых банков (тоже самое ограничение действует в их собственных API). Запрашивать выписки за более длинный период — несколькими подряд идущими request'ами по 31 дню. :::
Poll — GET /statements/{statement_id}
GET /api/v1/integration/statements/{statement_id}
Опрос статуса. Рекомендуется не чаще одного раза в 5 секунд (worker сам опрашивает банк каждые 30s, чаще не имеет смысла).
curl --silent --show-error \
-H "Authorization: Bearer bcs_live_<TOKEN>" \
"https://bsc.example.com/api/v1/integration/statements/<statement_id>"{
"statement_id": "<uuid>",
"status": "ready",
"bank_account_id": "<bank-account-uuid>",
"external_id": "ERP-stmt-2026-05-18-account-123",
"date_from": "2026-05-01",
"date_to": "2026-05-17",
"created_at": "2026-05-18T09:48:29Z",
"fetched_at": "2026-05-18T09:48:57Z",
"operations_count": 42
}Поля ответа
| Поле | Тип | Описание |
|---|---|---|
status | string | processing — ждём ответа банка; ready — данные получены, можно качать; failed — банк вернул ошибку (см. error). |
fetched_at | timestamp | Время получения данных от банка. Появляется только при status=ready. |
operations_count | int | Количество операций в выписке. Появляется только при status=ready. |
Export — GET /statements/{id}/export
GET /api/v1/integration/statements/{statement_id}/export?format=<format>&version=<version>
Скачивает выписку в выбранном формате. Требует status=ready (иначе 409 not_ready).
Параметры query-string
| Поле | Тип | Обяз. | Описание |
|---|---|---|---|
format | string | ✓ | 1c, csv, или json. |
version | string | Только для format=1c: 1.02 или 1.03 (default — 1.03). |
1C v1.02 / v1.03 — стандарт 1С
Кодировка cp1251 (как ждёт 1С). Charset в Content-Type явно проставляется. Имя файла — stmt_<account_alias>_<from>_<to>.txt.
curl --silent --show-error -OJ \
-H "Authorization: Bearer bcs_live_<TOKEN>" \
"https://bsc.example.com/api/v1/integration/statements/<statement_id>/export?format=1c&version=1.03"csv — UTF-8 с заголовком
Кодировка utf-8, разделитель ,, экранирование по RFC 4180. Колонки: doc_date, doc_number, amount, currency, direction, payer_inn, payer_name, payer_account, payee_inn, payee_name, payee_account, purpose.
curl --silent --show-error -OJ \
-H "Authorization: Bearer bcs_live_<TOKEN>" \
"https://bsc.example.com/api/v1/integration/statements/<statement_id>/export?format=csv"json — машинно-читаемый
UTF-8, без обёртки. Структура: {"statement_id", "bank_account_id", "period_from", "period_to", "operations": [{"direction", "doc_type", "doc_number", "doc_date", "amount", "currency", "purpose", "payer": {…}, "payee": {…}}]}. Account-номера контрагентов в открытом виде (не masked), так как это машинно-читаемый формат и клиент сам решает, что показывать пользователю.
curl --silent --show-error \
-H "Authorization: Bearer bcs_live_<TOKEN>" \
"https://bsc.example.com/api/v1/integration/statements/<statement_id>/export?format=json"Идемпотентность
:::info
Тот же external_id + те же (bank_account_id, date_from, date_to) → 200 OK с существующим statement_id, банк не вызывается повторно.
:::
Тот же external_id с другим периодом / РС → 409 conflict. Чтобы заказать выписку с другими параметрами — выпустить новый external_id (например, добавить timestamp / hash в строку).
Edge cases — wire-словарь
bank_not_supported (HTTP 501)
Если банк-адаптер не реализует SupportsStatements, backend возвращает 501 с error.code = "bank_not_supported" (не not_supported). Префикс bank_ добавляет общий bank-error классификатор. HTTP-status (501) — стабильнее для matching'а.
invalid JSON body — HTTP 400
Невалидный JSON или malformed UUID в body — общий decodeJSON возвращает error.code = "invalid request body" (сообщение на английском). Поведенчески эквивалентно validation_error; срабатывает до ручного валидатора.
not_ready на export — HTTP 409
GET /export?format=… при status != ready → 409 not_ready. Дождитесь готовности через poll.
Ошибки
| HTTP | code | Когда возникает |
|---|---|---|
| 400 | validation_error | Период > 31 дня, плохой формат даты, пустой external_id. |
| 400 | invalid request body | Невалидный JSON или malformed UUID. |
| 401 | invalid_token | Токен невалиден / истёк / отозван. |
| 403 | forbidden_purpose | MCP-токен на REST integration endpoint'е (использовать MCP). |
| 403 | forbidden_scope | У токена нет scope_read_statements=true. |
| 403 | forbidden_account | У токена нет allow_read_statements=true на РС. |
| 403 | forbidden_company | РС другой компании. |
| 404 | not_found | statement_id не существует или принадлежит другому токену. |
| 409 | conflict | Тот же external_id с другим периодом / РС. |
| 409 | not_ready | Запрос export до status=ready. |
| 429 | rate_limited | Превышен per-token лимит. |
| 501 | bank_not_supported | Адаптер банка не реализует выписки. |