# Вчасно.Каса Хмарне API {#vchasno-kasa-cloud-fiscal-api} API для інтеграції з кабінетом Вчасно.Каса та фіскалізації чеків. Напряму, без залучення Device Manager. Якщо ви користуєтесь Device Manager, то вам не потрібне це АПІ. # Загальні вимоги {#general-requirements} **HOST**: [https://kasa.vchasno.ua](https://kasa.vchasno.ua) Для всіх методів очікуються такі хедери: - **Content-Type: application/json** - **Authorization: VCHASNO_KASA_PRRO_TOKEN** Де `VCHASNO_KASA_PRRO_TOKEN` - токен каси, класти у хедер без префіксу Bearer. Приклад запиту на дані по касі: ``` curl --location 'https://kasa.vchasno.ua/api/v3/fiscal/execute' \ --header 'Content-Type: application/json' \ --header 'Authorization: ••••••' \ --data '{ "fiscal": { "task": 18 } }' ``` Токен каси можна отримати у веб-кабінеті Вчасно.Каса ([https://kasa.vchasno.ua/](https://kasa.vchasno.ua/)), перейшовши у Налаштування конкретної каси (Дії з касою -> Налаштування каси -> блок Токен) ![prro_config_token.png](/cloud_api/prro_config_token.png) Токен відображається тільки один раз при його формуванні. Повторне отримання цього ж токену - неможливо (дані хешуються). Тому, якщо ви загубите токен каси, його треба буде перегенерувати. При перегенерації старий токен припиняє дію. **Тестовий режим** У веб-кабінеті [Вчасно.Каса](https://kasa.vchasno.ua) також доступна тестова каса, по якій можна взяти токен і тестувати інтеграцію. Відмінність тестової каси від реальної - чеки не відправляються до ДПС, всюди підсвічується, що це тестова каса та тестовий чек. Чеки з тестової каси **не можна надавати покупцям**, так як це порушення правил фіскалізації - клієнти мають отримувати дійсний чек з реальної каси. Реєстрація реальної каси також доступна у веб-кабінеті [Вчасно.Каса](https://kasa.vchasno.ua). **Для фіскалізації чеків необхідно додати ключ у сховище ключів.** Зробити це можна у веб-кабінеті, сторінка "Сховище ключів" ([https://kasa.vchasno.ua/app/storage-keys](https://kasa.vchasno.ua/app/storage-keys)) ![kasa_keys_page.png](/cloud_api/kasa_keys_page.png) - [Postman-колекція *Імпортуйте, створіть Environment зі змінною KASA_PRRO_TOKEN — і надсилайте запити*](/cloud_api/vchasno-kasa.cloud.postman_collection.json) {.links-list} # Запити на фіскалізацію {#fiscal-requests-structure} Всі запити на фіскалізацію виконуються через **POST /api/v3/fiscal/execute** Зазвичай час виконання запиту на фіскалізацію складає до 1 секунди. При проблемах з АЦСК чи ДПС ми виконуємо додаткові заходи задля забезпечення безперебійної роботи, тому рекомендуємо виставити таймаут на запит у 25 секунд. Обов'язково передавайте у запитах на фіскалізацію свій унікальний `tag`. Флоу роботи: - відкрити фіскальну зміну (task: 0). Рекомендуємо це робити явним АПІ запитом. Якщо ж зміна не була відкрита, то при виконанні запиту чеку (task: 1, 2, 3, 4, 14, 15, 16) вона буде відкрита автоматично. - проводити фіскальні операції (чеки продажу, повернення, etc) - закрити фіскальну зміну (task: 11). Тривалість однієї фіскальної зміни не має перевищувати 24 години, також рекомендуємо закривати зміну у той же день, коли і відкрили. У веб кабінеті можна налаштування автозакриття зміни. ## Структура запиту {#fs--request-structure} Пояснення щодо обов'язковості ключів у запитах: - ✅ - Обов'язково передавати для всіх запитів. - ✔ - Обов'язковий тільки для певних запитів або при певних умовах. Умови зазначені у колонці "Зміст". - ❌ - Опційний ключ, можна передавати за необхідності. <table> <thead> <tr> <th>Ключ</th> <th>Тип json даних</th> <th>Зміст</th> <th>Обов'язковий</th> </tr> </thead> <tbody> <tr> <td>dt</td> <td>string</td> <td>Дата і час завдання в форматі <em>YYYYMMDDHHMMSS</em>. Використовується як дата і час для чеку <br>Якщо не передати - використається час серверу <br><strong>ВАЖЛИВО!</strong> Дата чеку, що проводиться, має бути &gt;= дати попереднього проведеного чеку. В іншому випадку ДПС не прийме такий чек.</td> <td>❌</td> </tr> <tr> <td>tag</td> <td>string</td> <td>Ідентифікатор запиту. Можна вказати довільний рядок. Використовується для ідентифікації повторних запитів на фіскалізацію. Для уникнення <strong>дублювання чеків,</strong> необхідно у кожному запиті вказувати власний унікальний ідентифікатор. <br>Якщо не передати чи передати пустим, сервером буде згенеровано uuid для цього поля.</td> <td>❌</td> </tr> <tr> <td>source</td> <td>string</td> <td>Назва джерела завдання, може бути довільною. Слугує для кращої ідентифікації в логах</td> <td>❌</td> </tr> <tr> <td>fiscal</td> <td>object</td> <td>Об'єкт з реквізитами фіскального завдання</td> <td>✅</td> </tr> <tr> <td>userinfo</td> <td>object</td> <td>Дані, куди надсилати посилання на чек (для завдань 1, 2, 3, 4, 14, 15, 16). <br>Об'єкт виду: { "email" : "...", "phone": "+380XXXXXXXXX" } <br>Очікуємо формат +380XXXXXXXXX, та якщо ви вкажете додаткові розділові знаки у номері (наприклад +380ХХ-ХХХ-ХХ-ХХ), ми спробуємо конвертувати його у потрібний формат <br>У випадку, якщо телефон чи емейл вказано невірно - повідомлення не буде відправлено, але на проведення чеку це ніяк не вплине (не буде валідаційної помилки).</td> <td>❌</td> </tr> </tbody> </table> ## Структура fiscal {#fs--fiscal-object} ### Структура об'єкту fiscal (реквізити фіскального завдання) {#fs--fiscal-object-inner} <table> <thead> <tr> <th>Ключ</th> <th>Тип json даних</th> <th>Зміст</th> <th>Обов'язковий</th> </tr> </thead> <tbody> <tr> <td>task</td> <td>integer</td> <td>Тип фіскального завдання: <br><strong>0 - відкриття зміни</strong> <br><strong>1 - чек продажу</strong> <br><strong>2 - чек повернення</strong> <br><strong>3 - службове внесення</strong> <br><strong>4 - службова видача</strong> <br><strong>14 - чек видачі готівки</strong> <br><strong>15 - чек переказу коштів</strong> <br><strong>16 - чек видачі коштів при переказі</strong> <br><strong>10 - X-звіт</strong> <br><strong>11 - Z-звіт</strong> <br><strong>18 - статус пРРО</strong></td> <td>✅</td> </tr> <tr> <td>subtask</td> <td>integer</td> <td>Маркування, тільки для чеків <strong>передплати</strong> та <strong>постоплати</strong> <br>1 - передплата <br>2 - постоплата</td> <td>✔</td> </tr> <tr> <td>cashier</td> <td>string</td> <td>Інформація про касира</td> <td>❌</td> </tr> <tr> <td>receipt</td> <td>object</td> <td>Поля чеку (для завдань 1 і 2)</td> <td>✔</td> </tr> <tr> <td>cash</td> <td>object</td> <td>Поля внесення/видачі, чеку видачі готівки і чеку видачі готівки при переказі (для завдань 3, 4, 14 і 16)</td> <td>✔</td> </tr> </tbody> </table> ## Структура fiscal.receipt {#fs--fiscal-receipt} ### Структура об'єкту fiscal.receipt (поля чеку) {#fs--fiscal-receipt-inner} <table> <thead> <tr> <th>Ключ</th> <th>Тип json даних</th> <th>Зміст</th> <th>Обов'язковий</th> </tr> </thead> <tbody> <tr> <td>sum</td> <td>float</td> <td>Сума чеку (2 знаки після коми) з урахуванням всіх знижок</td> <td>✅</td> </tr> <tr> <td>round</td> <td>float</td> <td>Сума округлення (входить до суми чеку). На цю суму має відрізнятись сума чеку від сум по всіх видам оплати.</td> <td>❌</td> </tr> <tr> <td>comment_up</td> <td>string</td> <td>Коментар, який друкується перед списком товарів</td> <td>❌</td> </tr> <tr> <td>comment_down</td> <td>string</td> <td>Коментар, який друкується внизу чеку</td> <td>❌</td> </tr> <tr> <td>rows</td> <td>array</td> <td>Рядки чеку</td> <td>✅</td> </tr> <tr> <td>pays</td> <td>array</td> <td>Перелік засобів оплат</td> <td>✅</td> </tr> <tr> <td>purchase_receipt_fisn</td> <td>string</td> <td><strong>Обов'язкове поле для чеків повернення (task 2) по програмі "Національний кешбек"</strong> <br>Фіскальний номер чеку на продаж на основі якого здійснюється повернення</td> <td>✔</td> </tr> <tr> <td>purchase_rro_fisn</td> <td>string</td> <td><strong>Обов'язкове поле для чеків повернення (task 2) по програмі "Національний кешбек"</strong> <br>Фіскальний номер РРО або ПРРО з якого було здійснено оригінальний продаж товару по чеку вказаного в <strong>purchase_receipt_fisn</strong></td> <td>✔</td> </tr> <tr> <td>purchase_receipt_dt</td> <td>string</td> <td><strong>Обов'язкове поле для чеків повернення (task 2) по програмі "Національний кешбек"</strong> <br>Дата фіскалізації чеку на продаж по якому здійснюється повернення в форматі YYYYMMDD.</td> <td>✔</td> </tr> <tr> <td>disc</td> <td>float</td> <td>Сума або відсоток загальної знижки на чек.</td> <td>❌</td> </tr> <tr> <td>disc_type</td> <td>integer</td> <td>Визначає тип загальної знижки у fiscal.receipt.disc Значення: <br>0 - сумова <br>1 - відсоткова знижка</td> <td>❌</td> </tr> <tr> <td>discounts</td> <td>array</td> <td>Список загальних знижок (якщо є потреба задати декілька).</td> <td>❌</td> </tr> </tbody> </table> ## Структура fiscal.receipt.rows {#fs--fiscal-receipt-rows} ### Структура об'єкту fiscal.receipt.rows (рядки чеку) {#fs--fiscal-receipt-rows-inner} <table> <thead> <tr> <th>Ключ</th> <th>Тип json даних</th> <th>Зміст</th> <th>Обов'язковий</th> </tr> </thead> <tbody> <tr> <td>code</td> <td>string</td> <td>Артикул товару в обліковій системі підприємства</td> <td>❌</td> </tr> <tr> <td>code1</td> <td>string</td> <td>ШК (штрихкод) товару</td> <td>❌</td> </tr> <tr> <td>code2</td> <td>string</td> <td>Код УКТЗЕД</td> <td>❌</td> </tr> <tr> <td>code3</td> <td>string</td> <td>Код ДКПП</td> <td>❌</td> </tr> <tr> <td>code_a</td> <td>string</td> <td>Код акцизної марки товару</td> <td>❌</td> </tr> <tr> <td>code_aa</td> <td>array</td> <td>Масив акцизних марок товарів (для випадку, коли для одної позиції декілька марок)</td> <td>❌</td> </tr> <tr> <td>name</td> <td>string</td> <td>Назва товару</td> <td>✅</td> </tr> <tr> <td>cnt</td> <td>float</td> <td>Кількість товару (не більше 3х знаків після коми)</td> <td>✅</td> </tr> <tr> <td>price</td> <td>float</td> <td>Ціна товару (2 знаки після коми) Може бути пустим, тоді рахується автоматично шляхом поділу поля cost на cnt і математичним округленням</td> <td>✅</td> </tr> <tr> <td>disc</td> <td>float</td> <td>Знижка на рядок чеку (2 знаки після коми)</td> <td>✅</td> </tr> <tr> <td>cost</td> <td>float</td> <td>Сума по рядку до знижки Може бути пустим, тоді рахується автоматично шляхом множення поля cnt на price і математичним округленням</td> <td>✅</td> </tr> <tr> <td>taxgrp</td> <td>integer</td> <td>Код податкової групи: <br><strong>1 ПДВ 20%</strong> <br><strong>2 Без ПДВ</strong> <br><strong>3 ПДВ 20% + акциз 5%</strong> <br><strong>4 ПДВ 7%</strong> <br><strong>5 ПДВ 0%</strong> <br><strong>6 Без ПДВ + акциз 5%</strong> <br><strong>7 Не є об`єктом ПДВ</strong> <br><strong>8 ПДВ 20% + ПФ 7.5%</strong> <br><strong>9 ПДВ 14%</strong></td> <td>✅</td> </tr> <tr> <td>comment</td> <td>string</td> <td>Коментар на рядок</td> <td>❌</td> </tr> </tbody> </table> ## Структура fiscal.receipt.pays {#fs--fiscal-receipt-pays} ### Структура об'єкту fiscal.receipt.pays (Оплати чеку (по видам)) {#fs--fiscal-receipt-pays-inner} <table> <thead> <tr> <th>Ключ</th> <th>Тип json даних</th> <th>Зміст</th> <th>Обов'язковий</th> </tr> </thead> <tbody> <tr> <td>type</td> <td>integer</td> <td>Код засобу оплати. Коди за замовчуванням: <br><strong>0 Готівка</strong> <br><strong>1 Безготівка</strong> <br><strong>2 Картка</strong> <br><strong>3 Передплата</strong> <br><strong>4 Післясплата</strong> <br><strong>5 Кредит</strong> <br><strong>6 Сертифікат</strong> <br><strong>8 Чек</strong> <br><strong>11 Бонусні бали</strong> <br><strong>12 Погашення кредиту</strong> <br><strong>13 Переказ через QR-код</strong> <br><strong>14 Переказ з картки</strong> <br><strong>15 Переказ з поточного рахунку</strong> <br><strong>16 Інтернет еквайринг</strong> <br><strong>17 Платіж LiqPay</strong> <br><strong>18 Платіж через сервіс переказу ROZETKA Pay</strong> <br><strong>19 Платіж Portmone</strong> <br><strong>20 Платіж NovaPay</strong> <br> Або ж кастомний варіант (налаштовується у кабінеті)</td> <td>✅</td> </tr> <tr> <td>sum</td> <td>float</td> <td>Сума оплати (2 знаки після коми)</td> <td>✅</td> </tr> <tr> <td>comment</td> <td>string</td> <td>Коментар на рядок оплати</td> <td>❌</td> </tr> <tr> <td>change</td> <td>float</td> <td>Решта (для оплати готівкою) <br>Для правильного внесення оплати з рештою необхідно <br>- в поле <strong>sum</strong> внести суму, яка іде в залік, <br>- в поле <strong>change</strong> - решту. <br>Загальна сума, яка отримана від покупця, розраховується як sum+change</td> <td>✔</td> </tr> <tr> <td>paysys</td> <td>string</td> <td>Назва платіжної системи (для оплати карткою)</td> <td>✔</td> </tr> <tr> <td>rrn</td> <td>string</td> <td>Код транзакції (для оплати карткою)</td> <td>✔</td> </tr> <tr> <td>cardmask</td> <td>string</td> <td>Замаскований номер картки (для оплати карткою)</td> <td>✔</td> </tr> <tr> <td>term_id</td> <td>string</td> <td>Ідентифікатор платіжного терміналу (для оплати карткою)</td> <td>✔</td> </tr> <tr> <td>bank_name</td> <td>string</td> <td>Назва банку еквайера (для оплати карткою). <br>Вказується виключно як інформаційне поле для відображення в формі чеку назви банку еквайера. Не відображається у в'ювері чеків без <strong>bank_id.</strong> Дані вказані в це поле не відправляються в ДПС.</td> <td>✔</td> </tr> <tr> <td>bank_id</td> <td>string</td> <td>Ідентифікатор банку (для оплати карткою)</td> <td>✔</td> </tr> <tr> <td>auth_code</td> <td>string</td> <td>Код авторизації (для оплати карткою)</td> <td>✔</td> </tr> <tr> <td>oper_type</td> <td>string</td> <td>Вид операції</td> <td>❌</td> </tr> <tr> <td>commission</td> <td>float</td> <td>Сума комісії</td> <td>❌</td> </tr> <tr> <td>purchase_dt</td> <td>string</td> <td><strong>Обов'язкове поле для чеків продажу (task 1) по програмі "Національний кешбек"</strong> <br>Дата та час авторизації оплати на терміналі в форматі YYYYMMDDHHMMSS. <br>У візуалізації чеку даний час не відображається, лише передається в ДПС.</td> <td>✔</td> </tr> </tbody> </table> ## Структура fiscal.receipt.discounts {#fs--fiscal-receipt-discounts} ### Структура об'єкту fiscal.receipt.discounts (Список загальних знижок) {#fs--fiscal-receipt-discounts-inner} <table> <thead> <tr> <th>Ключ</th> <th>Тип json даних</th> <th>Зміст</th> <th>Обов'язковий</th> </tr> </thead> <tbody> <tr> <td>disc</td> <td>float</td> <td>Сума або відсоток загальної знижки на чек.</td> <td>✅</td> </tr> <tr> <td>disc_type</td> <td>integer</td> <td>Тип загальної знижки. Значення: <br>0 - сумова, <br>1 - відсоткова знижка.</td> <td>✅</td> </tr> <tr> <td>disc_name</td> <td>string</td> <td>Назва загальної знижки. За замовчуванням "Знижка".</td> <td>❌</td> </tr> </tbody> </table> ## Структура fiscal.cash {#fs--fiscal-cash} ### Структура об'єкту fiscal.cash (Поля внесення/видачі, чеку видачі готівки, чеку видачі коштів при переказі) {#fs--fiscal-cash-inner} <table> <thead> <tr> <th>Ключ</th> <th>Тип json даних</th> <th>Зміст</th> <th>Обов'язковий</th> </tr> </thead> <tbody> <tr> <td>type</td> <td>integer</td> <td>Код засобу оплати. Коди за замовчуванням: <br><strong>0 Готівка</strong> <br><strong>1 Безготівка</strong> <br><strong>2 Картка</strong> <br><strong>3 Передплата</strong> <br><strong>4 Післясплата</strong> <br><strong>5 Кредит</strong> <br><strong>6 Сертифікат</strong> <br><strong>8 Чек</strong> <br><strong>11 Бонусні бали</strong> <br><strong>12 Погашення кредиту</strong> <br><strong>13 Переказ через QR-код</strong> <br><strong>14 Переказ з картки</strong> <br><strong>15 Переказ з поточного рахунку</strong> <br><strong>16 Інтернет еквайринг</strong> <br><strong>17 Платіж LiqPay</strong> <br><strong>18 Платіж через сервіс переказу ROZETKA Pay</strong> <br><strong>19 Платіж Portmone</strong> <br><strong>20 Платіж NovaPay</strong> <br> Або ж кастомний варіант (налаштовується у кабінеті)</td> <td>✅</td> </tr> <tr> <td>sum</td> <td>float</td> <td>Сума внесення\видачі (2 знаки після коми)</td> <td>✅</td> </tr> <tr> <td>comment_up</td> <td>string</td> <td>Коментар, який друкується перед сумою</td> <td>❌</td> </tr> <tr> <td>comment_down</td> <td>string</td> <td>Коментар, який друкується після суми</td> <td>❌</td> </tr> <tr> <td>paysys</td> <td>string</td> <td>Назва платіжної системи <strong>(лише для чеку видачі готівки та чеку видачі готівки при переказі)</strong></td> <td>✔</td> </tr> <tr> <td>rrn</td> <td>string</td> <td>Код транзакції <strong>Обов'язкове поле для task 4, 16</strong></td> <td>✔</td> </tr> <tr> <td>cardmask</td> <td>string</td> <td>Замаскований номер картки <strong>(лише для чеку видачі готівки та чеку видачі готівки при переказі)</strong></td> <td>✔</td> </tr> <tr> <td>term_id</td> <td>string</td> <td>Ідентифікатор платіжного терміналу <strong>(лише для чеку видачі готівки та чеку видачі готівки при переказі)</strong></td> <td>✔</td> </tr> <tr> <td>bank_id</td> <td>string</td> <td>Ідентифікатор банку <strong>Обов'язкове поле для task 4, 16</strong></td> <td>✔</td> </tr> <tr> <td>auth_code</td> <td>string</td> <td>Код авторизації <strong>(лише для чеку видачі готівки та чеку видачі готівки при переказі)</strong></td> <td>✔</td> </tr> <tr> <td>commission</td> <td>float</td> <td>Сума комісії <strong>(лише для чеку видачі готівки та чеку видачі готівки при переказі)</strong></td> <td>✔</td> </tr> </tbody> </table> ## Структура відповіді {#fs--response-structure} <table> <thead> <tr> <th>Ключ</th> <th>Тип json даних</th> <th>Зміст</th> <th>Обов'язковий</th> </tr> </thead> <tbody> <tr> <td>ver</td> <td>integer</td> <td>Версія схеми (службове поле)</td> <td>✅</td> </tr> <tr> <td>source</td> <td>string</td> <td>Назва джерела завдання</td> <td>✅</td> </tr> <tr> <td>device</td> <td>string</td> <td>Фіскальний номер каси</td> <td>✅</td> </tr> <tr> <td>tag</td> <td>string</td> <td>Мітка завдання для ідентифікації відповіді</td> <td>✅</td> </tr> <tr> <td>dt</td> <td>string</td> <td>Дата та час виконання в форматі <em>YYYYMMDDHHMMSS</em></td> <td>✅</td> </tr> <tr> <td>res</td> <td>integer</td> <td>Код результату <br>0 - ОК <br>&gt; 0 - код помилки</td> <td>✅</td> </tr> <tr> <td>res_action</td> <td>integer</td> <td>Подальші рекомендовані дії для збереження транзакційної цілісності <br>0 - ОК, можна переходити до наступного завдання <br>1 - помилка, завдання не пройшло, необхідно повторити запит <br>2 - помилка + колізія. Виправлення колізії буде виконано при наступному запиті, тому необхідно виконати повтор для збереження транзакційності <br>3 - помилка, що потребує зупинки та ручного фіксу</td> <td>✅</td> </tr> <tr> <td>errortxt</td> <td>string</td> <td>Текстова інформація про помилку</td> <td>✅</td> </tr> <tr> <td>error_extra</td> <td>object | null</td> <td>Опційний об'єкт, в якому повертаються деталі щодо помилки. Наприклад перелік полів, та причини, чому вони не пройшли валідацію</td> <td>✅</td> </tr> <tr> <td>warnings</td> <td>array</td> <td>Масив об'єктів вигляду {code: 0, wtxt: "..."} з кодами та текстами попереджень, які потрібно донести до касира. Перелік кодів та текстів у розділі <strong>"Опис помилок"</strong></td> <td>✅</td> </tr> <tr> <td>task</td> <td>integer</td> <td>Тип завдання</td> <td>✅</td> </tr> <tr> <td>info</td> <td>object</td> <td>Вихідні дані <br><em>Опис об'єкту info для конкретного типу завдання приведено у самих запитах нижче</em></td> <td>✅</td> </tr> </tbody> </table> # Фіскальні запити {#fiscal-requests} ## Відкриття зміни (`"task": 0`) {#fr--open-shift} <details> <summary>Деталі</summary> Якщо зміну на ПРРО закрито, то при надсиланні першого чеку (task = 1,2,3,4,14,15,16) **автоматично** надсилається запит на відкриття зміни. **Опис відповіді** **Структура об'єкту info для завдання відкриття зміни** <table> <thead> <tr> <th>Ключ</th> <th>Тип json даних</th> <th>Зміст</th> <th>Обов'язковий</th> </tr> </thead> <tbody> <tr> <td>task</td> <td>integer</td> <td>Тип завдання</td> <td>✅</td> </tr> <tr> <td>dt</td> <td>string</td> <td>Дата та час проведення чеку в форматі <em>YYYYMMDDHHMMSS</em></td> <td>✅</td> </tr> <tr> <td>fisid</td> <td>string</td> <td>Фіскальний номер каси</td> <td>✅</td> </tr> <tr> <td>doccode</td> <td>string</td> <td>Фіскальний номер чеку</td> <td>✅</td> </tr> <tr> <td>dataid</td> <td>integer</td> <td>Номер сформованого пакету</td> <td>✅</td> </tr> <tr> <td>shift_link</td> <td>integer</td> <td>Номер зміни каси</td> <td>✅</td> </tr> <tr> <td>shift_id</td> <td>string</td> <td>ID зміни</td> <td>✅</td> </tr> <tr> <td>cashier</td> <td>string</td> <td>Інформація про касира</td> <td>✅</td> </tr> <tr> <td>isoffline</td> <td>bool</td> <td>В якому режимі проведено чек <br>true - в офлайні <br>false - в онлайні</td> <td>✅</td> </tr> <tr> <td>safe</td> <td>float</td> <td>Сума готівки в касі</td> <td>✅</td> </tr> <tr> <td>dtype</td> <td>integer</td> <td>Тип девайсу <br>0 - тестовий <br>1 - фіскальний</td> <td>✅</td> </tr> </tbody> </table> ## відкриття_зміни {.tabset} #### Приклад запиту ```json curl --location --request POST 'https://kasa.vchasno.ua/api/v3/fiscal/execute' \ --header 'Content-Type: application/json' \ --header 'Authorization: VCHASNO_KASA_PRRO_TOKEN' \ --data-raw '{ "fiscal": { "task": 0 } }' ``` #### Приклад успішної json відповіді ```json { "task": 0, "type": 1, "ver": 6, "source": "", "device": "99997655555555", "tag": "33d2bd1acb739cc9d80a7d24451ba318", "dt": "20240131100530", "res": 0, "res_action": 0, "errortxt": "", "warnings": [], "info": { "task": 0, "fisid": "99997655555555", "dataid": 195, "doccode": "TEST_JC5D9PZUrd-ZKQ", "dt": "20240131100530", "cashier": "", "dtype": 0, "isprint": 0, "isoffline": false, "safe": 0, "shift_link": 46, "shift_id": "6b72e68d-e596-4e11-a190-bedbded40cc2" }, "error_extra": null } ``` </details> ## Чек продажу (`"task": 1`) {#fr--sale-receipt} <details> <summary>Деталі</summary> **Опис відповіді** **Структура об'єкту info для завдань 1, 2, 3, 4, 14, 15, 16 (чек продажу та повернення, службове внесення/видача, чек видачі готівки, чек переказу коштів, чек видачі коштів при переказі)** <table> <thead> <tr> <th>Ключ</th> <th>Тип json даних</th> <th>Зміст</th> <th>Обов'язковий</th> </tr> </thead> <tbody> <tr> <td>task</td> <td>integer</td> <td>Тип завдання</td> <td>✅</td> </tr> <tr> <td>dt</td> <td>string</td> <td>Дата та час проведення чеку в форматі <em>YYYYMMDDHHMMSS</em></td> <td>✅</td> </tr> <tr> <td>fisid</td> <td>string</td> <td>Фіскальний номер каси</td> <td>✅</td> </tr> <tr> <td>doccode</td> <td>string</td> <td>Фіскальний номер чеку</td> <td>✅</td> </tr> <tr> <td>dataid</td> <td>integer</td> <td>Номер сформованого пакету</td> <td>✅</td> </tr> <tr> <td>shift_link</td> <td>integer</td> <td>Номер зміни каси</td> <td>✅</td> </tr> <tr> <td>cashier</td> <td>string</td> <td>Інформація про касира</td> <td>✅</td> </tr> <tr> <td>isoffline</td> <td>bool</td> <td>В якому режимі проведено чек true - в офлайні false - в онлайні</td> <td>✅</td> </tr> <tr> <td>safe</td> <td>float</td> <td>Сума готівки в касі</td> <td>✅</td> </tr> <tr> <td>dtype</td> <td>integer</td> <td>Тип девайсу 0 - тестовий 1 - фіскальний</td> <td>✅</td> </tr> <tr> <td>qr</td> <td>string</td> <td>Посилання на електронний фіскальний чек Вчасно.Каса</td> <td>✅</td> </tr> <tr> <td>cancelid</td> <td>string</td> <td>Ідентифікатор для відміни операції</td> <td>✅</td> </tr> <tr> <td>mac</td> <td>string</td> <td>Контрольне число послідовності чеків</td> <td>✅</td> </tr> </tbody> </table> ## чек_продажу {.tabset} #### Приклад запиту ```json curl --location --request POST 'https://kasa.vchasno.ua/api/v3/fiscal/execute' \ --header 'Content-Type: application/json' \ --header 'Authorization: VCHASNO_KASA_PRRO_TOKEN' \ --data-raw '{ "userinfo": { "email": "RECIPIENT_EMAIL", "phone": "+380XXXXXXXXX" }, "fiscal": { "task": 1, "receipt": { "sum": 199.99, "round": 0.01, "comment_up": "Зразок! Коментар шапки чеку", "comment_down": "Зразок! ДЯКУЄМО за покупку", "disc": 10.00, "disc_type": 0, "rows": [ { "code": "00001", "pop": "Оплата за послуги користування ПРРО", "code1": "73463253", "code2": "54321", "code_aa": [ "XX11111111111", "XX11111111112" ], "name": "Продукт 1", "cnt": 2, "price": 55.00, "disc": 10.00, "taxgrp": "4", "comment": "Зразок! Коментар" }, { "code": "00002", "code1": "73463254", "code2": "45667", "code_a": "XX11111111113", "name": "Продукт 2", "cnt": 1, "price": 89.99, "disc": -10.00, "taxgrp": 3, "comment": "Зразок! \"Have a good day\"" } ], "pays": [ { "type": 0, "sum": 150.00, "change": 50.00, "comment": "Зразок! Тест" }, { "type": 2, "sum": 40.00, "commission": 1.00, "paysys": "paysys_test", "rrn": "rrn_test", "oper_type": "Оплата", "cardmask": "cardmask****test", "term_id": "term_id", "bank_name": "bank_name", "bank_id": "bank_id", "auth_code": "auth_code", "comment": "Зразок! СЛАВА*УКРАЇНІ", "show_additional_info": true } ] } } }' ``` #### Приклад успішної json відповіді ```json { "task": 1, "type": 1, "ver": 6, "source": "", "device": "99997955555555", "tag": "ea1a404fcc8f48f3e1dea03fe1ad3cbd", "dt": "20241114121430", "res": 0, "res_action": 0, "errortxt": "", "warnings": [], "info": { "task": 1, "fisid": "99997955555555", "dataid": 152, "doccode": "TEST_7B_WSDzzmo9H7w", "dt": "20241114121430", "cashier": "", "dtype": 0, "isprint": 0, "isoffline": false, "safe": 150, "shift_link": 37, "docno": 1, "cancelid": "TEST_7B_WSDzzmo9H7w", "qr": "https://kasa.vchasno.ua/c/TEST_7B_WSDzzmo9H7w?id=TEST_7B_WSDzzmo9H7w&date=20241114&time=12:14:30&fn=99997955555555&sm=189.99&mac=e8acd9a470a6b4258ec4df473bb2a121094543d48f611084f1bfb08cb712f2e8", "mac": "e8acd9a470a6b4258ec4df473bb2a121094543d48f611084f1bfb08cb712f2e8" }, "error_extra": null } ``` </details> ## Чек повернення (`"task": 2`) {#fr--return-receipt} <details> <summary>Деталі</summary> **Опис відповіді** Структура відповіді аналогічна чеку продажу (описано вище) ## чек_повернення {.tabset} #### Приклад запиту ```json curl --location --request POST 'https://kasa.vchasno.ua/api/v3/fiscal/execute' \ --header 'Content-Type: application/json' \ --header 'Authorization: VCHASNO_KASA_PRRO_TOKEN' \ --data-raw '{ "fiscal": { "task": 2, "receipt": { "sum": 199.99, "round": 0.01, "comment_up": "Зразок! Коментар шапки чеку", "comment_down": "Зразок! ДЯКУЄМО за повернення", "rows": [ { "code": "00001", "code1": "73463253", "code2": "54321", "code_aa": [ "XX11111111111", "XX11111111112" ], "name": "Продукт 1", "cnt": 2, "price": 55.00, "disc": 10.00, "taxgrp": "4", "comment": "Зразок! Коментар" }, { "code": "00002", "code1": "73463254", "code2": "45667", "code_a": "XX11111111113", "name": "Продукт 2", "cnt": 1, "price": 89.99, "disc": -10.00, "taxgrp": 3, "comment": "Зразок! \"Have a good day\"" } ], "pays": [ { "type": 0, "sum": 150.00, "change": 50.00, "comment": "Зразок! Тест" }, { "type": 2, "sum": 50.00, "commission": 1.00, "paysys": "paysys_test", "rrn": "rrn_test", "oper_type": "Оплата", "cardmask": "cardmask****test", "term_id": "term_id", "bank_id": "bank_id", "auth_code": "auth_code", "comment": "Зразок! СЛАВА*УКРАЇНІ", "show_additional_info": true } ] } } }' ``` #### Приклад успішної json відповіді ```json { "task": 2, "type": 1, "ver": 6, "source": "", "device": "99997955555555", "tag": "6fd430b3685d1d445c8a611d61cdd54a", "dt": "20241114121508", "res": 0, "res_action": 0, "errortxt": "", "warnings": [], "info": { "task": 2, "fisid": "99997955555555", "dataid": 153, "doccode": "TEST_g8MjrMAN_X6lKA", "dt": "20241114121508", "cashier": "", "dtype": 0, "isprint": 0, "isoffline": false, "safe": 0, "shift_link": 37, "docno": 1, "cancelid": "TEST_g8MjrMAN_X6lKA", "qr": "https://kasa.vchasno.ua/c/TEST_g8MjrMAN_X6lKA?id=TEST_g8MjrMAN_X6lKA&date=20241114&time=12:15:08&fn=99997955555555&sm=199.99&mac=975e62f6827b43fc88bc9997a6a36c68d95fb0cc8fea82d8ac89e9b75ac3050f", "mac": "975e62f6827b43fc88bc9997a6a36c68d95fb0cc8fea82d8ac89e9b75ac3050f" }, "error_extra": null } ``` </details> ## Чек передплати (`"task": 1, "subtask": 1`) {#fr--prepayment-receipt} <details> <summary>Деталі</summary> **Додаткові параметри для створення чеку передплати** У об'єкті **rows** параметр **cnt** має бути 0 У об'єкті **fiscal** параметр **subtask=1** вказує що це чек передплати, обов'язковий параметр, якщо його пропустити, не буде створено чек передплати Об'єкт **rows_pre_payment** опційний. Вказуються всі товари по яким робиться чек передоплати, для кращої валідації чеку постоплати ## чек_передплати {.tabset} #### Приклад запиту ```json curl --location --request POST 'https://kasa.vchasno.ua/api/v3/fiscal/execute' \ --header 'Content-Type: application/json' \ --header 'Authorization: VCHASNO_KASA_PRRO_TOKEN' \ --data-raw '{ "fiscal": { "task": 1, "subtask": 1, "receipt": { "sum": 50.00, "round": 0, "comment_down": "Передплата по товарах: Товар, 100.00 грн", "rows": [ { "name": "Передплата", "cnt": 0, "price": 50.00, "disc": 0, "taxgrp": "1" } ], "rows_pre_payment": [ { "name": "Товар", "cnt": 1, "price": 100.00, "disc": 0, "taxgrp": "1", "code_aa": [] } ], "pays": [ { "type": 0, "sum": 50.00, "change": 0 } ] } } }' ``` #### Приклад успішної json відповіді ```json { "task": 1, "type": 1, "ver": 6, "source": "", "device": "99997955555555", "tag": "95ecf2c0b92d7b12e6ac9ee1e77131d0", "dt": "20241114121544", "res": 0, "res_action": 0, "errortxt": "", "warnings": [], "info": { "task": 1, "fisid": "99997955555555", "dataid": 154, "doccode": "TEST_kD2wSQzTqMSMdA", "dt": "20241114121544", "cashier": "", "dtype": 0, "isprint": 0, "isoffline": false, "safe": 50, "shift_link": 37, "docno": 2, "cancelid": "TEST_kD2wSQzTqMSMdA", "qr": "https://kasa.vchasno.ua/c/TEST_kD2wSQzTqMSMdA?id=TEST_kD2wSQzTqMSMdA&date=20241114&time=12:15:44&fn=99997955555555&sm=50.00&mac=9facb17a574dfcc29a03e48905fc88d3907b4cafc4777ac97fb5155eb5227d5d", "mac": "9facb17a574dfcc29a03e48905fc88d3907b4cafc4777ac97fb5155eb5227d5d" }, "error_extra": null } ``` </details> ## Чек післяплати (`"task": 1, "subtask": 2`) {#fr--postpayment-receipt} <details> <summary>Деталі</summary> **Додаткові параметри для створення чеку післяплати** **post_payment_of_check_fn**: prepayment_check_fn вказується для прив'язки до чеку передплати У об'єкті **fiscal** обов'язковий параметр **subtask: 2** який вказує що це чек післяплати У об'єкті **rows** обов'язковий параметр **disc_apply_type: 1** для знижок у післяплати ## чек_післяплати {.tabset} #### Приклад запиту ```json curl --location --request POST 'https://kasa.vchasno.ua/api/v3/fiscal/execute' \ --header 'Content-Type: application/json' \ --header 'Authorization: VCHASNO_KASA_PRRO_TOKEN' \ --data-raw '{ "post_payment_of_check_fn": "TEST_kD2wSQzTqMSMdA", "fiscal": { "task": 1, "subtask": 2, "receipt": { "sum": 50.00, "round": 0, "comment_down": "Післяплата по товарах: Товар, 100.00 грн. Чек передплати: TEST_kD2wSQzTqMSMdA", "rows": [ { "name": "Товар ", "cnt": 1, "price": 100.00, "disc": 50.00, "disc_apply_type": 1, "taxgrp": "1", "code_aa": [] } ], "pays": [ { "type": 0, "sum": 50.00, "change": 0 } ] } } }' ``` #### Приклад успішної json відповіді ```json { "task": 1, "type": 1, "ver": 6, "source": "", "device": "99997955555555", "tag": "a54aa166bcf17b33d9933fc5d7d109b2", "dt": "20241114121643", "res": 0, "res_action": 0, "errortxt": "", "warnings": [], "info": { "task": 1, "fisid": "99997955555555", "dataid": 155, "doccode": "TEST_K7_fVdv_44YxdA", "dt": "20241114121643", "cashier": "", "dtype": 0, "isprint": 0, "isoffline": false, "safe": 100, "shift_link": 37, "docno": 3, "cancelid": "TEST_K7_fVdv_44YxdA", "qr": "https://kasa.vchasno.ua/c/TEST_K7_fVdv_44YxdA?id=TEST_K7_fVdv_44YxdA&date=20241114&time=12:16:43&fn=99997955555555&sm=50.00&mac=c15a64d915581ca9b9dc8f184fcb9ff0f594c04ab8ceefb4e8c70e82c9a9fd3f", "mac": "c15a64d915581ca9b9dc8f184fcb9ff0f594c04ab8ceefb4e8c70e82c9a9fd3f" }, "error_extra": null } ``` </details> ## Чек видачі готівки (`"task": 14`) {#fr--cash-withdrawal-receipt} <details> <summary>Деталі</summary> **Опис відповіді** Структура відповіді аналогічна чеку продажу (описано вище) ## чек_видачі_готівки {.tabset} #### Приклад запиту ```json curl --location --request POST 'https://kasa.vchasno.ua/api/v3/fiscal/execute' \ --header 'Content-Type: application/json' \ --header 'Authorization: VCHASNO_KASA_PRRO_TOKEN' \ --data-raw '{ "fiscal": { "task": 14, "cash": { "type": 2, "sum": 100, "commission": 1.01, "bank_id": "bank_id", "term_id": "terminal_id", "paysys": "paysys_test", "rrn": "rrn_test", "cardmask": "cardmask****test", "auth_code": "auth_code", "comment_up": "Зразок! Верхній комент", "comment_down": "Зразок Нижній комент" } } }' ``` #### Приклад успішної json відповіді ```json { "task": 14, "type": 1, "ver": 6, "source": "", "device": "99997955555555", "tag": "9926384e47ac3bd369959bf2aa13bb13", "dt": "20241114121810", "res": 0, "res_action": 0, "errortxt": "", "warnings": [], "info": { "task": 14, "fisid": "99997955555555", "dataid": 158, "doccode": "TEST_muS2KtTYKboVbA", "dt": "20241114121810", "cashier": "", "dtype": 0, "isprint": 0, "isoffline": false, "safe": 0, "shift_link": 37, "docno": 1, "cancelid": "TEST_muS2KtTYKboVbA", "qr": "https://kasa.vchasno.ua/c/TEST_muS2KtTYKboVbA?id=TEST_muS2KtTYKboVbA&date=20241114&time=12:18:10&fn=99997955555555&sm=101.01&mac=b617916f2ab2b1eef8644321d29b4f44e60f8cca06de4964a82660c6eaeacfd9", "mac": "b617916f2ab2b1eef8644321d29b4f44e60f8cca06de4964a82660c6eaeacfd9" }, "error_extra": null } ``` </details> ## Чек переказу коштів (`"task": 15`) {#fr--money-transfer-receipt} <details> <summary>Деталі</summary> **Валідація:** Якщо хоча б в одному із об'єктів заповнені **payer_code** та/або **payer_name**, інші об'єкти повинні мати ідентичні дані по цим полям Якщо в одному із об'єктів відсутнє значення **payer_code** і **payer_name**, заповнюємо з того об'єкту де воно є автоматично Заборонено використовувати форму оплати "Інше" для чеку переказу коштів **Додаткові поля об'єкту fiscal.receipt для чеку переказу коштів:** <table> <thead> <tr> <th>Ключ</th> <th>Тип json даних</th> <th>Зміст</th> <th>Обов'язковий</th> </tr> </thead> <tbody> <tr> <td>psp_id</td> <td>string</td> <td>Номер ПТКС / номер відокремленого підрозділу надавача платіжних послуг <strong>За наявності</strong></td> <td>✅</td> </tr> <tr> <td>psp_name</td> <td>string</td> <td>Найменування надавача платіжних послуг <strong>За наявності</strong></td> <td>✅</td> </tr> <tr> <td>psp_code</td> <td>string</td> <td>Податковий номер надавача платіжних послуг <strong>За наявності</strong></td> <td>✅</td> </tr> </tbody> </table> **Додаткові поля об'єкту fiscal.receipt.rows для чеку переказу коштів:** <table> <thead> <tr> <th>Ключ</th> <th>Тип json даних</th> <th>Зміст</th> <th>Обов'язковий</th> </tr> </thead> <tbody> <tr> <td>recipient_name</td> <td>string</td> <td>Назва одержувача <strong>За наявності</strong></td> <td>✅</td> </tr> <tr> <td>recipient_code</td> <td>string</td> <td>Ідентифікаційний код одержувача <strong>За наявності</strong></td> <td>✅</td> </tr> <tr> <td>payer_name</td> <td>string</td> <td>Найменування платника <strong>За наявності</strong></td> <td>✅</td> </tr> <tr> <td>payer_code</td> <td>string</td> <td>Ідентифікаційний код платника <strong>За наявності</strong></td> <td>✅</td> </tr> <tr> <td>recipient_pan</td> <td>string</td> <td>Реквізити платіжного засобу отримувача <strong>За наявності</strong></td> <td>✅</td> </tr> <tr> <td>recipient_nban</td> <td>string</td> <td>Номер рахунку отримувача відкритого у небанківського надавача платіжних послуг <strong>За наявності</strong></td> <td>✅</td> </tr> <tr> <td>payer_pan</td> <td>string</td> <td>Реквізити платіжного засобу платника <strong>За наявності</strong></td> <td>✅</td> </tr> <tr> <td>payer_pr</td> <td>string</td> <td>Підстава платежу платником <strong>За наявності</strong></td> <td>✅</td> </tr> <tr> <td>transfer_id</td> <td>string</td> <td>Ідентифікатор переказу <strong>За наявності</strong></td> <td>✅</td> </tr> <tr> <td>recipient_bankid</td> <td>string</td> <td>Код банку одержувача <strong>За наявності</strong></td> <td>✅</td> </tr> <tr> <td>recipient_bankname</td> <td>string</td> <td>Найменування банку одержувача <strong>За наявності</strong></td> <td>✅</td> </tr> <tr> <td>recipient_ban</td> <td>string</td> <td>Номер рахунку в банку одержувача <strong>За наявності</strong></td> <td>✅</td> </tr> <tr> <td>pop</td> <td>string</td> <td>Призначення платежу (одержувача) <strong>За наявності</strong></td> <td>✅</td> </tr> </tbody> </table> **Опис відповіді** Структура відповіді аналогічна чеку продажу (описано вище) ## чек_переказу_коштів {.tabset} #### Приклад запиту ```json curl --location --request POST 'https://kasa.vchasno.ua/api/v3/fiscal/execute' \ --header 'Content-Type: application/json' \ --header 'Authorization: VCHASNO_KASA_PRRO_TOKEN' \ --data-raw '{ "fiscal": { "task": 15, "receipt": { "sum": 110.00, "comment_up": "Зразок! Коментар шапки чеку", "comment_down": "Зразок! Дякуємо", "psp_id": "psp_id", "psp_code": "psp_code", "psp_name": "psp_name", "rows": [ { "code": "1", "name": "Переказ коштів", "pop": "Оплата за послуги користування ПРРО", "recipient_name": "Вчасно Сервіс", "recipient_code": "recipient_code", "payer_name": "Кобилянська О. Ю.", "payer_code": "payer_code", "recipient_pan": "recipient_pan", "recipient_nban": "recipient_nban", "payer_pan": "payer_pan", "payer_pr": "payer_pr", "transfer_id": "transfer_id", "recipient_bankid": "recipient_bankid", "recipient_bankname": "recipient_bankname", "recipient_ban": "recipient_ban", "cnt": 1, "price": 100.00, "cost": 100.00, "taxgrp": 2, "comment": "Коментар", "disc": 0 } ], "pays": [ { "type": 0, "sum": 100.00, "commission": 10.00, "bank_id": "EVOPAY", "rrn": "rrn1234" } ] } } }' ``` #### Приклад успішної json відповіді ```json { "task": 15, "type": 1, "ver": 6, "source": "", "device": "9999973304407430", "tag": "09cc6d20aa059b2e4dbd033f6068a23d", "dt": "20250318101337", "res": 0, "res_action": 0, "errortxt": "", "warnings": [], "info": { "task": 15, "fisid": "9999973304407430", "dataid": 126, "doccode": "TEST_BHWyKU8KbdGkIQ", "dt": "20250318101337", "cashier": "", "dtype": 0, "isprint": 0, "isoffline": false, "safe": 940.5, "shift_link": 15, "docno": 4, "cancelid": "TEST_BHWyKU8KbdGkIQ", "qr": "https://kasa.vchasno.ua/c/TEST_BHWyKU8KbdGkIQ?id=TEST_BHWyKU8KbdGkIQ&sm=110.00&fn=9999973304407430&date=20250318&time=10:13:37", "mac": "7b1deb9bf40167ec765a17945dc7b88320da6429f6a0d4fda60478871cb0abc9" }, "error_extra": null } ``` </details> ## Чек видачі коштів при переказі (`"task": 16`) {#fr--transfer-payout-receipt} <details> <summary>Деталі</summary> **Додаткові поля об'єкту fiscal.receipt для чеку видачі коштів при переказі:** <table> <thead> <tr> <th>Ключ</th> <th>Тип json даних</th> <th>Зміст</th> <th>Обов'язковий</th> </tr> </thead> <tbody> <tr> <td>psp_id</td> <td>string</td> <td>Номер ПТКС / номер відокремленого підрозділу надавача платіжних послуг <strong>За наявності</strong></td> <td>✅</td> </tr> <tr> <td>psp_name</td> <td>string</td> <td>Найменування надавача платіжних послуг <strong>За наявності</strong></td> <td>✅</td> </tr> <tr> <td>psp_code</td> <td>string</td> <td>Податковий номер надавача платіжних послуг <strong>За наявності</strong></td> <td>✅</td> </tr> </tbody> </table> **Додаткові поля об'єкту fiscal.receipt.rows для чеку видачі коштів при переказі:** <table> <thead> <tr> <th>Ключ</th> <th>Тип json даних</th> <th>Зміст</th> <th>Обов'язковий</th> </tr> </thead> <tbody> <tr> <td>recipient_name</td> <td>string</td> <td>Назва одержувача <strong>За наявності</strong></td> <td>✅</td> </tr> <tr> <td>recipient_code</td> <td>string</td> <td>Ідентифікаційний код одержувача <strong>За наявності</strong></td> <td>✅</td> </tr> <tr> <td>payer_name</td> <td>string</td> <td>Найменування платника <strong>За наявності</strong></td> <td>✅</td> </tr> <tr> <td>payer_code</td> <td>string</td> <td>Ідентифікаційний код платника <strong>За наявності</strong></td> <td>✅</td> </tr> <tr> <td>recipient_pan</td> <td>string</td> <td>Реквізити платіжного засобу отримувача <strong>За наявності</strong></td> <td>✅</td> </tr> <tr> <td>recipient_nban</td> <td>string</td> <td>Номер рахунку отримувача відкритого у небанківського надавача платіжних послуг <strong>За наявності</strong></td> <td>✅</td> </tr> <tr> <td>payer_pan</td> <td>string</td> <td>Реквізити платіжного засобу платника <strong>За наявності</strong></td> <td>✅</td> </tr> <tr> <td>payer_pr</td> <td>string</td> <td>Підстава платежу платником <strong>За наявності</strong></td> <td>✅</td> </tr> <tr> <td>transfer_id</td> <td>string</td> <td>Ідентифікатор переказу <strong>За наявності</strong></td> <td>✅</td> </tr> <tr> <td>recipient_bankid</td> <td>string</td> <td>Код банку одержувача <strong>За наявності</strong></td> <td>✅</td> </tr> <tr> <td>recipient_bankname</td> <td>string</td> <td>Найменування банку одержувача <strong>За наявності</strong></td> <td>✅</td> </tr> <tr> <td>recipient_ban</td> <td>string</td> <td>Номер рахунку в банку одержувача <strong>За наявності</strong></td> <td>✅</td> </tr> <tr> <td>pop</td> <td>string</td> <td>Призначення платежу (одержувача) <strong>За наявності</strong></td> <td>✅</td> </tr> </tbody> </table> **Опис відповіді** Структура відповіді аналогічна чеку продажу (описано вище) ## чек_видачі_коштів_при_переказі {.tabset} #### Приклад запиту ```json curl --location --request POST 'https://kasa.vchasno.ua/api/v3/fiscal/execute' \ --header 'Content-Type: application/json' \ --header 'Authorization: VCHASNO_KASA_PRRO_TOKEN' \ --data-raw '{ "fiscal": { "task": 16, "receipt": { "sum": 50.00, "comment_up": "Зразок! Коментар шапки чеку", "comment_down": "Зразок! Дякуємо", "rows": [ { "code": "1", "name": "Переказ коштів", "pop": "Оплата за послуги користування ПРРО", "recipient_name": "Вчасно Сервіс", "recipient_code": "41231992", "payer_name": "Кобилянська О. Ю.", "payer_code": "774635422", "cnt": 1, "price": 40.00, "cost": 40.00, "commission": 10.0, "taxgrp": 2, "comment": "Коментар", "disc": 0 } ], "pays": [] }, "cash": { "type": 1, "sum": 40.00, "commission": 10.00, "bank_id": "EVOPAY", "rrn": "rrn1234" } } }' ``` #### Приклад успішної json відповіді ```json { "task": 16, "type": 1, "ver": 6, "source": "", "device": "9999973304407430", "tag": "b216810fd02c37ddeaa37a39944a0971", "dt": "20250317124218", "res": 0, "res_action": 0, "errortxt": "", "warnings": [], "info": { "task": 16, "fisid": "9999973304407430", "dataid": 104, "doccode": "TEST_Mo173a74miyVDg", "dt": "20250317124218", "cashier": "", "dtype": 0, "isprint": 0, "isoffline": false, "safe": 730, "shift_link": 14, "docno": 2, "cancelid": "TEST_Mo173a74miyVDg", "qr": "https://kasa.vchasno.ua/c/TEST_Mo173a74miyVDg?id=TEST_Mo173a74miyVDg&sm=50.00&fn=9999973304407430&date=20250317&time=12:42:18", "mac": "12dbf3fcca612d99ebb85983d73cc91c3cf0ba01205ecdbe90932cccda20eab8" }, "error_extra": null } ``` </details> ## Службове внесення (`"task": 3`) {#fr--service-deposit} <details> <summary>Деталі</summary> **Опис відповіді** Структура відповіді аналогічна чеку продажу (описано вище). ## службове_внесення {.tabset} #### Приклад запиту ```json curl --location --request POST 'https://kasa.vchasno.ua/api/v3/fiscal/execute' \ --header 'Content-Type: application/json' \ --header 'Authorization: VCHASNO_KASA_PRRO_TOKEN' \ --data-raw '{ "fiscal": { "task": 3, "cash": { "type": 0, "comment_up": "Зразок! Тестове внесення готівка", "sum": 500.50, "comment_down": "Зразок! Внесення" } } }' ``` #### Приклад успішної json відповіді ```json { "task": 3, "type": 1, "ver": 6, "source": "", "device": "99997955555555", "tag": "49c8b16e0ee40a2c3337fd97e9d0f8e7", "dt": "20241114121717", "res": 0, "res_action": 0, "errortxt": "", "warnings": [], "info": { "task": 3, "fisid": "99997955555555", "dataid": 156, "doccode": "TEST_Kh3BQlxRKP0cUg", "dt": "20241114121717", "cashier": "", "dtype": 0, "isprint": 0, "isoffline": false, "safe": 600.5, "shift_link": 37, "docno": 1, "cancelid": "TEST_Kh3BQlxRKP0cUg", "qr": "https://kasa.vchasno.ua/c/TEST_Kh3BQlxRKP0cUg?id=TEST_Kh3BQlxRKP0cUg&date=20241114&time=12:17:17&fn=99997955555555&sm=500.50&mac=ee8c01741c0b95cf28c6688e4e29b92fbb0c3fedf511482b8306ce0a7c75840e", "mac": "ee8c01741c0b95cf28c6688e4e29b92fbb0c3fedf511482b8306ce0a7c75840e" }, "error_extra": null } ``` </details> ## Службова видача (`"task": 4`) {#fr--service-withdrawal} <details> <summary>Деталі</summary> **Опис відповіді** Структура відповіді аналогічна чеку продажу (описано вище) ## службова_видача {.tabset} #### Приклад запиту ```json curl --location --request POST 'https://kasa.vchasno.ua/api/v3/fiscal/execute' \ --header 'Content-Type: application/json' \ --header 'Authorization: VCHASNO_KASA_PRRO_TOKEN' \ --data-raw '{ "fiscal": { "task": 4, "cash": { "type": 0, "comment_up": "Зразок! Тестова видача готівка", "sum": 500.50, "comment_down": "Зразок! Видача" } } }' ``` #### Приклад успішної json відповіді ```json { "task": 4, "type": 1, "ver": 6, "source": "", "device": "99997955555555", "tag": "6cd1fb1f115381545a486ecffae7e0ed", "dt": "20241114121744", "res": 0, "res_action": 0, "errortxt": "", "warnings": [], "info": { "task": 4, "fisid": "99997955555555", "dataid": 157, "doccode": "TEST_V4vcSOQWEKS06Q", "dt": "20241114121744", "cashier": "", "dtype": 0, "isprint": 0, "isoffline": false, "safe": 100, "shift_link": 37, "docno": 2, "cancelid": "TEST_V4vcSOQWEKS06Q", "qr": "https://kasa.vchasno.ua/c/TEST_V4vcSOQWEKS06Q?id=TEST_V4vcSOQWEKS06Q&date=20241114&time=12:17:44&fn=99997955555555&sm=500.50&mac=40657d5bda76650d3e80138c8e6eeb369dff20655ac0a1403f947446aae7d674", "mac": "40657d5bda76650d3e80138c8e6eeb369dff20655ac0a1403f947446aae7d674" }, "error_extra": null } ``` </details> ## X-звіт (`"task": 10`) {#fr--x-report} <details> <summary>Деталі</summary> **Опис відповіді** **Структура об'єкту info для завдань 10, 11 (X\Z-звіт)** <table> <thead> <tr> <th>Ключ</th> <th>Тип json даних</th> <th>Зміст</th> <th>Обов'язковий</th> </tr> </thead> <tbody> <tr> <td>task</td> <td>integer</td> <td>Тип завдання</td> <td>✅</td> </tr> <tr> <td>dt</td> <td>string</td> <td>Дата та час проведення чеку в форматі <em>YYYYMMDDHHMMSS</em></td> <td>✅</td> </tr> <tr> <td>fisid</td> <td>string</td> <td>Фіскальний номер каси</td> <td>✅</td> </tr> <tr> <td>doccode</td> <td>string</td> <td>Фіскальний номер чеку (для X-звіту повертається пусте значення)</td> <td>✅</td> </tr> <tr> <td>docno</td> <td>integer</td> <td>Порядковий номер Z-звіту</td> <td>✅</td> </tr> <tr> <td>dataid</td> <td>integer</td> <td>Номер сформованого пакету</td> <td>✅</td> </tr> <tr> <td>shift_link</td> <td>integer</td> <td>Номер зміни каси</td> <td>✅</td> </tr> <tr> <td>shift_id</td> <td>string</td> <td>ID зміни</td> <td>✅</td> </tr> <tr> <td>cashier</td> <td>string</td> <td>Інформація про касира</td> <td>✅</td> </tr> <tr> <td>isoffline</td> <td>bool</td> <td>В якому режимі проведено чек <br>true - в офлайні <br>false - в онлайні</td> <td>✅</td> </tr> <tr> <td>safe</td> <td>float</td> <td>Сума готівки в касі</td> <td>✅</td> </tr> <tr> <td>dtype</td> <td>integer</td> <td>Тип девайсу <br>0 - тестовий <br>1 - фіскальний</td> <td>✅</td> </tr> <tr> <td>taxes</td> <td>array</td> <td>Підсумки по податкам в розрізі податкових груп</td> <td>✅</td> </tr> <tr> <td>pays</td> <td>array</td> <td>Підсумки по видам оплат</td> <td>✅</td> </tr> <tr> <td>money</td> <td>array</td> <td>Підсумки по службовим внесенням\видачам</td> <td>✅</td> </tr> <tr> <td>cash</td> <td>array</td> <td>Підсумки по операціям видачі готівки</td> <td>✅</td> </tr> <tr> <td>summary</td> <td>object</td> <td>Загальні підсумки по обороту, податкам, знижкам по продажам і поверненням за зміну</td> <td>✅</td> </tr> <tr> <td>receipt</td> <td>object</td> <td>Підсумки по кількості чеків</td> <td>✅</td> </tr> <tr> <td>lastcheck</td> <td>object</td> <td>Об'єкт із даними про останній фіскальний чек в зміні.</td> <td>✅</td> </tr> </tbody> </table> **Структура об'єктів масиву info.taxes (підсумки по податкам)** <table> <thead> <tr> <th>Ключ</th> <th>Тип json даних</th> <th>Зміст</th> <th>Обов'язковий</th> </tr> </thead> <tbody> <tr> <td>gr_code</td> <td>integer</td> <td>Код податкової групи</td> <td>✅</td> </tr> <tr> <td>base_sum_p</td> <td>float</td> <td>База, обкладена податком і акцизом (сума) по продажам</td> <td>✅</td> </tr> <tr> <td>base_sum_m</td> <td>float</td> <td>База, обкладена податком і акцизом (сума) по поверненням</td> <td>✅</td> </tr> <tr> <td>tax_name</td> <td>string</td> <td>Назва податку</td> <td>✅</td> </tr> <tr> <td>tax_fname</td> <td>string</td> <td>Назва податку (повна)</td> <td>✅</td> </tr> <tr> <td>tax_lit</td> <td>string</td> <td>Буква, що позначає податок</td> <td>✅</td> </tr> <tr> <td>tax_percent</td> <td>float</td> <td>Ставка податку</td> <td>✅</td> </tr> <tr> <td>tax_sum_p</td> <td>float</td> <td>Сума податку по продажам</td> <td>✅</td> </tr> <tr> <td>tax_sum_m</td> <td>float</td> <td>Сума податку по поверненням</td> <td>✅</td> </tr> <tr> <td>ex_name</td> <td>string</td> <td>Назва акцизу</td> <td>✅</td> </tr> <tr> <td>ex_percent</td> <td>float</td> <td>Ставка акцизу</td> <td>✅</td> </tr> <tr> <td>ex_sum_p</td> <td>float</td> <td>Сума акцизу по продажам</td> <td>✅</td> </tr> <tr> <td>ex_sum_m</td> <td>float</td> <td>Сума акцизу по поверненням</td> <td>✅</td> </tr> </tbody> </table> **Структура об'єктів info.pays/money (підсумки по видам оплат, службовим внесенням/видачам)** <table> <thead> <tr> <th>Ключ</th> <th>Тип json даних</th> <th>Зміст</th> <th>Обов'язковий</th> </tr> </thead> <tbody> <tr> <td>type</td> <td>integer</td> <td>Код виду оплати</td> <td>✅</td> </tr> <tr> <td>name</td> <td>string</td> <td>Назва виду оплати</td> <td>✅</td> </tr> <tr> <td>sum_p</td> <td>float</td> <td>Сума по виду оплати по продажам</td> <td>✅</td> </tr> <tr> <td>sum_m</td> <td>float</td> <td>Сума по виду оплати по поверненням</td> <td>✅</td> </tr> <tr> <td>round_pu</td> <td>float</td> <td>Сума округлень, прийнятих в більшу сторону</td> <td>✅</td> </tr> <tr> <td>round_pd</td> <td>float</td> <td>Сума округлень прийнятих в меншу сторону</td> <td>✅</td> </tr> <tr> <td>round_mu</td> <td>float</td> <td>Сума округлень виданих в меншу сторону</td> <td>✅</td> </tr> <tr> <td>round_md</td> <td>float</td> <td>Сума округлень виданих в меншу сторону</td> <td>✅</td> </tr> </tbody> </table> **Структура об'єктів info.сash (підсумки по операціям видачі готівки)** <table> <thead> <tr> <th>Ключ</th> <th>Тип json даних</th> <th>Зміст</th> <th>Обов'язковий</th> </tr> </thead> <tbody> <tr> <td>type</td> <td>integer</td> <td>Код виду оплати</td> <td>✅</td> </tr> <tr> <td>name</td> <td>string</td> <td>Назва виду оплати</td> <td>✅</td> </tr> <tr> <td>sum_m</td> <td>float</td> <td>Сума виданої готівки</td> <td>✅</td> </tr> <tr> <td>round_mu</td> <td>float</td> <td>Сума комісії</td> <td>✅</td> </tr> </tbody> </table> **Структура об'єкту info.receipt (підсумки по кількості чеків)** <table> <thead> <tr> <th>Ключ</th> <th>Тип json даних</th> <th>Зміст</th> <th>Обов'язковий</th> </tr> </thead> <tbody> <tr> <td>count_p</td> <td>integer</td> <td>Кількість чеків продажу</td> <td>✅</td> </tr> <tr> <td>count_m</td> <td>integer</td> <td>Кількість чеків повернень</td> <td>✅</td> </tr> <tr> <td>last_docno_p</td> <td>integer</td> <td>Останній локальний номер чеку продажу в зміні</td> <td>✅</td> </tr> <tr> <td>last_docno_m</td> <td>integer</td> <td>Останній локальний номер чеку повернення в зміні</td> <td>✅</td> </tr> <tr> <td>count_transfer</td> <td>integer</td> <td>Кількість чеків переказу коштів</td> <td>✅</td> </tr> </tbody> </table> **Структура об'єкту info.summary (загальні підсумки)** <table> <thead> <tr> <th>Ключ</th> <th>Тип json даних</th> <th>Зміст</th> <th>Обов'язковий</th> </tr> </thead> <tbody> <tr> <td>base_p</td> <td>float</td> <td>Загальний обіг по продажам (сума всіх податкових баз по продажам)</td> <td>✅</td> </tr> <tr> <td>base_m</td> <td>float</td> <td>Загальний обіг по поверненням (сума всіх податкових баз по поверненням)</td> <td>✅</td> </tr> <tr> <td>taxex_p</td> <td>float</td> <td>Загальна сума всіх податків і акцизів по продажам</td> <td>✅</td> </tr> <tr> <td>taxex_m</td> <td>float</td> <td>Загальна сума всіх податків і акцизів по поверненням</td> <td>✅</td> </tr> <tr> <td>disc_p</td> <td>float</td> <td>Загальна знижка по всім товарним позиціям всіх чеків</td> <td>✅</td> </tr> <tr> <td>disc_m</td> <td>float</td> <td>Загальна націнка по всім товарним позиціям всіх чеків</td> <td>✅</td> </tr> </tbody> </table> **Структура об'єкту info.money_transfer** <table> <thead> <tr> <th>Ключ</th> <th>Тип json даних</th> <th>Зміст</th> <th>Обов'язковий</th> </tr> </thead> <tbody> <tr> <td>type</td> <td>integer</td> <td>Код виду оплати</td> <td>✅</td> </tr> <tr> <td>name</td> <td>string</td> <td>Назва</td> <td>✅</td> </tr> <tr> <td>sum_p</td> <td>float</td> <td>Чек переказу (гроші прийшли до нас)</td> <td>✅</td> </tr> <tr> <td>sum_m</td> <td>float</td> <td>Чек видачі коштів при переказі (кошти покидають нас)</td> <td>✅</td> </tr> <tr> <td>commission_p</td> <td>float</td> <td>Комісія переказу</td> <td>✅</td> </tr> <tr> <td>commission_m</td> <td>float</td> <td>Комісія видачі коштів</td> <td>✅</td> </tr> </tbody> </table> **Структура об'єкту info.lastcheck (Об'єкт із даними про останній фіскальний чек в зміні)** У вибірку потрапляють чеки з task: 1, 2, 14, 15, 16. Якщо у зміні немає чеків даного типу, відповідь info.lastcheck міститиме дефолтні значення для полів: integer=0, string=''. <table> <thead> <tr> <th>Ключ</th> <th>Тип json даних</th> <th>Зміст</th> <th>Обов'язковий</th> </tr> </thead> <tbody> <tr> <td>packnum</td> <td>integer</td> <td>Номер пакету чеку ( == info.data_id з відповіді при фіскалізації чеку)</td> <td>✅</td> </tr> <tr> <td>docnum</td> <td>integer</td> <td>Номер чеку з зміні (локальний номер).</td> <td>✅</td> </tr> <tr> <td>fisnum</td> <td>string</td> <td>Фіскальний номер чеку.</td> <td>✅</td> </tr> <tr> <td>packtype</td> <td>integer</td> <td>Тип завдання чеку, відповідає task.</td> <td>✅</td> </tr> </tbody> </table> ## x-звіт {.tabset} #### Приклад запиту ```json curl --location --request POST 'https://kasa.vchasno.ua/api/v3/fiscal/execute' \ --header 'Content-Type: application/json' \ --header 'Authorization: VCHASNO_KASA_PRRO_TOKEN' \ --data-raw '{ "fiscal": { "task": 10 } }' ``` #### Приклад успішної json відповіді ```json { "task": 10, "type": 1, "ver": 6, "source": "", "device": "99997655555555", "tag": "82cbb2831eee8f0d9617996670d45d43", "dt": "20240521162236", "res": 0, "res_action": 0, "errortxt": "", "warnings": [], "info": { "task": 10, "fisid": "99997655555555", "dataid": 0, "doccode": "", "dt": "20240521162236", "cashier": "", "dtype": 0, "isprint": 0, "isoffline": false, "safe": 377.88, "shift_link": 0, "shift_id": "6b72e68d-e596-4e11-a190-bedbded40cc2", "docno": 0, "receipt": { "count_p": 7, "count_m": 0, "count_14": 1, "count_transfer": 0, "last_docno_p": 7, "last_docno_m": 0 }, "summary": { "base_p": 350, "base_m": 0, "taxex_p": 58.31, "taxex_m": 0, "disc_p": 100, "disc_m": 0 }, "taxes": [ { "gr_code": 1, "base_sum_p": 350, "base_sum_m": 0, "base_tax_sum_p": 350, "base_tax_sum_m": 0, "base_ex_sum_p": 0, "base_ex_sum_m": 0, "tax_name": "ПДВ_А", "tax_fname": "ПДВ 20%", "tax_lit": "А", "tax_percent": 20, "tax_sum_p": 58.31, "tax_sum_m": 0, "ex_name": "", "ex_percent": 0, "ex_sum_p": 0, "ex_sum_m": 0 } ], "pays": [ { "type": 0, "name": "Готівка", "sum_p": 350, "sum_m": 0, "round_pu": 0, "round_pd": 0, "round_mu": 0, "round_md": 0 } ], "money": [ { "type": 0, "name": "Готівка", "sum_p": 500.5, "sum_m": 572.62, "round_pu": 0, "round_pd": 0, "round_mu": 0, "round_md": 0 } ], "cash": [ { "type": 2, "name": "Картка", "sum_p": 0, "sum_m": 100, "round_pu": 0, "round_pd": 0, "round_mu": 1.01, "round_md": 0 } ], "money_transfer": [] }, "error_extra": null } ``` </details> ## Z-звіт (Закриття зміни) (`"task": 11`) {#fr--z-report} <details> <summary>Деталі</summary> **Опис відповіді** Структура відповіді аналогічна X-звіту (описано вище) ## z-звіт_закриття_зміни {.tabset} #### Приклад запиту ```json curl --location --request POST 'https://kasa.vchasno.ua/api/v3/fiscal/execute' \ --header 'Content-Type: application/json' \ --header 'Authorization: VCHASNO_KASA_PRRO_TOKEN' \ --data-raw '{ "fiscal": { "task": 11 } }' ``` #### Приклад успішної json відповіді ```json { "task": 11, "type": 1, "ver": 6, "source": "", "device": "99997655555555", "tag": "704e5fca77edf44d2ce8e379bdd68429", "dt": "20240131101319", "res": 0, "res_action": 0, "errortxt": "", "warnings": [], "info": { "task": 11, "fisid": "99997655555555", "dataid": 202, "doccode": "TEST_cTMHA3qiU6DDvA", "dt": "20240131101319", "cashier": "", "dtype": 0, "isprint": 0, "isoffline": false, "safe": 400.5, "shift_link": 46, "shift_id": "6b72e68d-e596-4e11-a190-bedbded40cc2", "docno": 46, "receipt": { "count_p": 1, "count_m": 1, "count_14": 1, "count_transfer": 0, "last_docno_p": 1, "last_docno_m": 1 }, "summary": { "base_p": 199.99, "base_m": 199.99, "taxex_p": 27.17, "taxex_m": 27.17, "disc_p": 0, "disc_m": 0 }, "taxes": [ { "gr_code": 3, "base_sum_p": 99.99, "base_sum_m": 99.99, "base_tax_sum_p": 95.23, "base_tax_sum_m": 95.23, "base_ex_sum_p": 99.99, "base_ex_sum_m": 99.99, "tax_name": "ПДВ_Г", "tax_fname": "ПДВ 20% + акциз 5%", "tax_lit": "ГД", "tax_percent": 20, "tax_sum_p": 15.87, "tax_sum_m": 15.87, "ex_name": "Акцизний податок 5% Д", "ex_percent": 5, "ex_sum_p": 4.76, "ex_sum_m": 4.76 }, { "gr_code": 4, "base_sum_p": 100, "base_sum_m": 100, "base_tax_sum_p": 100, "base_tax_sum_m": 100, "base_ex_sum_p": 0, "base_ex_sum_m": 0, "tax_name": "ПДВ_В", "tax_fname": "ПДВ 7%", "tax_lit": "В", "tax_percent": 7, "tax_sum_p": 6.54, "tax_sum_m": 6.54, "ex_name": "", "ex_percent": 0, "ex_sum_p": 0, "ex_sum_m": 0 } ], "pays": [ { "type": 0, "name": "Готівка", "sum_p": 150, "sum_m": 150, "round_pu": 0.01, "round_pd": 0, "round_mu": 0.01, "round_md": 0 }, { "type": 2, "name": "Картка", "sum_p": 50, "sum_m": 50, "round_pu": 0, "round_pd": 0, "round_mu": 0, "round_md": 0 } ], "money": [ { "type": 0, "name": "Готівка", "sum_p": 1001, "sum_m": 500.5, "round_pu": 0, "round_pd": 0, "round_mu": 0, "round_md": 0 } ], "cash": [ { "type": 2, "name": "Картка", "sum_p": 0, "sum_m": 100, "round_pu": 0, "round_pd": 0, "round_mu": 1.01, "round_md": 0 } ], "money_transfer": [] }, "error_extra": null } ``` </details> ## Національний кешбек {#fr--national-cashback} #### Чек продажу (`"task": 1`) {#fr--nk-sale-receipt} <details> <summary>Деталі</summary> **Опис відповіді** Структуру відповіді можна подивитись у чеках без Національного кешбеку ## чек_продажу {.tabset} #### Приклад запиту ```json curl --location --request POST 'https://kasa.vchasno.ua/api/v3/fiscal/execute' \ --header 'Content-Type: application/json' \ --header 'Authorization: VCHASNO_KASA_PRRO_TOKEN' \ --data-raw '{ "fiscal": { "task": 1, "receipt": { "sum": 200.00, "rows": [ { "code": "00001", "code1": "73463253", "code2": "54321", "code_aa": [ "XX11111111111", "XX11111111112" ], "disc": 0, "name": "Продукт 1", "cnt": 1, "price": 200.00, "taxgrp": "1" } ], "pays": [ { "purchase_dt": "20241210135800", "type": 2, "sum": 200.00, "paysys": "paysys_test", "rrn": "rrn_test", "oper_type": "Оплата", "cardmask": "cardmask****test", "term_id": "term_id", "bank_name": "bank_name", "bank_id": "bank_id", "auth_code": "auth_code", "comment": "Зразок! СЛАВА*УКРАЇНІ", "show_additional_info": true } ] } } }' ``` #### Приклад успішної json відповіді ```json { "task": 1, "type": 1, "ver": 6, "source": "", "device": "99997955555555", "tag": "7ad71ed9dfd812f73b4c39d6067cf864", "dt": "20241210135738", "res": 0, "res_action": 0, "errortxt": "", "warnings": [], "info": { "task": 1, "fisid": "99997955555555", "dataid": 166, "doccode": "TEST_Qbpv_J3WUwT_lQ", "dt": "20241210135738", "cashier": "", "dtype": 0, "isprint": 0, "isoffline": false, "safe": 0, "shift_link": 39, "docno": 4, "cancelid": "TEST_Qbpv_J3WUwT_lQ", "qr": "https://kasa.vchasno.ua/c/TEST_Qbpv_J3WUwT_lQ?id=TEST_Qbpv_J3WUwT_lQ&date=20241210&time=13:57:38&fn=99997955555555&sm=200.00&mac=53591fe4bce3b067a06253fc787c6a3e7e0e8b8d1460ceb550612321043db92f", "mac": "53591fe4bce3b067a06253fc787c6a3e7e0e8b8d1460ceb550612321043db92f" }, "error_extra": null } ``` </details> #### Чек повернення (`"task": 2`) {#fr--nk-return-receipt} <details> <summary>Деталі</summary> **Опис відповіді** Структуру відповіді можна подивитись у чеках без Національного кешбеку ## чек_повернення {.tabset} #### Приклад запиту ```json curl --location --request POST 'https://kasa.vchasno.ua/api/v3/fiscal/execute' \ --header 'Content-Type: application/json' \ --header 'Authorization: VCHASNO_KASA_PRRO_TOKEN' \ --data-raw '{ "fiscal": { "task": 2, "receipt": { "sum": 200.00, "rows": [ { "purchase_receipt_fisn": "TEST_Qbpv_J3WUwT_lQ", "purchase_rro_fisn": "99997955555555", "purchase_receipt_dt": "20241210", "code": "00001", "code1": "73463253", "code2": "54321", "code_aa": [ "XX11111111111", "XX11111111112" ], "name": "Продукт 1", "cnt": 1, "price": 200.00, "disc": 0, "taxgrp": "1" } ], "pays": [ { "type": 2, "sum": 200.00, "paysys": "paysys_test", "rrn": "rrn_test", "oper_type": "Оплата", "cardmask": "cardmask****test", "term_id": "term_id", "bank_id": "bank_id", "auth_code": "auth_code", "comment": "Зразок! СЛАВА*УКРАЇНІ", "show_additional_info": true } ] } } }' ``` #### Приклад успішної json відповіді ```json { "task": 2, "type": 1, "ver": 6, "source": "", "device": "99997955555555", "tag": "9e079adf787629601a69148e3a997d4b", "dt": "20241210135937", "res": 0, "res_action": 0, "errortxt": "", "warnings": [], "info": { "task": 2, "fisid": "99997955555555", "dataid": 167, "doccode": "TEST_BLDVZH08aKpjrw", "dt": "20241210135937", "cashier": "", "dtype": 0, "isprint": 0, "isoffline": false, "safe": 0, "shift_link": 39, "docno": 1, "cancelid": "TEST_BLDVZH08aKpjrw", "qr": "https://kasa.vchasno.ua/c/TEST_BLDVZH08aKpjrw?id=TEST_BLDVZH08aKpjrw&date=20241210&time=13:59:37&fn=99997955555555&sm=200.00&mac=df6c67395c22429e58e1e29bb76a5997c464c5bad4388c9a4bd513448074687d", "mac": "df6c67395c22429e58e1e29bb76a5997c464c5bad4388c9a4bd513448074687d" }, "error_extra": null } ``` </details> # Службові запити {#service-requests} ## Статус пРРО (`"task": 18`) {#sr--prro-status} <details> <summary>Деталі</summary> `POST https://kasa.vchasno.ua/api/v3/fiscal/execute` Хоч даний АПІ запит має шлях як у запитів фіскалізації чеків, при його обробці не виконуються запити до ДПС, лише повертається статус з сервісу Вчасно.Каса. **Опис відповіді** **Структура об'єкту info для завдання 18 (статус пРРО)** <table> <thead> <tr> <th>Ключ</th> <th>Тип json даних</th> <th>Зміст</th> <th>Обов'язковий</th> </tr> </thead> <tbody> <tr> <td>edrpou</td> <td>string</td> <td>ЄДРПОУ/ІПН</td> <td>✅</td> </tr> <tr> <td>fisid</td> <td>string</td> <td>Фіскальний номер каси</td> <td>✅</td> </tr> <tr> <td>isFis</td> <td>integer</td> <td>ПРРО є фіскальним <br><strong>0</strong> - не фіскальний (тестовий) <br><strong>1</strong> - фіскальний</td> <td>✅</td> </tr> <tr> <td>shift_status</td> <td>integer</td> <td>Статус зміни: <br><strong>-1</strong> - невідомо <br><strong>0</strong> - закрита <br><strong>1</strong> - відкрита</td> <td>✅</td> </tr> <tr> <td>shift_dt</td> <td>string</td> <td>Дата та час відкриття активної зміни: <br><strong>""</strong> - невідомо <br><strong>інакше</strong> - дата и та час відкриття в форматі <em>YYYYMMDDHHMMSS</em></td> <td>✅</td> </tr> <tr> <td>shift_id</td> <td>string</td> <td>ID зміни</td> <td>✅</td> </tr> <tr> <td>online_status</td> <td>integer</td> <td>Статус зв'язку з ДФС: <br><strong>0</strong> - online <br><strong>1</strong> - offline</td> <td>✅</td> </tr> <tr> <td>sign_status</td> <td>integer</td> <td>Статус ЕЦП: <br><strong>-1</strong> - невідомо <br><strong>0</strong> - підпис не використовується <br><strong>1</strong> - підпис є і нема попереджень <br><strong>2</strong> - підпис є попередження <br><strong>3</strong> - підпису нема або помилка <br><strong></strong>зараз завжди повертається -1, інші статуси буде імплементовано пізніше</td> <td>✅</td> </tr> <tr> <td>safe</td> <td>float</td> <td>Сума залишку готівки в касі</td> <td>✅</td> </tr> </tbody> </table> ## статус_прро {.tabset} #### Приклад запиту ```json curl --location --request POST 'https://kasa.vchasno.ua/api/v3/fiscal/execute' \ --header 'Content-Type: application/json' \ --header 'Authorization: VCHASNO_KASA_PRRO_TOKEN' \ --data-raw '{ "fiscal": { "task": 18 } }' ``` #### Приклад успішної json відповіді ```json { "task": 18, "type": 1, "ver": 6, "source": "", "device": "99999955555555", "tag": "42fff4e7e105865f7155ac6a08cf3869", "dt": "20250321093818", "res": 0, "res_action": 0, "errortxt": "", "warnings": [], "info": { "edrpou": "55555555", "fisid": "99999955555555", "isFis": 0, "shift_status": -1, "shift_dt": "", "shift_id": "6b72e68d-e596-4e11-a190-bedbded40cc2", "online_status": 0, "sign_status": -1, "safe": 0 }, "error_extra": null } ``` </details> ## Отримати JSON завдання фіскального чеку {#sr--get-check-task-json} <details> <summary>Деталі</summary> `GET https://kasa.vchasno.ua/api/v3/check-task/<check_fisn>` Запит на отримання JSON-у запиту фіскалізованого чеку. Повертає весь json body, по якому було створено чек **check_fisn - Фіскальний номер чеку** **Опис відповіді** <table> <thead> <tr> <th>Ключ</th> <th>Тип json даних</th> <th>Зміст</th> <th>Обов'язковий</th> </tr> </thead> <tbody> <tr> <td>fiscal_number</td> <td>string</td> <td>Фіскальний номер чеку</td> <td>✅</td> </tr> <tr> <td>task</td> <td>object</td> <td>boby чеку (опис вище)</td> <td>✅</td> </tr> </tbody> </table> ## отримати_json_завдання_фіскального_чеку {.tabset} #### Приклад запиту ```json curl --location --request GET 'https://kasa.vchasno.ua/api/v3/check-task/<check_fisn>' \ --header 'Content-Type: application/json' \ --header 'Authorization: VCHASNO_KASA_PRRO_TOKEN' ``` #### Приклад успішної json відповіді ```json { "fiscal_number": "TEST_FFFFFFFFFF", "task": { "tag": "af19aacc778509cb4a9fbf28ffd4a68c", "device": "99997655555555", "fiscal": { "task": 1, "cashier": "", "receipt": { "sum": 199.99, "pays": [ { "sum": 150, "type": 0, "change": 50, "comment": "Зразок! Тест" }, { "rrn": "rrn_test", "sum": 50, "type": 2, "paysys": "paysys_test", "bank_id": "bank_id", "comment": "Зразок! СЛАВА*УКРАЇНІ", "term_id": "term_id", "cardmask": "cardmask****test", "auth_code": "auth_code", "oper_type": "Оплата", "commission": 1, "show_additional_info": true } ], "rows": [ { "cnt": 2, "code": "00001", "disc": 10, "name": "Продукт 1", "code1": "73463253", "code2": "54321", "price": 55, "taxgrp": "4", "code_aa": [ "XX11111111111", "XX11111111112" ], "comment": "Зразок! Коментар" }, { "cnt": 1, "code": "00002", "disc": -10, "name": "Продукт 2", "code1": "73463254", "code2": "45667", "price": 89.99, "code_a": "XX11111111113", "taxgrp": 3, "comment": "Зразок! \"Have a good day\"" } ], "round": 0.01, "comment_up": "Зразок! Коментар шапки чеку", "comment_down": "Зразок! ДЯКУЄМО за покупку" } }, "source": "" } } ``` </details> ## Отримати JSON чеку {#sr--get-check-json} <details> <summary>Деталі</summary> `GET https://kasa.vchasno.ua/c/{fiscal_number}.json` Запит на отримання фіскалізованого чеку у форматі JSON. Цей роут не працює з сервісними чеками та Z-звітом. fiscal_number **- Фіскальний номер чеку** Типи даних: - кількість одиниць - decimal рядок - вага - 3 знаки - '1.000' - сума - decimal рядок - відсотки - 2 знаки - '55.00' **Опис полів:** <table> <thead> <tr> <th>Ключ</th> <th>Зміст</th> </tr> </thead> <tbody> <tr> <td>fiscal_number</td> <td>Фіскальний номер чеку</td> </tr> <tr> <td>company_name</td> <td>Назва компанії</td> </tr> <tr> <td>notification_company_name</td> <td>Назва компанії для сповіщень</td> </tr> <tr> <td>company_edrpou</td> <td>ЄДРПОУ</td> </tr> <tr> <td>company_tax_number</td> <td>ПН</td> </tr> <tr> <td>shop_name</td> <td>Назва Торгової Точки</td> </tr> <tr> <td>shop_type</td> <td>Тип Торгової Точки</td> </tr> <tr> <td>shop_address</td> <td>Адреса ТТ</td> </tr> <tr> <td>rro_fiscal_number</td> <td>Фіскальний номер ПРРО</td> </tr> <tr> <td>is_offline</td> <td>Чи видано чек в офлайні</td> </tr> <tr> <td>is_test</td> <td>Чи це тестовий чек</td> </tr> <tr> <td>date_created</td> <td>Дата створення запису чеку</td> </tr> <tr> <td>check_flow</td> <td>0-продаж,1-повернення,2-службове внесення-винесення,4-переказ коштів,7-видача коштів при переказі,14-видача готівки</td> </tr> <tr> <td>check_url</td> <td>Посилання на чек в нашому кабінеті</td> </tr> <tr> <td>qr_content</td> <td>Сформований рядок для QR коду в чеці</td> </tr> <tr> <td>target_url</td> <td>Посилання на чек в ДПС</td> </tr> <tr> <td>data</td> <td>Об'єкт з деталями по чеку</td> </tr> </tbody> </table> **Об'єкт data** <table> <thead> <tr> <th>Ключ</th> <th>Зміст</th> </tr> </thead> <tbody> <tr> <td>data:cash</td> <td>Об'єкт, опис окремо</td> </tr> <tr> <td>data:check_type</td> <td>1-продаж,2-повернення,3-сервісне внесення,4-сервісне винесення,14-видача готівки,15-переказ коштів,16-видача готівки при переказі</td> </tr> <tr> <td>data:items</td> <td>Список об'єктів, опис окремо</td> </tr> <tr> <td>data:close</td> <td>Об'єкт, опис окремо</td> </tr> <tr> <td>data:pays</td> <td>Список об'єктів, опис окремо</td> </tr> <tr> <td>data:taxes</td> <td>Список об'єктів, опис окремо</td> </tr> <tr> <td>data:markups</td> <td>Сума націнки</td> </tr> <tr> <td>data:top_comment</td> <td>Верхній коментар чеку. Список з рядків, розділених по довжині в N символів</td> </tr> <tr> <td>data:last_comment</td> <td>Верхній коментар чеку. Структура як у верхнього коментаря.</td> </tr> <tr> <td>data:date</td> <td>Дата з чеку</td> </tr> <tr> <td>data:mac</td> <td>Контрольне число чеку</td> </tr> <tr> <td>data:rounding</td> <td>Сума заокруглення</td> </tr> <tr> <td>data:service_move_data</td> <td>Об'єкт, опис окремо</td> </tr> <tr> <td>data:global_discounts</td> <td>Список, опис окремо</td> </tr> </tbody> </table> **Об'єкт data:cash - в чеці видачі готівки** <table> <thead> <tr> <th>Ключ</th> <th>Зміст</th> </tr> </thead> <tbody> <tr> <td>cash_sum</td> <td>Сума готівки</td> </tr> <tr> <td>commission</td> <td>Сума комісії</td> </tr> <tr> <td>bank_id</td> <td>Ідентифікатор єквайера торговця</td> </tr> <tr> <td>term_id</td> <td>Ідентифікатор платіжного пристрою</td> </tr> <tr> <td>cardmask</td> <td>Реквізити ЕПЗ</td> </tr> <tr> <td>auth_code</td> <td>Код авторизації</td> </tr> <tr> <td>paysys</td> <td>Назва платіжної системи</td> </tr> <tr> <td>rrn</td> <td>Ідентифікатор транзакції</td> </tr> </tbody> </table> **Об'єкт data:items** <table> <thead> <tr> <th>Ключ</th> <th>Зміст</th> </tr> </thead> <tbody> <tr> <td>name</td> <td>Назва товару, послуги, або операції</td> </tr> <tr> <td>tg_print</td> <td>Позначення податку, яким обкладається товар</td> </tr> <tr> <td>sum</td> <td>Сума операції</td> </tr> <tr> <td>cnt</td> <td>Кількість</td> </tr> <tr> <td>price</td> <td>Ціна товару</td> </tr> <tr> <td>code</td> <td>Код товару в обліковій системі підприємства</td> </tr> <tr> <td>code1</td> <td>Штрихкод</td> </tr> <tr> <td>code2</td> <td>Код товарної підкатегорії згідно з УКТЗЕД</td> </tr> <tr> <td>comment</td> <td>Список рядків коментарів</td> </tr> <tr> <td>excise_codes</td> <td>Список з акцизних кодів</td> </tr> <tr> <td>markup</td> <td>Об'єкт, націнка</td> </tr> <tr> <td>discount</td> <td>Об'єкт, знижка</td> </tr> </tbody> </table> **Об'єкт data:items::markup/discount** <table> <thead> <tr> <th>Ключ</th> <th>Зміст</th> </tr> </thead> <tbody> <tr> <td>sum</td> <td>Сума операції</td> </tr> <tr> <td>tg_print</td> <td>Позначення податку</td> </tr> </tbody> </table> **Об'єкт data:close** <table> <thead> <tr> <th>Ключ</th> <th>Зміст</th> </tr> </thead> <tbody> <tr> <td>sum</td> <td>Сума чеку</td> </tr> <tr> <td>to_pay</td> <td>Сума до оплати</td> </tr> </tbody> </table> **Об'єкт data:pays** <table> <thead> <tr> <th>Ключ</th> <th>Зміст</th> </tr> </thead> <tbody> <tr> <td>name</td> <td>Тип</td> </tr> <tr> <td>pay_sum</td> <td>Сума оплати</td> </tr> <tr> <td>change</td> <td>Решта</td> </tr> <tr> <td>sum</td> <td>Сума з урухуванням решти</td> </tr> <tr> <td>comment</td> <td>Коментар</td> </tr> <tr> <td>bank_id</td> <td>Ідентифікатор єквайера торговця</td> </tr> <tr> <td>term_id</td> <td>Ідентифікатор платіжного пристрою</td> </tr> <tr> <td>operation</td> <td>Тип операції(платіж/повернення/переказ тощо)</td> </tr> <tr> <td>cardmask</td> <td>Реквізити ЕПЗ</td> </tr> <tr> <td>auth_code</td> <td>Код авторизації</td> </tr> <tr> <td>commission</td> <td>Сума комісії</td> </tr> <tr> <td>paysys</td> <td>Назва платіжної системи</td> </tr> <tr> <td>rrn</td> <td>Ідентифікатор транзакції</td> </tr> </tbody> </table> **Об'єкт data:taxes** <table> <thead> <tr> <th>Ключ</th> <th>Зміст</th> </tr> </thead> <tbody> <tr> <td>tax_caption</td> <td>позначення податку</td> </tr> <tr> <td>tax_percent</td> <td>відсоток податку</td> </tr> <tr> <td>tax_sum</td> <td>сума податку</td> </tr> <tr> <td>dt_caption</td> <td>назва додаткового збору (акциз/в.збір)</td> </tr> <tr> <td>dt_percent</td> <td>відсоток додаткового збору</td> </tr> <tr> <td>dt_sum</td> <td>сума додаткового збору</td> </tr> </tbody> </table> **Об'єкт data:service_move_data** <table> <thead> <tr> <th>Ключ</th> <th>Зміст</th> </tr> </thead> <tbody> <tr> <td>tag</td> <td>I-внесення, O-видача</td> </tr> <tr> <td>name</td> <td>назва оплати</td> </tr> </tbody> </table> **Об'єкт data:global_discounts** <table> <thead> <tr> <th>Ключ</th> <th>Зміст</th> </tr> </thead> <tbody> <tr> <td>sum</td> <td>сума загальної знижки</td> </tr> <tr> <td>name</td> <td>назва загальної знижки</td> </tr> </tbody> </table> ## отримати_json_чеку {.tabset} #### Приклад запиту ```json curl --location --request GET 'https://kasa.vchasno.ua/c/{fiscal_number}.json' \ --header 'Content-Type: application/json' \ --header 'Authorization: VCHASNO_KASA_PRRO_TOKEN' ``` #### Приклад успішної json відповіді ```json { "fiscal_number": "TEST_KkcD6uzuYeq08g", "company_name": "Приватне підприємство \"Тестер\"", "notification_company_name": "Приватне підприємство \"Тестер\"", "company_edrpou": "55555555", "company_tax_number": "", "shop_name": "Тестова торгова точка", "shop_type": "Тип Торгової Точки", "shop_address": "Україна, м.Київ, вул. Хрещатик, 999", "rro_fiscal_number": "99997655555555", "is_offline": false, "is_test": true, "date_created": "2024-01-31T10:05:55.798668+02:00", "check_flow": 0, "check_url": "https://kasa.vchasno.ua/c/TEST_KkcD6uzuYeq08g", "qr_content": "https://kasa.vchasno.ua/c/TEST_KkcD6uzuYeq08g?id=TEST_KkcD6uzuYeq08g&date=20240131&time=10:05:55&fn=99997655555555&sm=200.00&mac=160cf7bebc397274f765d73d6174b3dfc8b299786070227a31f0483a80c7d9b6", "target_url": "https://kasa.vchasno.ua/c/TEST_KkcD6uzuYeq08g?id=TEST_KkcD6uzuYeq08g&date=20240131&time=10:05:55&fn=99997655555555&sm=200.00&mac=160cf7bebc397274f765d73d6174b3dfc8b299786070227a31f0483a80c7d9b6", "data": { "cash": null, "check_type": "0", "items": [ { "name": "Продукт 1", "tg_print": "В", "sum": "110.00", "cnt": "2.000", "price": "55.00", "code": "00001", "code1": "73463253", "code2": "54321", "comment": [ "Зразок! Коментар" ], "excise_codes": [ "XX11111111111", "XX11111111112" ], "discount": { "sum": "10.00", "tg_print": "В" }, "markup": null }, { "name": "Продукт 2", "tg_print": "ГД", "sum": "89.99", "cnt": "1.000", "price": "89.99", "code": "00002", "code1": "73463254", "code2": "45667", "comment": [ "Зразок! \"Have a good day\"" ], "excise_codes": [ "XX11111111113" ], "discount": null, "markup": { "sum": "10.00", "tg_print": "ГД" } } ], "close": { "sum": "199.99", "to_pay": "200.00" }, "pays": [ { "name": "Готівка", "pay_sum": "200.00", "change": "50.00", "sum": "150.00", "comment": [ "Зразок! Тест" ], "bank_id": "", "term_id": "", "operation": "Оплата", "oper_type": "Оплата", "cardmask": "", "auth_code": "", "commission": "0.00", "paysys": "", "rrn": "", "show_additional_info": true }, { "name": "Картка", "pay_sum": "50.00", "change": "0.00", "sum": "50.00", "comment": [ "Зразок! СЛАВА*УКРАЇНІ" ], "bank_id": "bank_id", "term_id": "term_id", "operation": "Оплата", "oper_type": "Оплата", "cardmask": "cardmask****test", "auth_code": "auth_code", "commission": "1.00", "paysys": "paysys_test", "rrn": "rrn_test", "show_additional_info": true } ], "taxes": [ { "tax_caption": "ПДВ_Г", "tax_percent": "20", "tax_sum": "15.87", "dt_caption": "Акцизний податок 5% Д", "dt_percent": "0.05", "dt_sum": "4.76" }, { "tax_caption": "ПДВ_В", "tax_percent": "7", "tax_sum": "6.54", "dt_caption": "", "dt_percent": "0.00", "dt_sum": "0.00" } ], "markups": "10.00", "top_comment": [ "Зразок! Коментар шапки чеку" ], "last_comment": [ "Зразок! ДЯКУЄМО за покупку" ], "date": "2024-01-31T10:05:55+02:00", "mac": "b7c9d8cc246acaaace9d2ce1b2c375173a9262d87a34067d56a89351bd23087a", "rounding": "0.01", "service_move_data": null } } ``` </details> ## Отримати зміни по касі {#sr--get-shifts} <details> <summary>Деталі</summary> `GET https://kasa.vchasno.ua/api/v3/shifts` Запит на отримання змін по касі, ідентифікатором каси служить токен каси. За замовчуванням повертає відсортований по date_closed список об'єктів з лімітом 100 Додаткові параметри: пагінація **page=n&amp;limit=n** (значення n не може бути менше 1) **Опис відповіді об'єкту items** <table> <thead> <tr> <th>Ключ</th> <th>Зміст</th> </tr> </thead> <tbody> <tr> <td>id</td> <td>Ідентифікатор зміни</td> </tr> <tr> <td>date_started</td> <td>Дата і час початку зміни</td> </tr> <tr> <td>date_closed</td> <td>Дата і час кінця зміни</td> </tr> <tr> <td>cash_started</td> <td>Залишок готівки на початку зміни</td> </tr> <tr> <td>cash_current</td> <td>Поточний залишок готівки</td> </tr> <tr> <td>cash_closed</td> <td>Залишок готівки при закритті зміни</td> </tr> </tbody> </table> ## отримати_зміни_по_касі {.tabset} #### Приклад запиту ```json curl --location --request GET 'https://kasa.vchasno.ua/api/v3/shifts' \ --header 'Content-Type: application/json' \ --header 'Authorization: VCHASNO_KASA_PRRO_TOKEN' ``` #### Приклад успішної json відповіді ```json { "page_num": 1, "page_size": 100, "has_prev": false, "has_next": false, "items": [ { "id": "0f9c3ef1-7f6d-d8ee-5d54-2fa68dc8b6cb", "date_started": "2024-05-22T13:42:12+03:00", "date_closed": "2024-05-22T13:42:52+03:00", "cash_started": 0, "cash_current": 5000, "cash_closed": 5000 }, { "id": "0f9c3eeb-91cb-340a-e3ca-e5eb65124614", "date_started": "2024-05-22T13:41:33+03:00", "date_closed": "2024-05-22T13:42:00+03:00", "cash_started": 0, "cash_current": 0, "cash_closed": 0 } ] } ``` </details> ## Отримати чеки по зміні {#sr--get-shift-checks} <details> <summary>Деталі</summary> `GET https://kasa.vchasno.ua/api/v3/shift/checks?shift_id=<shift_id>` Запит на отримання чеків по зміні, **shift_id - ідентифікатор зміни** За замовчуванням повертає відсортований по date_created список об'єктів з лімітом 100 Додаткові параметри: пагінація **page=n&amp;limit=n** (значення n не може бути менше 1) **Опис відповіді об'єкту items** <table> <thead> <tr> <th>Ключ</th> <th>Зміст</th> </tr> </thead> <tbody> <tr> <td>id</td> <td>Ідентифікатор чеку</td> </tr> <tr> <td>shift_id</td> <td>Ідентифікатор зміни</td> </tr> <tr> <td>local_number</td> <td>Локальний номер чеку відносно зміни</td> </tr> <tr> <td>fiscal_number</td> <td>Фіскальний номер чеку</td> </tr> <tr> <td>type</td> <td>Тип чеку: <strong>chk</strong> - чек <strong>z_report</strong> - З-звіт <strong>service</strong> - сервісний чек</td> </tr> <tr> <td>status</td> <td>Підтвердження фіскалізації чеку: <br>0 - Unknown, не визначений; <br>1 - OK, чек фіскалізовано, надано номер; <br>-1 - ERROR_VEREFY, помилка перевірки підпису; <br>-2 - ERROR_CHECK, помилка перевірки РРО; <br>-3 - ERROR_SAVE, помилка запису; <br>-4 - ERROR_UNKNOWN, загальна помилка; <br>-5 - ERROR_TYPE, помилка типу посилки; <br>-6 - ERROR_NOT_PREV_ZREPORT, нема Z-звіту за попередній день; <br>-7 - ERROR_XML, невірний формат XML ( структура , фіскальний номер); <br>-8 - ERROR_XML_DATE, невірний формат XML дата не відповідає Check.date; <br>-9 - ERROR_XML_CHK, невірний формат XML чеку; <br>-10 - ERROR_XML_ZREPORT, невірний формат Z-звіту; <br>-11 - ERROR_OFFLINE_168, РРО заблокований, перевищено ліміт 168 годин офлайну; <br>-12 - ERROR_BAD_HASH_PREV, невірний хеш попереднього чеку; <br>-13 - ERROR_NOT_REGISTERED_RRO, не зареєстровано ПРРО; <br>-14 - ERROR_NOT_REGISTERED_SIGNER, не зареєстрований підписант; <br>-15 - ERROR_NOT_OPEN_SHIFT, не відкрита зміна; <br>-16 - ERROR_OFFLINE_ID, невірний оффлайн ID</td> </tr> <tr> <td>source</td> <td>Ідентифікація джерела видачі чеку: <br>1 - device_manager, <br>2 - кабінет без офлайну або аварійне закриття, <br>3 - веб API, <br>4 - автозгенерований кабінетом, <br>5 - мобільний додаток, <br>6 - вебкабінет з офлайном</td> </tr> <tr> <td>date_created</td> <td>Дата створення</td> </tr> <tr> <td>data_id</td> <td>Загальний номер чеку відносно каси</td> </tr> <tr> <td>check_hash</td> <td>Хеш чеку, генерація SHA256 від xml чеку</td> </tr> <tr> <td>flow</td> <td>Який чек створено: <br>0 - Чек продажу <br>1 - Чек повернення <br>2 - Службовий чек внесення коштів <br>4 - Переказ коштів <br>7 - Чек видачі коштів при переказі <br>8 - Відкриття зміни <br>9 - Чек переходу в офлайн <br>10 - Чек виходу з офлайн <br>12 - Запит фіскальних номерів <br>14 - Видача готівки</td> </tr> <tr> <td>safe_cash</td> <td>Залишок готівки у касі</td> </tr> <tr> <td>tag</td> <td>Мітка завдання для ідентифікації</td> </tr> <tr> <td>is_offline</td> <td>Чи видано чек в офлайні</td> </tr> </tbody> </table> ## отримати_чеки_по_зміні {.tabset} #### Приклад запиту ```json curl --location --request GET 'https://kasa.vchasno.ua/api/v3/shift/checks?shift_id=<shift_id>' \ --header 'Content-Type: application/json' \ --header 'Authorization: VCHASNO_KASA_PRRO_TOKEN' ``` #### Приклад успішної json відповіді ```json { "page_num": 1, "page_size": 100, "has_prev": false, "has_next": false, "items": [ { "id": "0f878d94-cbb2-79a3-be3b-3afebe38aa12", "shift_id": "0f878d90-1d33-94b3-52e1-4a1b522eb12b", "local_number": 6, "fiscal_number": "TEST_BwA32_ONSQuY-g", "type": "z_report", "status": 1, "source": 6, "date_created": "2024-02-09T15:57:14.052979+02:00", "data_id": 19, "check_hash": "40a965329822e629305acc6d45092f785e581fe080b44a03a2e56c0aa921612f", "flow": null, "safe_cash": 127700, "tag": "78a513d91ed485c4d40c1494ce305a91", "is_offline": false }, { "id": "0f878d93-8ac6-bae7-f2b8-5a6b45a339ca", "shift_id": "0f878d90-1d33-94b3-52e1-4a1b522eb12b", "local_number": 2, "fiscal_number": "TEST_p72E1ZvyYG7nWg", "type": "chk", "status": 1, "source": 6, "date_created": "2024-02-09T15:57:05.837365+02:00", "data_id": 18, "check_hash": "171c1fde6dd0e1c18fdeac1bc7853cf728bfb00fc06b15bad1d02d2902d912db", "flow": 2, "safe_cash": null, "tag": "8x2pdUWGzZAWrj6ECCiMm", "is_offline": false }, { "id": "0f878d92-a070-d84a-4e38-70fc8e56bbbd", "shift_id": "0f878d90-1d33-94b3-52e1-4a1b522eb12b", "local_number": 1, "fiscal_number": "TEST_6dBu2HbHwwXlkg", "type": "chk", "status": 1, "source": 6, "date_created": "2024-02-09T15:56:59.838403+02:00", "data_id": 17, "check_hash": "2e71d9890a2f42732d276e42ff6f0f655245d08da88ba7f91177722f3b8dad0b", "flow": 2, "safe_cash": null, "tag": "OOFDZ1RQW2P9wPYE3WuTa", "is_offline": false }, { "id": "0f878d91-94c8-71d1-2718-1fc6c2891dd0", "shift_id": "0f878d90-1d33-94b3-52e1-4a1b522eb12b", "local_number": 2, "fiscal_number": "TEST_3cN5dDgeeOOo4A", "type": "chk", "status": 1, "source": 6, "date_created": "2024-02-09T15:56:52.986339+02:00", "data_id": 16, "check_hash": "da41659c4044d14d89b7634a553c6c16981de58ab31189d5b76fd23fe6fa778c", "flow": 0, "safe_cash": null, "tag": "y5aLwUMX5OTenyBV0jM0w", "is_offline": false }, { "id": "0f878d90-d072-605a-975f-5ef986d6e9b5", "shift_id": "0f878d90-1d33-94b3-52e1-4a1b522eb12b", "local_number": 1, "fiscal_number": "TEST_EixB0aXSylhhJw", "type": "chk", "status": 1, "source": 6, "date_created": "2024-02-09T15:56:47.960189+02:00", "data_id": 15, "check_hash": "f13025fe880c2c9c111540df49d8a8c074d13104d2630a593aaf9d437084fc18", "flow": 0, "safe_cash": null, "tag": "wX764EHfcV83mAcbuIVEr", "is_offline": false }, { "id": "0f878d90-1d41-cef0-4f84-667b4f889154", "shift_id": "0f878d90-1d33-94b3-52e1-4a1b522eb12b", "local_number": 0, "fiscal_number": "TEST_nUgNU8xboXD9Jw", "type": "service", "status": 1, "source": 6, "date_created": "2024-02-09T15:56:43.371487+02:00", "data_id": 14, "check_hash": "67e9dd0df87c1353043fed0b679817ba0579493f4aa559d399c5b538a45ec0e1", "flow": 8, "safe_cash": 10000, "tag": "3627c284440d2b67a22ea580a75537bb", "is_offline": false } ] } ``` </details> ## Надіслати посилання чеку на email/sms/viber {#sr--send-check-notification} <details> <summary>Деталі</summary> `POST https://kasa.vchasno.ua/api/v3/notifications/checks` Запит для надсилання посилання на чек користувачу через email, sms чи viber. **Структура запиту** <table> <thead> <tr> <th>Ключ</th> <th>Тип json даних</th> <th>Зміст</th> <th>Обов'язковий</th> </tr> </thead> <tbody> <tr> <td>recipient</td> <td>string</td> <td>email або номер телефону отримувача</td> <td>✅</td> </tr> <tr> <td>channel</td> <td>string</td> <td>Канал відправки: <br>- email <br>- sms <br>- viber <br>- cascade (спробує надіслати через viber, якщо користувач не зареєстрований у viber - відправить sms)</td> <td>✅</td> </tr> <tr> <td>check</td> <td>string</td> <td>Фіскальний номер чеку</td> <td>✅</td> </tr> </tbody> </table> **Опис відповіді** <table> <thead> <tr> <th>Ключ</th> <th>Тип json даних</th> <th>Зміст</th> <th>Обов'язковий</th> </tr> </thead> <tbody> <tr> <td>recipient</td> <td>string</td> <td>email або номер телефону отримувача</td> <td>✅</td> </tr> <tr> <td>channel</td> <td>string</td> <td>Канал відправки: <br>- email <br>- sms <br>- viber <br>- cascade (спробує надіслати через viber, якщо користувач не зареєстрований у viber - відправить sms)</td> <td>✅</td> </tr> <tr> <td>check_id</td> <td>string</td> <td>ID надісланого чеку</td> <td>✅</td> </tr> </tbody> </table> ## Приклади відправлених повідомлень {#sr--notification-examples} **Текст sms:** ``` Chek vid {COMPANY_NAME} za {CHECK_DATE} https://kasa.vchasno.ua/c/{CHECK_FN} ``` **Текст viber:** ``` Ви отримали фіскальний чек від {COMPANY_NAME} https://kasa.vchasno.ua/c/{CHECK_FN} ``` ## надіслати_посилання_чеку_на_email_sms_viber {.tabset} #### Приклад запиту ```json curl --location --request POST 'https://kasa.vchasno.ua/api/v3/notifications/checks' \ --header 'Content-Type: application/json' \ --header 'Authorization: VCHASNO_KASA_PRRO_TOKEN' \ --data-raw '{ "recipient": "RECIPIENT_EMAIL", "channel": "email", "check": "CHECK_FISCAL_NUMBER" }' ``` #### Приклад успішної json відповіді ```json { "recipient": "RECIPIENT_EMAIL", "channel": "email", "check_id": "0f85b1ee-75fa-ea9f-b3dd-b4c0e88a5d64" } ``` </details> ## Створення звіту {#sr--create-report} <details> <summary>Деталі</summary> `POST https://kasa.vchasno.ua/api/v3/reports/acquire?report_type=<type>` `report_type` приймає такі значення: - `z_reports` - З-звіти. Фіскальні звітні чеки у вигляді таблиці (максимум 366 днів) - `z_reports_views` - З-звіти (періодичні звіти). Фіскальні звітні чеки (максимум 366 днів) - `z_reports_archive` - Архів z-звітів. Архів зі з-звітами (html) на кожну касу + "zreports.csv", що містить ФН каси, ФН звіту, дату звіту - `checks` - Звіт по продажах. Всі продажі та повернення товарів (максимум 31 день, до 50 тис. чеків) - `checks_split_products` - Звіт по чеках. Чеки продажу та повернення (максимум 31 день, до 10 тис. чеків) - `checks_daily` - Звіт про щоденні чеки. Чеки продажу та повернення згруповані по дням (максимум 31 день) - `checks_control_tape` - Контрольна стрічка. Основна інформація по чеках (максимум 31 день, до 300 тис. чеків) - `checks_archive` - Контрольна стрічка + архів чеків. Копії розрахункових документів (максимум 31 день, до 1 тис. чеків) - `z_reports_funds_circulation` - Оборот компанії. Сума всіх продажів компанії (максимум 366 днів) - `rros_offline_time` - Лічильник offline. Кількість годин в режимі офлайн (максимум 366 днів) Повертає `id` сформованого звіту ## створення_звіту {.tabset} #### Приклад запиту ```json curl --location --request POST 'https://kasa.vchasno.ua/api/v3/reports/acquire?report_type=<type>' \ --header 'Content-Type: application/json' \ --header 'Authorization: VCHASNO_KASA_PRRO_TOKEN' \ --data-raw '{ "date_from": "2024-04-19T09:00:00", "date_to": "2024-04-19T13:59:59" }' ``` #### Приклад успішної json відповіді ```json { "id": "0f959fa6-d771-5421-91df-389c210faa9e", "pollingInterval": { "milliseconds": 2000 } } ``` </details> ## Вивантаження сформованого звіту {#sr--download-report} <details> <summary>Деталі</summary> `GET https://kasa.vchasno.ua/api/v3/reports/download?id=<report_id>` **id** - ідентифікатор сформованого звіту **Опис відповіді** <table> <thead> <tr> <th>Ключ</th> <th>Зміст</th> </tr> </thead> <tbody> <tr> <td>id</td> <td>Ідентифікатор</td> </tr> <tr> <td>status</td> <td>Статус</td> </tr> <tr> <td>type</td> <td>Тип звіту</td> </tr> <tr> <td>filename</td> <td>Назва файлу</td> </tr> <tr> <td>content</td> <td>Дані у форматі base64</td> </tr> </tbody> </table> ## вивантаження_сформованого_звіту {.tabset} #### Приклад запиту ```json curl --location --request GET 'https://kasa.vchasno.ua/api/v3/reports/download?id=<report_id>' \ --header 'Content-Type: application/json' \ --header 'Authorization: VCHASNO_KASA_PRRO_TOKEN' ``` #### Приклад успішної json відповіді ```json { "id": "0f959fa6-d771-5421-91df-389c210faa9e", "status": "done", "type": "checks", "filename": "Vchasno_Kasa_checks_19_04_2024_19_04_2024.xlsx", "content": "cGxhY2Vob2xkZXI=" } ``` </details> # Робота з помилками {#error-handling} У відповіді на запит фіскалізації наявні поля, що відображають статус операції. - Поле `res_action` у якому система рекомендує наступні дії дотримання транзакційної цілісності. В першу чергу, слід звертати увагу на значення цього поля і в разі отримання значення `3` - дивитися додаткові поля з кодами/текстом помилок. - Поле `res` - це код відповіді, що дорівнює 0 у разі успішного виконання запиту. У разі помилки поле містить код помилки. - Поле `errortxt` містить текст помилки та може містити технічну інформацію, призначене більше для логування та подальших досліджень причин. - Об'єкт `error_extra: object | null` - опційний об'єкт, в якому повертаються деталі щодо помилки. Наприклад перелік полів, та причини, чому вони не пройшли валідацію. Приклад помилки при запиті на фіскалізацію (наведено виключно поля, що відповідають за помилку): ```json { "res": 1001, "res_action": 3, "errortxt": "Сума всіх позицій товару відрізняється від загальної суми чеку", "error_extra": { "sum": 10050, "rows_sum": 10000 } } ``` ## Перелік значень поля `res_action` {#eh--res-action-values} - 0 - ОК, можна переходити до наступного запиту - 1 - Помилка, запит не пройшов Запит не виконано через “випадкові помилки” від податкової (ДПС). Рекомендується повторити запит, який не пройшов, але можна зробити й інший запит. - 2 - Помилка + колізія Запит було надіслано до ДПС, але відповіді не було отримано. За будь-якого наступного звернення система спочатку намагатиметься виправити колізію. Тому настійно рекомендується робити повторення вихідного запиту до тих пір, поки колізію не буде вирішено. - 3 - Помилка, що вимагає зупинки та ручного втручання Виникла помилка, яка може не виправитись шляхом повтору запиту. Необхідно дослідити `res, errortxt, error_extra`, котрі містять деталі помилки. **Повторні запити слід надсилати з параметром** **`tag`** **рівним початковому запиту/відповіді.** ## Перелік значень поля `res` {#eh--res-values} <table> <thead> <tr> <th><strong>Код</strong></th> <th><strong>Опис</strong></th> </tr> </thead> <tbody> <tr> <td>1001</td> <td>Помилка валідації вхідних даних</td> </tr> <tr> <td>1006</td> <td>Внутрішня помилка сервісу Вчасно.Каса</td> </tr> <tr> <td>1011</td> <td>Об'єкт не знайдено у базі</td> </tr> <tr> <td>1013</td> <td>Для вхідних даних не реалізовано функціонал (Not Implemented Error)</td> </tr> <tr> <td>1014</td> <td>Об'єкт вже існує у базі</td> </tr> <tr> <td>1015</td> <td>Каса зайнята попереднім запитом (Lock Error)</td> </tr> <tr> <td>1016</td> <td>Перевищено таймаут на обробку запиту</td> </tr> <tr> <td>1017</td> <td>Дію заборонено (Action not allowed error)</td> </tr> <tr> <td>1019</td> <td>Ключ ЕЦП не зареєстровано у ДПС</td> </tr> <tr> <td>1020</td> <td>Каса не активна (скасована) у ДПС</td> </tr> <tr> <td>1029</td> <td>Помилка пов'язана з підписами чи ключами ЕЦП</td> </tr> <tr> <td>1062</td> <td>Ключ ЕЦП скасовано у АЦСК</td> </tr> <tr> <td>2000</td> <td>Базова помилка. Може бути пов'язана з різними причинами (дивитися значення поля “errortxt”)</td> </tr> <tr> <td>2001</td> <td>Помилка зв'язку з ДПС</td> </tr> <tr> <td>2002</td> <td>Запит у ДПС перевищив допустимий таймаут</td> </tr> <tr> <td>2003</td> <td>Отримано код відповіді від ДПС, який вважається "випадковою помилкою"</td> </tr> <tr> <td>2004</td> <td>Отримано код критичної помилки під час роботи з ДПС, запит не може бути виконаний (точніший опис причини дивитись у полі “errortxt”)</td> </tr> <tr> <td>2005</td> <td>Каса (ПРРО) у стані колізії</td> </tr> <tr> <td>2006</td> <td>Помилка під час перевірки хешу чеку</td> </tr> <tr> <td>2007</td> <td>Необхідно відкрити зміну</td> </tr> <tr> <td>2008</td> <td>Необхідно закрити зміну</td> </tr> <tr> <td>2009</td> <td>ПРРО заблоковано</td> </tr> <tr> <td>2011</td> <td>Помилка при спробі змінити режим роботи каси</td> </tr> <tr> <td>2012</td> <td>Не можна виконати дію, оскільки останній чек було проведено з Девайс Менеджеру. Для проведення чеків з іншого джерела потрібно закрити зміну у Девайс Менеджері.</td> </tr> </tbody> </table> ## HTTP статус коди {#eh--http-status-codes} АПІ запити на фіскалізацію (`POST /api/v3/fiscal/execute`) повертають 200 OK HTTP статус також при клієнтських помилках (деталі по помилці у тілі відповіді). Виключення: - `401` - Помилка при авторизації, потрібно перевірити авторизаційний токен каси - `5**` - Непередбачена помилка на стороні сервісу, потрібно повторити запит пізніше. # Changelog {#changelog} <table> <thead> <tr> <th>Дата</th> <th>Зміни</th> </tr> </thead> <tbody> <tr> <td>2026-02-17</td> <td>Додано параметр <code>shift_id</code> у відповіді на task: 0,10,11,18</td> </tr> <tr> <td>2025-08-18</td> <td>Додано можливість задавати список загальних знижок (fiscal.receipt.discounts). <br>Запит "Статус пРРО" перенесено до службових запитів.</td> </tr> <tr> <td>2025-05-28</td> <td>data.global_discounts у відповіді на json чеку</td> </tr> <tr> <td>2025-05-06</td> <td>info.lastcheck об'єкт у відповіді при запиті на x/z-звіт</td> </tr> <tr> <td>2025-04-28</td> <td>Додано можливість вивантажити архів z-звітів</td> </tr> <tr> <td>2025-03-03</td> <td>Додано нові засоби оплат</td> </tr> <tr> <td>2024-12-10</td> <td>Додано нові параметри <strong>purchase_dt</strong> в об'єкт fiscal.receipt.pays та <br><strong>purchase_receipt_dt</strong> в об'єкт fiscal.receipt.rows по програмі "Національний кешбек"</td> </tr> <tr> <td>2024-11-14</td> <td>Додано параметр bank_name в об'єкт fiscal.receipt.pays <br>Додано mac параметр у відповідь фіскалізації чеків</td> </tr> <tr> <td>2024-09-23</td> <td>Додано підтримку загальної знижки на чек. Параметри disc та disc_type в об'єкт fiscal.receipt</td> </tr> <tr> <td>2024-09-03</td> <td>Додано нові параметри purchase_receipt_fisn та purchase_rro_fisn в об'єкт fiscal.receipt для чеків повернення по програмі "Національний кешбек"</td> </tr> <tr> <td>2024-04-19</td> <td>Додано чеки передплати, післясплати. <br>Додано запити створення / вивантаження звітів</td> </tr> <tr> <td>2024-02-23</td> <td>Додано службові запити: Отримати зміни по касі, Отримати чеки по зміні</td> </tr> <tr> <td>2024-02-15</td> <td>Розширено формати поля userinfo: phone <br>Запит на отримання JSON чеку повертає <br>shop_type</td> </tr> <tr> <td>2024-01-31</td> <td>Оновлено документацію. Додано опис error_extra. Прибрано fiscal.receipt.pays.currency (параметр не оброблювався)</td> </tr> <tr> <td>2023-09-18</td> <td>Розширення виводу ЕПЗ даних</td> </tr> <tr> <td>2023-07-18</td> <td>Додано перегляд фіскалізованого JSON чеку</td> </tr> <tr> <td>2023-03-16</td> <td>Додано підтримку чеку видачі готівки (task 14)</td> </tr> <tr> <td>2022-09-07</td> <td>Внесено інформацію про автоматичне відкриття зміни разом із проведенням першого чеку (<em>Запити на фіскалізацію -&gt; Відкриття зміни</em>)</td> </tr> <tr> <td>2022-08-04</td> <td>Initial version</td> </tr> </tbody> </table>