для разработчиков На сайт Rentu

Чеки

Каждый фискальный документ отдельной записью: суммы, способ оплаты, разбивка по НДС и касса, которая его пробила.

GET /api/external/v2/sc/{sc_id}/shops/{shop_id}/receipts   PRO

Параметры#

ИмяТипОбяз.По умолчаниюОписание
sc_id, shop_idstring, в путидаИдентификаторы центра и точки
start_created_datedateусловноНачало периода по времени пробития чека
end_created_datedateусловноКонец того же периода
start_received_datedateусловноНачало периода по времени поступления к нам
end_received_datedateусловноКонец того же периода
document_typesstring | arrayнетreceipt,delivery,form_of_strict_accountabilityТипы фискальных документов
pageintegerнет1Номер страницы
per_pageintegerнет500Размер страницы, от 1 до 1000
includestring | 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.

ПолеТипОписание
idstringИдентификатор чека
document_typestring | nullТип фискального документа
created_datetimestringКогда пробит, ISO 8601 со смещением зоны центра
received_datetimestringКогда получен нами
kkt_idstringИдентификатор кассы
kkt_reg_idstring | nullРегистрационный номер кассы
kkt_serial_numberstring | nullЗаводской номер кассы
kkt_fiscal_drive_numberstring | nullНомер фискального накопителя
fiscal_document_numberintegerНомер фискального документа
shift_numberintegerНомер смены
shift_check_numberintegerНомер чека в смене
operation_typeinteger1 приход, 2 возврат прихода, 3 расход, 4 возврат расхода
total_sumintegerИтог чека
cash_sum, ecash_sumintegerНаличными, безналичными
advanced_sum, full_prepayment_sum, partial_prepayment_sum, prepaid_sum, credit_sum, provision_sumintegerСпособы оплаты
nds_*_sumintegerРазбивка по ставкам НДС, набор как в продажах по дням
items_countintegerКоличество позиций в чеке
itemsarrayПозиции чека. Приходят только при include=items

Позиции чека#

По умолчанию в ответе только items_count. Состав запрашивается явно:

?include=items

Так сделано из-за объёма: при per_page=1000 чеки с позициями весят в разы больше, и платить за это тем, кому нужны только итоги, неправильно.

Каждая позиция приходит в одном виде независимо от того, какой оператор фискальных данных обслуживает кассу:

ПолеТипОписание
quantitynumberКоличество. Дробное у весового товара, целое у штучного
priceintegerЦена за единицу, копейки
sumintegerСтоимость позиции с учётом количества, копейки
json
"items": [
  { "quantity": 2, "price": 39525, "sum": 79050 },
  { "quantity": 0.437, "price": 100000, "sum": 43700 }
]

Состав позиций расшифровывается не для всех касс. Для таких чеков items придёт пустым массивом при ненулевом items_count. Это не ошибка запроса: количество позиций мы знаем, а состава у нас нет. Если важно понять, были ли позиции в чеке, ориентироваться стоит на items_count.

json
{
  "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_required403Центр не на PRO
not_found404Точка не найдена или принадлежит другому центру
too_long_date422Пара дат шире 31 дня
validation_error422Неполная пара дат, неизвестный тип документа, per_page больше 1000
query_timeout504Выборка не уложилась в отведённое время; сузьте период