Документація API

Виставляйте рахунки з платіжними QR-кодами НБУ, керуйте бізнес-субʼєктами й банківськими рахунками та читайте аналітику платежів — той самий JSON:API, на якому працює app.pmnt.app.

Початок роботи

  1. Створіть обліковий запис і пройдіть онбординг на app.pmnt.app — додайте свій бізнес-субʼєкт та його банківський рахунок IBAN.

  2. Згенеруйте API-ключ у розділі Налаштування → API-ключі. Повний ключ показується лише один раз, одразу після створення — збережіть його в надійному місці.

  3. Зробіть свій перший запит:

    curl https://app.pmnt.app/api/me \
    -H "Authorization: Bearer apa_YOUR_API_KEY" \
    -H "Accept: application/vnd.api+json"

Автентифікація

Кожен запит до захищеного ендпоїнта передає ваш API-ключ у заголовку Authorization. Ключі — це непрозорі рядки з префіксом apa_, а не JWT.

Authorization: Bearer apa_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  • Ключ привʼязаний до вашого облікового запису й має всі його права — окремих обмежень (scopes) для ключів поки немає.
  • Зберігається лише хеш ключа. Якщо ви втратили ключ, створіть новий і відкличте старий — відкликання діє миттєво.
  • Запити без дійсного ключа отримують 403 Forbidden на захищених ендпоїнтах.

Типи доступу до API

Усі ендпоїнти типово потребують API-ключ — передавайте його в кожному запиті як Authorization: Bearer apa_…. Лише кілька публічних ендпоїнтів доступні без ключа:

  • GET /invoice/{short_code} — публічний пошук рахунку; сам короткий код виконує роль токена доступу.
  • POST /delivery-info — дані доставки, які надсилає сторінка платника.
  • GET /delivery-providers, GET /delivery-providers/{id} — довідник служб доставки.
  • GET /categories, GET /categories/{id}, GET /purposes, GET /purposes/{id} — довідники платежів.

Конвенції JSON:API

API відповідає специфікації JSON:API 1.0. Надсилайте та очікуйте тип вмісту application/vnd.api+json. Ендпоїнти списків підтримують стандартні параметри запиту:

Параметр Опис Приклад
filter[attr] Фільтрувати список за значенням атрибута. ?filter[state]=paid
sort Поля сортування через кому; префікс - означає спадний порядок. ?sort=-qr_generated_at
page[limit] Keyset-пагінація: розмір сторінки та курсори page[after] / page[before] з попередньої відповіді. ?page[limit]=25
page[count] Додати загальну кількість записів до обʼєкта meta. ?page[count]=true
include Довантажити повʼязані ресурси в тій самій відповіді. ?include=business_entity,bank_account
fields[type] Часткові набори полів: повернути лише перелічені атрибути. ?fields[invoice]=short_code,state

Помилки

Помилки повертаються в конверті помилок JSON:API з HTTP-статусом, що відповідає зовнішній помилці:

{
"errors": [
{
"status": "403",
"title": "Forbidden",
"detail": "forbidden"
}
]
}

Ендпоїнти

Усі шляхи вказані відносно базової URL-адреси. Кожен ендпоїнт потребує API-ключ, якщо його не наведено в розділі Типи доступу до API. Згенерована специфікація OpenAPI залишається канонічним і завжди актуальним довідником.

Базова URL-адреса: https://app.pmnt.app/api · Інтерактивний Swagger UI · Специфікація OpenAPI (JSON)

Профіль

Визначення облікового запису за API-ключем.

GET /me
Профіль користувача, якому належить наданий API-ключ.

Рахунки

Виставляйте платіжні рахунки й керуйте ними. Кожен рахунок отримує публічну сторінку платника та платіжний QR-код НБУ.

GET /invoices
Список ваших рахунків (з фільтрами та пагінацією).
POST /invoices
Створити рахунок. Генерація QR-коду ставиться в чергу автоматично.
GET /invoices/{id}
Отримати окремий рахунок.
PATCH /invoices/{id}
Оновити примітку покупця або позначку «обране».
DELETE /invoices/{id}
Видалити рахунок.
POST /invoices/{id}/disable
Деактивувати активний рахунок.
POST /invoices/{id}/enable
Повторно увімкнути вимкнений рахунок.
POST /invoices/{id}/confirm-payment
Позначити рахунок як оплачений.
GET /invoice/{short_code}
Публічний пошук рахунку за коротким кодом. Сам короткий код є токеном доступу; поля лише для власника залишаються прихованими.

Наприклад, створіть рахунок і отримайте його сторінку платника та QR-код:

