API і вебхуки
jah.dk працює на платформі jajob.dk, тож API й вебхуки ті самі. Повний опис API дивіться в документації для розробників jajob.dk.
Основи
- Базова URL:
https://jajob.dk/api/v1 - Автентифікація:
Authorization: Bearer <token>. Токен видаєPOST /api/v1/auth/login. - Помилки:
{"error": {"code", "message", "details"}}.
Партнерські API-ключі (jjk_…) створює власник компанії через POST /api/v1/apikeys; ключ показується один раз. Доступ до зовнішнього партнерського API відкриваємо за запитом: пишіть на info@jajob.dk.
Вебхуки
Зареєструйте HTTPS-ендпоінт через POST /api/v1/webhooks/endpoints і отримуйте підписані події:
| Подія | Коли |
|---|---|
application.created |
Надійшла нова заявка |
application.status_changed |
Кандидат перейшов в іншу стадію |
vacancy.expired |
Вакансія досягла дедлайну |
candidate.matched |
Для вакансії знайдено відповідного кандидата |
Кожна доставка має заголовки X-Jajob-Event, X-Jajob-Delivery і X-Jajob-Signature. Невдалі доставки повторюються; приватні й loopback-хости заблоковано.
Перевірка підпису
Підпис: HMAC-SHA256 канонічного JSON-тіла (ключі відсортовано, без пробілів) із секретом вашого ендпоінта.
import hashlib, hmac, json
def verify(secret: str, body: bytes, signature: str) -> bool:
canonical = json.dumps(json.loads(body), sort_keys=True, separators=(",", ":")).encode()
expected = hmac.new(secret.encode(), canonical, hashlib.sha256).hexdigest()
return hmac.compare_digest(expected, signature)
import crypto from "node:crypto";
function canonical(v) {
if (Array.isArray(v)) return "[" + v.map(canonical).join(",") + "]";
if (v && typeof v === "object")
return "{" + Object.keys(v).sort().map(k => JSON.stringify(k) + ":" + canonical(v[k])).join(",") + "}";
return JSON.stringify(v);
}
export function verify(secret, rawBody, signature) {
const expected = crypto.createHmac("sha256", secret).update(canonical(JSON.parse(rawBody))).digest("hex");
return crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(signature));
}
Відповідайте статусом 2xx швидко, а роботу виконуйте після.
Щось незрозуміло чи бракує? Напишіть на info@jajob.dk.