GET /api/external/v2/sc/{sc_id}/shops/{shop_id}/receipts PRO
Параметры#
| Имя | Тип | Обяз. | По умолчанию | Описание |
|---|---|---|---|---|
sc_id, shop_id | string, в пути | да | — | Идентификаторы центра и точки |
start_created_date | date | условно | — | Начало периода по времени пробития чека |
end_created_date | date | условно | — | Конец того же периода |
start_received_date | date | условно | — | Начало периода по времени поступления к нам |
end_received_date | date | условно | — | Конец того же периода |
document_types | string | array | нет | receipt,delivery,form_of_strict_accountability | Типы фискальных документов |
page | integer | нет | 1 | Номер страницы |
per_page | integer | нет | 500 | Размер страницы, от 1 до 1000 |
include | string | array | нет | — | Дополнительные блоки ответа. Сейчас поддерживается одно значение: items |
Две пары дат#
Нужна как минимум одна полная пара. Половина пары без второй полной даёт 422.
created: когда чек пробит на кассе. Это то, что нужно для отчётности за период.received: когда чек дошёл до нас. Это то, что нужно для дозагрузки, потому что чек мог быть пробит вчера, а прийти сегодня из-за офлайн-режима кассы.
Если заданы обе пары, они применяются одновременно: «пробит в этом окне и получен в том».
Каждая пара ограничена 31 днём независимо от тарифа. Это ограничение размера ответа, PRO его не снимает. Превышение даёт too_long_date.
Типы документов#
shift_opening_report, report_on_the_current_state_of_settlements, receipt,
correction_receipt, delivery, form_of_strict_accountability,
correction_strict_reporting_form, shift_closing_report.
По умолчанию отдаются только продажи: receipt, delivery и БСО. Служебные документы
вроде открытия смены запрашиваются явно. Принимаются обе формы записи:
document_types=receipt,delivery и document_types[]=receipt&document_types[]=delivery.
Ответ#
Суммы в копейках. Сортировка по возрастанию того времени, по которому вы фильтруете:
по времени пробития, если задана пара created, и по времени поступления, если задана
только пара received.
| Поле | Тип | Описание |
|---|---|---|
id | string | Идентификатор чека |
document_type | string | null | Тип фискального документа |
created_datetime | string | Когда пробит, ISO 8601 со смещением зоны центра |
received_datetime | string | Когда получен нами |
kkt_id | string | Идентификатор кассы |
kkt_reg_id | string | null | Регистрационный номер кассы |
kkt_serial_number | string | null | Заводской номер кассы |
kkt_fiscal_drive_number | string | null | Номер фискального накопителя |
fiscal_document_number | integer | Номер фискального документа |
shift_number | integer | Номер смены |
shift_check_number | integer | Номер чека в смене |
operation_type | integer | 1 приход, 2 возврат прихода, 3 расход, 4 возврат расхода |
total_sum | integer | Итог чека |
cash_sum, ecash_sum | integer | Наличными, безналичными |
advanced_sum, full_prepayment_sum, partial_prepayment_sum, prepaid_sum, credit_sum, provision_sum | integer | Способы оплаты |
nds_*_sum | integer | Разбивка по ставкам НДС, набор как в продажах по дням |
items_count | integer | Количество позиций в чеке |
items | array | Позиции чека. Приходят только при include=items |
Позиции чека#
По умолчанию в ответе только items_count. Состав запрашивается явно:
?include=itemsТак сделано из-за объёма: при per_page=1000 чеки с позициями весят в разы
больше, и платить за это тем, кому нужны только итоги, неправильно.
Каждая позиция приходит в одном виде независимо от того, какой оператор фискальных данных обслуживает кассу:
| Поле | Тип | Описание |
|---|---|---|
quantity | number | Количество. Дробное у весового товара, целое у штучного |
price | integer | Цена за единицу, копейки |
sum | integer | Стоимость позиции с учётом количества, копейки |
"items": [
{ "quantity": 2, "price": 39525, "sum": 79050 },
{ "quantity": 0.437, "price": 100000, "sum": 43700 }
]Состав позиций расшифровывается не для всех касс. Для таких чеков items придёт пустым массивом при ненулевом items_count. Это не ошибка запроса: количество позиций мы знаем, а состава у нас нет. Если важно понять, были ли позиции в чеке, ориентироваться стоит на items_count.
{
"success": true,
"data": [
{
"id": "6686000000000000000004a1",
"document_type": "receipt",
"created_datetime": "2026-07-01T00:30:00+03:00",
"received_datetime": "2026-07-01T00:31:12+03:00",
"kkt_id": "6512a3000000000000000201",
"kkt_reg_id": "0000123456789012",
"kkt_serial_number": "00107801234567",
"kkt_fiscal_drive_number": "9289000100123456",
"fiscal_document_number": 10245,
"shift_number": 312,
"shift_check_number": 7,
"operation_type": 1,
"total_sum": 149900,
"cash_sum": 0,
"ecash_sum": 149900,
"nds_20_sum": 24983,
"items_count": 3,
"items": [
{ "quantity": 1, "price": 79900, "sum": 79900 },
{ "quantity": 2, "price": 35000, "sum": 70000 }
]
}
],
"meta": {
"pagination": {
"page": 1,
"per_page": 500,
"total": 8412
},
"time_zone": "Europe/Moscow"
}
}Практика#
Границы суток считаются в зоне центра. Чек, пробитый в 00:30 по Москве, попадёт в первое июля, а не в тридцатое июня. Именно поэтому в примере выше первая строка — половина первого ночи.
Дозагрузку стоит фильтровать по received. Касса могла работать офлайн и передать
чеки с задержкой в несколько дней. Периодический запрос по created их пропустит,
по received заберёт.
Ограничивать её парой created не стоит. Задержки бывают большими: из чеков,
поступающих за сутки, около 9 % пробиты больше недели назад, а 4–5 % — больше месяца.
Окно по времени пробития, поставленное «с запасом», такие чеки отрежет. Запрашивайте
одну пару received.
received — время последнего изменения записи. Пересчёт или уточнение данных
сдвигает его вперёд, и чек приходит в выгрузку повторно, уже с исправленными суммами.
Поэтому инкрементальную загрузку стоит строить на обновлении по id: повторный id
означает, что данные уточнились, а не что пришёл новый чек.
У части касс сбиты часы, и время пробития оказывается впереди времени поступления.
При выгрузке по created такие чеки попадают в другие сутки, чем ожидает арендатор;
по received они приходят на своё место.
Ошибки#
| Код | HTTP | Когда |
|---|---|---|
plan_required | 403 | Центр не на PRO |
not_found | 404 | Точка не найдена или принадлежит другому центру |
too_long_date | 422 | Пара дат шире 31 дня |
validation_error | 422 | Неполная пара дат, неизвестный тип документа, per_page больше 1000 |
query_timeout | 504 | Выборка не уложилась в отведённое время; сузьте период |