# Receipt. Продажи

> Источник: https://wiki.virtualpos.ru/hc/api/receipt  
> Обновлено: 2026-09-26

Метод возвращает чеки продаж и возвратов вместе со строками, оплатой и данными о кассе. Чеки можно только читать: создаются они кассовым приложением. Выгрузку можно вести по датам либо по маркеру — так удобно получать только новые чеки после прошлого обмена.

> **Примечание:**
> Как получить ключ, как формируются запросы и какие бывают ответы и ошибки — в статье [Общие сведения](https://wiki.virtualpos.ru/hc/api/overview). Здесь описаны только особенности метода `receipt`.

## Запрос

Все параметры, кроме ключа `apikey` и формата `format`, принимаются и в адресной строке, и в теле POST.

```
GET https://[компания].myvirtualpos.ru/api/receipt?apikey=MySecret&datefrom=20260901&dateto=20260902&warehouseid=8
```

## Параметры запроса

- **datefrom** — Дата `ГГГГММДД` или дата и время `ГГГГММДДччммсс`. Чеки, оформленные не раньше указанного момента. Если не указан, отбираются чеки за последние `days` дней
- **dateto** — Дата `ГГГГММДД` или дата и время `ГГГГММДДччммсс`. Чеки, оформленные **раньше** указанного момента (граница не включается). Для одного дня укажите следующий день
- **days** — Число. Глубина поиска в днях от текущего момента, если не указан `datefrom`. По умолчанию **25**
- **warehouseid** — Число. Ид точки продаж. Только при выгрузке по датам
- **warehouseid2** — Строка. Код точки продаж во внешней системе. Только при выгрузке по датам
- **marker** — Маркер последнего полученного чека вида `метка:номер`: вернуть чеки, появившиеся или изменившиеся после него. При указании маркера параметры `datefrom`, `dateto`, `days`, `warehouseid` и `warehouseid2` игнорируются
- **fields** — Дополнительные поля через двоеточие, например `itemname:user_login`. Список допустимых значений ниже
- **bankTransaction** — `1` — добавить в чек данные банковской транзакции
- **format** — `json` (по умолчанию) или `xml`

Чеки возвращаются по возрастанию ид. В выгрузку попадают только фискальные чеки: с типом «продажа» или «возврат» (и операции покупки у клиента) и с заполненным регистрационным номером фискального регистратора.

> **Важно:**
> **Выгружайте порциями.** Метод собирает в одном ответе все чеки за период вместе со строками. За большой период это долго и может закончиться ошибкой сервера по памяти. Ограничивайте выборку датами и точкой продаж либо используйте маркер.

### Выгрузка новых чеков по маркеру

Каждый чек содержит поле `marker` вида `1780236802:0000386289`. Запомните маркер последнего обработанного чека и передайте его в параметре `marker` в следующем запросе: ответ будет содержать только чеки, которые появились или были изменены после него. Так ничего не теряется и не приходят повторы.

Маркер состоит из двух чисел: времени последнего изменения чека и ид чека. Оба обязательны, ид не может быть просто `0`. Для первой выгрузки используйте даты, а маркер берите из полученных чеков.

### Дополнительные поля (`fields`)

Через двоеточие можно перечислить:

- **itemname** — В строку: название товара
- **itemid2** — В строку: код товара во внешней системе
- **article** — В строку: артикул
- **lot_number** — В строку: серия (партия)
- **manufacturer_id**, **manufacturer_name** — В строку: ид и название производителя товара
- **discount_name** — В строку: название акции, по которой дана скидка
- **warehouseid2** — В чек: код точки продаж во внешней системе
- **user_login** — В чек: логин кассира
- **user_fio** — В чек: фамилия и инициалы кассира
- **card_id**, **card_id2** — В чек: ид карты клиента и её код во внешней системе
- **customer_id**, **customer_id2** — В чек: ид клиента и его код во внешней системе
- **customer_fname**, **customer_lname**, **customer_mname** — В чек: имя, фамилия и отчество клиента
- **session_open_datetime** — В чек: дата и время открытия смены

Если указано неизвестное поле, метод вернёт ошибку со списком допустимых значений.

## Структура ответа

- **success** — `1` — данные получены
- **type** — Тип данных, всегда `receipt`
- **count** — Количество чеков в ответе
- **receipts** — Список чеков. Каждый обёрнут в объект `receipt`

### Поля чека

Пустые значения в JSON приходят как `null`, в XML — как пустой элемент.

**Основное**

- **receipt_id** — Строка. Уникальный идентификатор чека (GUID)
- **marker** — Строка. Маркер чека для выгрузки новых данных
- **doc_type** — Строка. Тип чека: `sale` — продажа, `return` — возврат, `buy` — покупка у клиента, `buy_return` — возврат покупки
- **date** — Строка. Дата и время чека, формат `дд.мм.гггг чч:мм:сс`
- **amount** — Строка. Сумма чека с учётом скидки
- **discount** — Строка. Скидка на чек
- **discount_misc** — Строка. Дополнительная скидка: часть, оплаченная купоном или сертификатом
- **round_amount** — Строка. Сумма округления
- **items_count** — Число. Количество строк в чеке
- **items** — Список строк чека. Каждая строка обёрнута в объект `item`

**Касса и кассир**

- **terminalid** — Строка. Регистрационный номер фискального регистратора. Если фискальный регистратор не используется — уникальный идентификатор кассы
- **short_fiscal_serial_number** — Строка. Краткий серийный номер ККТ
- **terminal_number** — Число. Номер кассы в зале
- **terminal_description** — Строка. Описание кассового места
- **device_model_name**, **device_model_version** — Строка. Модель и версия ККТ
- **warehouseid** — Число. Ид точки продаж
- **user_id** — Число. Ид кассира
- **corp_code** — Строка. Корпоративный код кассира
- **fr_session** — Число. Номер смены
- **doc_num** — Число. Номер документа по данным фискального регистратора
- **doc_num_session** — Число. Номер чека в смене по данным фискального регистратора
- **fiscal_attribute** — Строка. Фискальный признак документа
- **is_electronic** — Число. `1` — покупателю отправлен электронный чек

**Оплата**

- **pay_cash** — Строка. Оплачено наличными
- **pay_card** — Строка. Оплачено банковской картой
- **pay_sbp** — Строка. Оплачено через систему быстрых платежей
- **pay_credit**, **pay_tare** — Строка. Оплата в кредит и тарой; не используются
- **pay_bonus_id** — Число. Ид бонусной программы, по которой списаны бонусы
- **pay_bonus_amount** — Строка. Списано бонусов
- **pinpad_name** — Строка. Признак платёжного терминала
- **vat10_sum**, **vat18_sum**, **vat20_sum** — Строка. Сумма НДС по позициям со ставкой 10%, 18% и 20%

**Дополнительные блоки**

- **sale_receipt_id**, **sale_receipt_date** — Только у возвратов: ид (GUID) и дата первоначального чека продажи
- **bankTransaction** — При `bankTransaction=1`: данные банковской транзакции — `payment_type` (`card`), `rrn`, `trx_date`, `term_num`, `auth_code`, `card_type`, `card_name`, `amount_clear`, `client_card` (номер карты в маскированном виде). Пусто, если по чеку нет данных терминала
- **coupons** — Если часть чека оплачена сертификатом: список `coupon` с `barcode` и номиналом `sum`. Тогда в `bankTransaction` приходят `payment_type` равный `coupon` и `payment_denomination` — сумма номиналов

### Поля строки чека

- **line_id** — Строка. Уникальный идентификатор строки (GUID)
- **itemid** — Число. Ид товара
- **quantity** — Строка. Количество
- **pricebase** — Строка. Цена за единицу по прайс-листу без скидки
- **pricesale** — Строка. Цена продажи за единицу с учётом скидки
- **discount** — Строка. Сумма скидки по строке
- **amount** — Строка. Сумма по строке с учётом скидки
- **cogs** — Строка. Себестоимость единицы
- **barcode** — Строка. Штрихкод
- **vat_applied** — Строка. Ставка НДС; `-1` — без НДС
- **vat_amount** — Строка. Сумма НДС
- **onhand_id** — Число. Ид товарного остатка, из которого списан товар
- **user_id** — Всегда пусто (не используется)

## Пример ответа

```json
{
  "success": 1,
  "type": "receipt",
  "count": 1,
  "receipts": [
    {
      "receipt": {
        "receipt_id": "57307ECE-1489-4B1F-A3AE-3F4E5CDC0BF1",
        "marker": "1780232425:0000386281",
        "terminalid": "100000032",
        "warehouseid": 8,
        "user_id": 3,
        "corp_code": "",
        "fr_session": 10,
        "doc_type": "sale",
        "doc_num": 23,
        "doc_num_session": 15,
        "date": "31.05.2026 16:00:23",
        "discount": "0.00",
        "discount_misc": "0.00",
        "amount": "150.00",
        "round_amount": "0.00",
        "pay_cash": "0.00",
        "pay_card": "150.00",
        "pay_tare": "0.00",
        "pay_credit": "0.00",
        "pay_sbp": "0.00",
        "pay_bonus_id": null,
        "pay_bonus_amount": "0.00",
        "pinpad_name": "standalone",
        "terminal_number": 2,
        "short_fiscal_serial_number": "000003",
        "device_model_name": "",
        "device_model_version": "",
        "terminal_description": "Касса № 2",
        "is_electronic": 0,
        "fiscal_attribute": null,
        "vat10_sum": "0.00",
        "vat18_sum": "0.00",
        "vat20_sum": "0.00",
        "items_count": 1,
        "items": [
          {
            "item": {
              "line_id": "CEDC9509-633B-5B89-7F57-B56588767BFA",
              "itemid": 4620,
              "quantity": "1.000",
              "pricebase": "150.00",
              "pricesale": "150.0000",
              "discount": "0.00",
              "amount": "150.00",
              "barcode": null,
              "cogs": "0.00",
              "user_id": null,
              "vat_applied": "-1.00",
              "vat_amount": "0.00",
              "onhand_id": 81540
            }
          }
        ]
      }
    }
  ]
}
```

Тот же ответ при `format=xml` (сокращённо):

```xml
<?xml version="1.0" encoding="UTF-8"?>
<root>
  <success>1</success>
  <type>receipt</type>
  <count>1</count>
  <receipts>
    <receipt>
      <receipt_id>57307ECE-1489-4B1F-A3AE-3F4E5CDC0BF1</receipt_id>
      <marker>1780232425:0000386281</marker>
      <doc_type>sale</doc_type>
      <amount>150.00</amount>
      <!-- остальные поля чека -->
      <items_count>1</items_count>
      <items>
        <item>
          <line_id>CEDC9509-633B-5B89-7F57-B56588767BFA</line_id>
          <itemid>4620</itemid>
          <quantity>1.000</quantity>
          <!-- остальные поля строки -->
        </item>
      </items>
    </receipt>
  </receipts>
</root>
```

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

| Задача | Запрос |
| --- | --- |
| Чеки за последние 25 дней | `/api/receipt?apikey=MySecret` |
| Чеки за сутки по точке продаж | `/api/receipt?apikey=MySecret&datefrom=20260901&dateto=20260902&warehouseid=8` |
| Чеки за интервал времени | `/api/receipt?apikey=MySecret&datefrom=20260901090000&dateto=20260901180000` |
| Только новые чеки после прошлого обмена | `/api/receipt?apikey=MySecret&marker=1780236802:0000386289` |
| Чеки с названиями товаров и кассиром | `/api/receipt?apikey=MySecret&datefrom=20260901&dateto=20260902&fields=itemname:article:user_login` |
| Чеки с банковскими транзакциями | `/api/receipt?apikey=MySecret&datefrom=20260901&dateto=20260902&bankTransaction=1` |

## Ошибки

Ошибка авторизации и общие ошибки описаны в статье [Общие сведения](https://wiki.virtualpos.ru/hc/api/overview).

| Сообщение | Причина | Что делать |
| --- | --- | --- |
| Incorrect date format dateFrom='…' / dateTo='…' | Дата не в формате `ГГГГММДД` или `ГГГГММДДччммсс` | Передайте дату, например `20260901` |
| Error parse marker '…'. Example 1394804029:000000010 (timestamp:id) | Маркер не содержит двух частей через двоеточие | Передайте маркер из ответа без изменений |
| Error parse marker '…'. Timestamp is not numeric / Id is not numeric | Части маркера не числа | Передайте маркер из ответа без изменений |
| Error parse marker '…'. Timestamp not found / Id not found | Одна из частей маркера пуста или равна `0` | Используйте маркер из ответа |
| Field '…' not found. Use combination of: […] | Неизвестное поле в `fields` | Используйте поля из списка |

Если по условиям ничего не найдено, метод возвращает успешный ответ с `count` равным `0` и пустым списком `receipts`.

## Связанные разделы

- [Общие сведения](https://wiki.virtualpos.ru/hc/api/overview) — Ключ доступа, вызов методов, форматы ответов и ошибки
- [ZReport. Z-отчёты](https://wiki.virtualpos.ru/hc/api/zreport) — Смены, в которых оформлены чеки
- [CashFlow. Движение денежных средств на кассе](https://wiki.virtualpos.ru/hc/api/cashflow) — Наличные операции на кассе
