ibanlink.com.ua

API ibanlink

Посилання на оплату на ваш IBAN прямо з CRM, сайту чи бота. Один запит, і клієнт отримує сторінку, з якої платить у своєму банку.

Швидкий старт

  1. Тариф «Старт» чи «Бізнес», сторінка з реквізитами.
  2. Кабінет → «API і вебхуки» → «Створити ключ».
  3. Запит:
curl -X POST https://ibanlink.com.ua/api/v1/links \
  -H "Authorization: Bearer il_live_..." \
  -H "Content-Type: application/json" \
  -d '{"amount": 1250, "purpose": "Оплата замовлення 125", "external_id": "125", "expires_in_days": 7}'

Відповідь 201:

{
  "id": 481, "url": "https://ibanlink.com.ua/p/Xk3pQ9aB2c", "status": "active",
  "amount": "1250.00", "currency": "UAH", "purpose": "Оплата замовлення 125", "external_id": "125",
  "created_at": "2026-10-11T12:00:00+00:00", "expires_at": "2026-10-18T12:00:00+00:00",
  "opened_at": null, "bank_clicked_at": null, "paid_at": null, "paid_amount": null,
  "nbu_url": "https://qr.bank.gov.ua/QkNE...", "qr_svg_url": "https://ibanlink.com.ua/p/Xk3pQ9aB2c/qr.svg"
}

Надішліть клієнту url. На телефоні він обере банк і підтвердить переказ, на компʼютері відсканує QR. Гроші йдуть напряму на ваш рахунок; ibanlink платіж не бачить і коштів не торкається.

Ключ і ліміти

  • Заголовок Authorization: Bearer <ключ>. Ключ показуємо один раз; відкликати можна в кабінеті.
  • До 120 запитів за хвилину на ключ, далі 429.
  • Нові посилання рахуються в місячний ліміт тарифу (разом зі створеними в кабінеті).
  • Усі часи у форматі ISO 8601 (UTC), суми рядком із двома знаками після коми.
POST/api/v1/links
ПолеОпис
amountСума в гривнях, від 1 до 1 000 000. Обовʼязково.
purposeПризначення платежу, 3–140 знаків. Обовʼязково.
external_idВаш номер замовлення. Повторний запит із тим самим номером і даними поверне те саме посилання (200), з іншими даними отримаєте 409.
expires_in_daysСтрок дії, 1–365 днів. Без нього посилання безстрокове. Після строку клієнт побачить «Посилання більше не діє».
return_urlАдреса вашого сайту (http або https), куди повернути платника. На сторінці оплати буде кнопка «Повернутися на ваш-сайт».
page_idСторінка з реквізитами. Якщо така сторінка одна, можна не вказувати.
titleНазва для вас і заголовок на сторінці оплати.
GET/api/v1/links?status=active&limit=20&before_id=…&external_id=…

Список, новіші спершу. status: all, active, paid, disabled, expired. Для наступної сторінки передайте before_id з поля next_before_id. paid_from (ISO 8601, наприклад 2026-10-12T09:00:00Z): лише оплачені з цього часу, зручно для регулярної перевірки оплат. У кожному посиланні є stats: перегляди, відвідувачі, переходи в банк, покази QR.

GET/api/v1/links/{id}

Посилання зі статистикою, opened_at (клієнт уперше відкрив) bank_clicked_at (уперше натиснув кнопку банку) і paid_at (оплату знайдено у виписці вашого банку чи позначено в кабінеті; тоді status = paid).

POST/api/v1/links/{id}/disable
POST/api/v1/links/{id}/enable

Вимкнути й увімкнути. DELETE /api/v1/links/{id} діє так само, як disable: історія лишається.

qr_svg_url: QR для друку чи вашого сайту. nbu_url: пряме платіжне посилання НБУ без нашої сторінки.

Сторінки й профіль

GET/api/v1/pages

Ваші сторінки: id, адреса, чи працює (published: є реквізити й сторінку не знято), чи заповнені реквізити.

GET/api/v1/me

Тариф, до коли діє, ліміт і скільки посилань створено цього місяця.

Вебхуки «Бізнес»

Задайте https-адресу в кабінеті або через PUT /api/v1/webhook з {"url": "https://…", "events": ["link.opened", "link.bank_clicked", "link.paid"]}. Секрет підпису повертаємо один раз, при створенні. Новий секрет: POST /api/v1/webhook/rotate-secret, перевірка: POST /api/v1/webhook/test.

ПодіяКоли
link.openedКлієнт уперше відкрив посилання (прев'ю месенджерів не рахуються).
link.bank_clickedКлієнт уперше натиснув кнопку свого банку: перейшов оплачувати.
link.paidОплату знайдено у виписці підключеного банку (кабінет → «Банк») або позначено вручну. У data.payment: сума, час, confirmed (auto чи manual) та імʼя платника з виписки.
POST https://ваша-адреса
X-Ibanlink-Event: link.bank_clicked
X-Ibanlink-Signature: t=1791302400,v1=5f0c…

{"id": "evt_77", "event": "link.bank_clicked", "created_at": "…", "data": {"link": { …як у відповіді API… }}}

Відповідайте кодом 2xx за 10 секунд. Інакше повторимо через 1, 5, 30 хв, 2 й 6 год. Переадресації не виконуємо. Адреса має вести на публічний сервер.

Перевірка підпису: HMAC-SHA256 від рядка "<t>.<тіло запиту як є>" вашим секретом має дорівнювати v1; відкидайте запити, де t старше 5 хвилин.

# Python
import hmac, hashlib, time
def valid(secret, header, body: bytes):
    parts = dict(p.split("=", 1) for p in header.split(","))
    mac = hmac.new(secret.encode(), parts["t"].encode() + b"." + body, hashlib.sha256).hexdigest()
    return hmac.compare_digest(mac, parts["v1"]) and abs(time.time() - int(parts["t"])) < 300
// Node.js
const crypto = require('crypto');
function valid(secret, header, rawBody) {
  const p = Object.fromEntries(header.split(',').map(x => x.split('=')));
  const mac = crypto.createHmac('sha256', secret).update(p.t + '.' + rawBody).digest('hex');
  return crypto.timingSafeEqual(Buffer.from(mac), Buffer.from(p.v1)) && Math.abs(Date.now() / 1000 - p.t) < 300;
}
// PHP
function valid($secret, $header, $rawBody) {
  parse_str(str_replace(',', '&', $header), $p);
  $mac = hash_hmac('sha256', $p['t'] . '.' . $rawBody, $secret);
  return hash_equals($mac, $p['v1']) && abs(time() - (int)$p['t']) < 300;
}

Помилки

{"error": {"code": "invalid_amount", "message": "Сума має бути щонайменше 1 грн"}}
Код HTTPcodeЩо сталося
401unauthorized, invalid_keyНемає ключа, ключ хибний чи відкликаний.
403plan_required, limit_reached, account_inactiveТариф без API чи вебхуків, вичерпано ліміт посилань, акаунт недоступний.
404not_found, page_not_foundНемає такого посилання чи сторінки у вашому акаунті.
409page_not_ready, external_id_conflictСторінка без повних реквізитів або знята адміністратором; номер замовлення вже зайнятий іншим посиланням.
422validation, invalid_amount, invalid_purpose, page_requiredПеревірте поля; у fields указано, які саме.
429rate_limitedПонад 120 запитів за хвилину.

Питання щодо інтеграції пишіть на info@ibanlink.com.ua.

Зареєструватися безкоштовно Увійти