curl -X POST https://app.pmnt.app/api/invoices \
-H "Authorization: Bearer apa_YOUR_API_KEY" \
-H "Content-Type: application/vnd.api+json" \
-H "Accept: application/vnd.api+json" \
-d '{
"data": {
"type": "invoice",
"attributes": {
"business_entity_id": "YOUR_BUSINESS_ENTITY_ID",
"bank_account_id": "YOUR_BANK_ACCOUNT_ID",
"purpose": "Оплата за послуги",
"amount": 1980
}
}
}'

Відповідь надходить зі станом created; qr_url заповнюється асинхронно за мить. Сторінка платника доступна за адресою https://app.pmnt.app/pay/{short_code}.

{
"data": {
"type": "invoice",
"id": "6b9f2c1e-4a5d-4e8f-9c3b-2d7a8e1f0b4c",
"attributes": {
"short_code": "…",
"state": "created",
"qr_url": null
}
}
}

Бізнес-субʼєкти

Компанії, ФОП та фізичні особи, від імені яких ви виставляєте рахунки. Податкові номери (ЄДРПОУ/РНОКПП) перевіряються автоматично.

GET /business-entities
Список ваших бізнес-субʼєктів.
POST /business-entities
Створити бізнес-субʼєкт (назва, податковий номер, тип).
GET /business-entities/{id}
Отримати окремий бізнес-субʼєкт.
PATCH /business-entities/{id}
Оновити назву або тип.
DELETE /business-entities/{id}
Видалити субʼєкт, який не має рахунків.
POST /business-entities/{id}/set-default
Зробити цей субʼєкт за замовчанням.

Банківські рахунки

IBAN-рахунки, привʼязані до ваших бізнес-субʼєктів. Реквізити банку визначаються з IBAN автоматично.

GET /bank-accounts
Список ваших банківських рахунків.
POST /bank-accounts
Додати IBAN до бізнес-субʼєкта.
GET /bank-accounts/{id}
Отримати окремий банківський рахунок.
PATCH /bank-accounts/{id}
Оновити позначку основного рахунку.
DELETE /bank-accounts/{id}
Видалити банківський рахунок.
POST /bank-accounts/{id}/set-primary
Зробити цей рахунок основним.

Доставка

Необовʼязковий збір даних доставки для рахунків, що потребують відправлення.

POST /delivery-info
Надіслати дані доставки для рахунку (використовується сторінкою платника).
GET /delivery-providers
Список підтримуваних служб доставки.
GET /delivery-providers/{id}
Отримати службу доставки.

Довідники

Довідкові дані для категоризації рахунків: категорії та призначення платежів НБУ.

GET /categories
Список категорій платежів.
GET /categories/{id}
Отримати категорію платежу.
GET /purposes
Список призначень платежів.
GET /purposes/{id}
Отримати призначення платежу.

Аналітика

Відстеження відвідувань сторінок платника: хто, коли та звідки їх відкривав.

GET /invoices/{id}/visits
Список відвідувань сторінки рахунку (до 100 за запит).
GET /invoices/{id}/visits/stats
Агрегована статистика відвідувань з необовʼязковим діапазоном from/to.

Життєвий цикл рахунку

Рахунок проходить через такі стани; переходи відбуваються через сторінку платника та наведені вище ендпоїнти:

stateDiagram-v2
    direction LR
    [*] --> created: POST /invoices
    created --> pending_delivery: потрібна доставка
    created --> awaiting_payment: платник відкриває сторінку
    pending_delivery --> awaiting_payment: дані доставки надіслано
    created --> paid: підтвердження оплати
    awaiting_payment --> paid: підтвердження оплати
    created --> expired: минув термін valid_until
    pending_delivery --> expired
    awaiting_payment --> expired
    created --> disabled: деактивація
    pending_delivery --> disabled
    awaiting_payment --> disabled
    disabled --> created: повторне увімкнення
  • created — Рахунок виставлено, але сторінку платника ще ніхто не відкривав.
  • pending_delivery — Платник відкрив рахунок, що потребує доставки, але ще не надіслав дані доставки.
  • awaiting_payment — Платник відкрив сторінку оплати.
  • paid — Власник підтвердив оплату через confirm-payment.
  • expired — Термін valid_until минув; прострочення застосовується автоматично щохвилини.
  • disabled — Вимкнений вручну через disable; enable повертає його в created.

Повні схеми атрибутів і решта перелічень (field_lock_preset, transfer_type, …) містяться у специфікації OpenAPI.

Підтримка

Маєте запитання щодо API? Напишіть на admin@pmnt.app або перегляньте Довідковий центр.