REST · JSON · v1

BKG.dk API

Переглядайте й змінюйте записи, клієнтів і каталог салону з власних систем. API-ключі створює салон у розділі Інтеграції; застосунки підключаються через екран згоди.

Посібники

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

  1. В адмінці: Інтеграції → API і вебхуки → створіть ключ із потрібним доступом.
  2. Надсилайте його з кожним запитом у заголовку X-API-Key.
  3. Кожна відповідь — {"success", "data", "error", "code", "meta"}; списки гортаються через meta.next_cursor.

Вебхуки

Підписані POST-запити, коли змінюються записи, клієнти, платежі, відгуки чи подарункові картки. Перевіряйте X-BKG-Signature-V2 (HMAC-SHA256 від "timestamp.body").

Застосунки

Партнерські застосунки використовують OAuth 2 із PKCE: /oauth/authorize → /api/v1/oauth/token. Токени короткострокові, і салон може їх відкликати.

v1

Версіонування: v1 лише розширюється — поля й ендпоінти додаються, але ніколи не видаляються й не змінюються. Усе, що ламає сумісність, отримує нову версію й щонайменше 12 місяців попередження.

X-BKG-Signature-V2

import hashlib, hmac
from datetime import datetime, timezone

def verify(raw_body: bytes, headers, secret: str, max_age_s: int = 300) -> bool:
    ts = headers["X-BKG-Timestamp"]
    if abs((datetime.now(timezone.utc) - datetime.fromisoformat(ts)).total_seconds()) > max_age_s:
        return False
    expected = hmac.new(secret.encode(), f"{ts}.".encode() + raw_body, hashlib.sha256).hexdigest()
    sent = [headers.get("X-BKG-Signature-V2"), headers.get("X-BKG-Signature-V2-Previous")]
    return any(s and hmac.compare_digest(expected, s) for s in sent)
const crypto = require("crypto");

function verify(rawBody, headers, secret, maxAgeS = 300) {
  const ts = headers["x-bkg-timestamp"];
  if (Math.abs(Date.now() - Date.parse(ts)) / 1000 > maxAgeS) return false;
  const expected = crypto.createHmac("sha256", secret).update(`${ts}.${rawBody}`).digest("hex");
  return [headers["x-bkg-signature-v2"], headers["x-bkg-signature-v2-previous"]]
    .filter(Boolean)
    .some((s) => s.length === expected.length &&
      crypto.timingSafeEqual(Buffer.from(s), Buffer.from(expected)));
}
function bkg_verify(string $rawBody, array $headers, string $secret, int $maxAge = 300): bool {
    $ts = $headers['X-BKG-Timestamp'] ?? '';
    if (abs(time() - strtotime($ts)) > $maxAge) return false;
    $expected = hash_hmac('sha256', $ts . '.' . $rawBody, $secret);
    foreach (['X-BKG-Signature-V2', 'X-BKG-Signature-V2-Previous'] as $h) {
        if (!empty($headers[$h]) && hash_equals($expected, $headers[$h])) return true;
    }
    return false;
}

Завантаження довідника…

Не вдалося завантажити довідник.