Dokumentacja zdarzeń webhook
Struktura danych, nagłówki i definicje pól dla każdego zdarzenia webhook.
To tłumaczenie może być nieaktualne. Wersja angielska została zaktualizowana od czasu ostatniego tłumaczenia tej strony. Zobacz po angielsku →
Dlaczego to ważne
Każdy webhook zawiera dane zdarzenia w tej samej kopercie. Poniżej znajdziesz strukturę danych potrzebną do parsowania i obsługi poszczególnych zdarzeń.
Koperta danych
{
"event": "application.submitted",
"created_at": "2025-01-15T14:30:00Z",
"data": { }
}
| Pole | Typ | Opis |
|---|---|---|
event |
string | Typ zdarzenia, które wywołało to dostarczenie |
created_at |
string | Znacznik czasu ISO 8601 określający moment wystąpienia zdarzenia |
data |
object | Dane specyficzne dla zdarzenia (różnią się w zależności od typu zdarzenia) |
Nagłówki żądania
Każde żądanie webhook zawiera następujące nagłówki:
| Nagłówek | Przykład | Opis |
|---|---|---|
Content-Type |
application/json |
Zawsze JSON |
X-Webhook-Event |
application.submitted |
Typ zdarzenia |
X-Webhook-Signature |
a1b2c3d4... |
Skrót HMAC-SHA256 w formacie szesnastkowym |
X-Webhook-Timestamp |
2025-01-15T14:30:00Z |
Znacznik czasu ISO 8601 użyty w podpisie |
User-Agent |
Kit-Webhooks/1.0 |
Identyfikuje Kit jako nadawcę |
Szczegóły weryfikacji podpisu znajdziesz w sekcji Bezpieczeństwo i dostarczanie webhooków.
Zdarzenia aplikacji
Zdarzenia: application.submitted, application.rejected, application.rejection_reverted, application.advanced, application.stage_returned, application.withdrawn, application.offer_extended
application.stage_returned jest wysyłane, gdy członek zespołu przenosi aplikację z powrotem na wcześniejszy etap. Korzysta z tych samych danych aplikacji co pozostałe zdarzenia w tej sekcji.
{
"event": "application.submitted",
"created_at": "2025-01-15T14:30:00Z",
"data": {
"id": 42,
"candidate": {
"id": 7,
"name": "Jane Smith",
"email": "[email protected]"
},
"job_posting": {
"id": 3,
"title": "Senior Engineer"
},
"current_stage": "Applied",
"submitted_at": "2025-01-15T14:30:00Z",
"rejected": false,
"withdrawn": false,
"offered": false
}
}
| Pole | Typ | Opis |
|---|---|---|
id |
integer | Identyfikator aplikacji |
candidate.id |
integer | Identyfikator kandydata |
candidate.name |
string | Imię i nazwisko kandydata |
candidate.email |
string | Adres e-mail kandydata |
job_posting.id |
integer | Identyfikator ogłoszenia o pracę |
job_posting.title |
string | Tytuł ogłoszenia o pracę |
current_stage |
string | Nazwa bieżącego etapu w procesie rekrutacji |
submitted_at |
string | null | Znacznik czasu ISO 8601 złożenia aplikacji |
rejected |
boolean | Czy aplikacja została odrzucona |
withdrawn |
boolean | Czy kandydat wycofał aplikację |
offered |
boolean | Czy przedstawiono ofertę |
Zdarzenia ofert
Zdarzenia: offer.accepted, offer.declined
-
offer.accepted/offer.declined: wywoływane, gdy administrator akceptuje lub odrzuca ofertę
{
"event": "offer.accepted",
"created_at": "2025-01-20T10:00:00Z",
"data": {
"id": 15,
"status": "accepted",
"details": "Senior Engineer — $150k base",
"extended_at": "2025-01-18T09:00:00Z",
"expires_at": "2025-01-25T23:59:59Z",
"accepted_at": null,
"declined_at": null,
"candidate": {
"id": 7,
"name": "Jane Smith",
"email": "[email protected]"
},
"job_posting": {
"id": 3,
"title": "Senior Engineer"
}
}
}
| Pole | Typ | Opis |
|---|---|---|
id |
integer | Identyfikator oferty |
status |
string | Jedna z wartości: pending, accepted, declined, candidate_accepted, candidate_declined, expired
|
details |
string | null | Tekst szczegółów oferty |
extended_at |
string | null | Kiedy oferta została przedstawiona |
expires_at |
string | null | Kiedy oferta wygasa |
accepted_at |
string | null | Kiedy oferta została zaakceptowana przez administratora |
declined_at |
string | null | Kiedy oferta została odrzucona przez administratora |
candidate |
object | Dane kandydata (taka sama struktura jak w zdarzeniach aplikacji) |
job_posting |
object | Dane ogłoszenia o pracę (taka sama struktura jak w zdarzeniach aplikacji) |
Zdarzenia rozmów kwalifikacyjnych
Zdarzenia: interview.scheduled, interview.confirmed, interview.completed, interview.cancelled, interview.no_show, interview.no_show_reverted, interview.rebooked
interview.no_show_reverted jest wysyłane po cofnięciu statusu nieobecności. interview.rebooked pojawia się po zamknięciu starej rozmowy i zaproszeniu kandydata do wyboru nowego terminu. Oba korzystają z danych rozmowy pokazanych niżej.
{
"event": "interview.scheduled",
"created_at": "2025-01-16T09:00:00Z",
"data": {
"id": 28,
"status": "pending",
"scheduled_at": "2025-01-20T14:00:00Z",
"duration_minutes": 60,
"candidate": {
"id": 7,
"name": "Jane Smith",
"email": "[email protected]"
},
"job_posting": {
"id": 3,
"title": "Senior Engineer"
}
}
}
| Pole | Typ | Opis |
|---|---|---|
id |
integer | Identyfikator rozmowy kwalifikacyjnej |
status |
string | Status rozmowy (pending, confirmed, completed, cancelled, no_show) |
scheduled_at |
string | null | Znacznik czasu ISO 8601 zaplanowanego terminu |
duration_minutes |
integer | Czas trwania rozmowy w minutach |
candidate |
object | Dane kandydata |
job_posting |
object | Dane ogłoszenia o pracę |
Zdarzenia zadań programistycznych
Zdarzenia: code_assignment.submitted, code_assignment.auto_submitted
{
"event": "code_assignment.submitted",
"created_at": "2025-01-22T16:45:00Z",
"data": {
"id": 11,
"repo_url": "https://github.com/org/assignment-jane-smith",
"submitted_at": "2025-01-22T16:45:00Z",
"submitted_by": null,
"deadline_at": "2025-01-25T23:59:59Z",
"candidate": {
"id": 7,
"name": "Jane Smith",
"email": "[email protected]"
},
"job_posting": {
"id": 3,
"title": "Senior Engineer"
}
}
}
| Pole | Typ | Opis |
|---|---|---|
id |
integer | Identyfikator przesłanego zadania programistycznego |
repo_url |
string | Adres URL repozytorium GitHub |
submitted_at |
string | null | Kiedy zadanie zostało przesłane |
submitted_by |
object | null | Członek zespołu (id, name), który oznaczył zadanie jako przesłane w imieniu kandydata; null, gdy przesłał je kandydat lub gdy zostało przesłane automatycznie po terminie |
deadline_at |
string | null | Termin wykonania zadania |
candidate |
object | Dane kandydata |
job_posting |
object | Dane ogłoszenia o pracę |
Zdarzenia ocen zespołu
Zdarzenia: review.submitted
{
"event": "review.submitted",
"created_at": "2025-01-23T11:00:00Z",
"data": {
"id": 9,
"recommendation": "strong_yes",
"reviewer": "Alex Johnson",
"origin": "web",
"candidate": {
"id": 7,
"name": "Jane Smith",
"email": "[email protected]"
},
"job_posting": {
"id": 3,
"title": "Senior Engineer"
},
"stage": "Technical Interview"
}
}
| Pole | Typ | Opis |
|---|---|---|
id |
integer | Identyfikator oceny |
recommendation |
string | Rekomendacja recenzenta |
reviewer |
string | Imię i nazwisko recenzenta |
origin |
string | Sposób przesłania oceny: web (w Kit) albo mcp (ocenę złożyło narzędzie AI przez hiring_submit_review w imieniu recenzenta, który wcześniej ją potwierdził) |
candidate |
object | Dane kandydata |
job_posting |
object | Dane ogłoszenia o pracę |
stage |
string | Nazwa etapu w procesie rekrutacji, na którym ocena została przesłana |
Zdarzenia ogłoszeń o pracę
Zdarzenia: job_posting.published, job_posting.paused, job_posting.closed, job_posting.reopened
{
"event": "job_posting.published",
"created_at": "2025-01-10T08:00:00Z",
"data": {
"id": 3,
"title": "Senior Engineer",
"status": "published",
"location": "Remote",
"department": "Engineering",
"employment_type": "full_time",
"published_at": "2025-01-10T08:00:00Z",
"closed_at": null,
"public_url": "https://careers.example.com/senior-engineer"
}
}
| Pole | Typ | Opis |
|---|---|---|
id |
integer | Identyfikator ogłoszenia o pracę |
title |
string | Tytuł stanowiska |
status |
string | Bieżący status (published, paused, closed) |
location |
string | Lokalizacja pracy |
department |
string | Nazwa działu |
employment_type |
string | Forma współpracy (full_time, part_time, b2b, contract lub internship) |
published_at |
string | null | Kiedy ogłoszenie zostało opublikowane |
closed_at |
string | null | Kiedy ogłoszenie zostało zamknięte |
public_url |
string | Publiczny adres URL ogłoszenia w portalu kariery |
Zdarzenia zgłoszeń CSIRT
Zdarzenia: csirt.report.submitted, csirt.report.triaged, csirt.report.validated, csirt.report.resolved, csirt.report.fix_verified, csirt.report.dismissed, csirt.report.informative, csirt.report.assessed, csirt.report.assigned, csirt.report.bounty_approved, csirt.report.paid, csirt.report.sla_breached, csirt.report.escalation_requested
Te zdarzenia wymagają dodatku CSIRT (program nagród). Zdarzenia rzeczywiście obsługiwane przez Kit są wysyłane po zmianie statusu zgłoszenia i korzystają z danych pokazanych niżej.
Warning
csirt.report.assessed, csirt.report.assigned i csirt.report.bounty_approved są widoczne w ustawieniach subskrypcji, ale pozostają zarezerwowane i obecnie nie są dostarczane. Nie twórz automatyzacji, która od nich zależy.
csirt.report.dismissed oznacza, że zgłoszenie zostało odrzucone. csirt.report.informative oznacza, że było trafne, ale nie było czego naprawiać, i że mógł zostać za nie wypłacony uznaniowy bonus. Nie łącz obu przypadków w jedną gałąź „zamknięte”.
Dwa zdarzenia nie zależą od zmiany statusu i używają tych samych danych:
-
csirt.report.sla_breachedwysyłamy raz, gdy otwarte zgłoszenie przekroczy termin na potwierdzenie (domyślnie 72 godziny, ustawiany dla każdego programu). Zgłoszenie zamknięte i ponownie otwarte może je wywołać jeszcze raz. Zgłoszenia ocenione jako informacyjne go nie wywołują. -
csirt.report.escalation_requestedwysyłamy, gdy zgłaszający użyje przycisku Poproś o informację w portalu badacza. Jego notatka nigdy nie trafia do danych.
{
"event": "csirt.report.submitted",
"created_at": "2026-03-12T10:00:00Z",
"data": {
"id": "rpt_abc123",
"vulnerability_type": "sql_injection",
"severity_tier": "critical",
"cvss_score": 9.8,
"status": "submitted",
"program_name": "Acme Security Program",
"submitted_at": "2026-03-12T10:00:00Z"
}
}
| Pole | Typ | Opis |
|---|---|---|
id |
string | Identyfikator z prefiksem zgłoszenia |
vulnerability_type |
string | Kategoria zgłoszonej podatności |
severity_tier |
string | null | Oceniony poziom ważności (obecny po ocenie) |
cvss_score |
number | null | Wynik CVSS (obecny po ocenie) |
status |
string | Status zgłoszenia w momencie zdarzenia |
program_name |
string | Nazwa programu nagród |
submitted_at |
string | null | Kiedy zgłoszenie zostało przesłane |
Uwaga: tytuł i opis zgłoszenia są wykluczone z danych webhooka (szyfrowane w bazie danych).
Zdarzenia Outreach
Zdarzenia: outreach.prospect.drafted, outreach.message.approved, outreach.message.sent, outreach.message.bounced, outreach.message.failed, outreach.message.deferred, outreach.message.delivery_unknown, outreach.message.confirmation_expired, outreach.message.delivery_resolved
Te zdarzenia wymagają dodatku Outreach.
outreach.prospect.drafted
Wywoływane, gdy AI zakończy zbieranie informacji o leadzie i przygotuje szkic wiadomości e-mail.
{
"event": "outreach.prospect.drafted",
"created_at": "2026-03-12T10:00:00Z",
"data": {
"id": "op_abc123",
"campaign_id": "oc_def456",
"company_name": "Acme Corp",
"display_name": "Jane Smith",
"status": "drafted"
}
}
| Pole | Typ | Opis |
|---|---|---|
id |
string | Identyfikator z prefiksem leada |
campaign_id |
string | Identyfikator z prefiksem kampanii |
company_name |
string | Nazwa firmy leada |
display_name |
string | Wyświetlana nazwa leada |
status |
string | Status leada w momencie zdarzenia |
Uwaga: adres e-mail leada jest wykluczony z danych webhooka (szyfrowany w bazie danych).
outreach.message.approved / sent / bounced / failed / deferred / delivery_unknown / confirmation_expired
Wywoływane, gdy wiadomość przechodzi do statusu approved, sent, bounced, failed, deferred, delivery_unknown lub confirmation_expired. failed oznacza znany błąd uwierzytelniania, nadawcy, treści lub zasad i otwiera przegląd, który pozwala ponowić wysyłkę po naprawie albo ją zamknąć. deferred oznacza wyczerpanie bezpiecznych ponowień po znanym błędzie przed przekazaniem wiadomości. delivery_unknown oznacza, że nie udało się potwierdzić przyjęcia przez SMTP, dlatego Kit zatrzymuje automatyczną ponowną wysyłkę, aby uniknąć duplikatu. confirmation_expired oznacza, że odbiorca, tożsamość nadawcy, temat lub sprawdzona treść zmieniły się przed uruchomieniem SMTP. Próba dostarczenia nie została rozpoczęta; aktualną wiadomość trzeba ponownie sprawdzić i zatwierdzić.
{
"event": "outreach.message.sent",
"created_at": "2026-03-12T10:15:00Z",
"data": {
"id": "om_ghi789",
"campaign_id": "oc_def456",
"prospect_id": "op_abc123",
"step_number": 1,
"subject": "Quick question about Acme's hiring workflow",
"status": "sent",
"sent_at": "2026-03-12T10:15:00Z",
"approved_at": "2026-03-12T09:30:00Z",
"retry_count": 0,
"last_error_code": null
}
}
| Pole | Typ | Opis |
|---|---|---|
id |
string | Identyfikator z prefiksem wiadomości |
campaign_id |
string | Identyfikator z prefiksem kampanii |
prospect_id |
string | Identyfikator z prefiksem leada |
step_number |
integer | Numer kroku sekwencji (1 = początkowy, 2+ = kolejne wiadomości) |
subject |
string | Temat wiadomości e-mail |
status |
string | Jedna z wartości: approved, sent, bounced, failed, deferred, delivery_unknown, confirmation_expired
|
sent_at |
string | null | Kiedy wiadomość e-mail została wysłana |
approved_at |
string | null | Kiedy szkic został zatwierdzony |
retry_count |
integer | Liczba podjętych prób ponownego wysłania |
last_error_code |
string | null | Rozpoznany kod SMTP lub statusu dostarczenia, jeśli jest dostępny; null, jeśli nie rozpoczęto próby |
Uwaga: treść wiadomości e-mail jest wykluczona z danych webhooka (szyfrowana w bazie danych).
outreach.message.delivery_resolved
Emitowane, gdy osoba z uprawnieniem do zarządzania kampanią zapisze niezmienną decyzję zamykającą przegląd delivery_unknown, deferred lub failed. Wynik określa, czy Kit zarejestrował niepewną wysyłkę jako wysłaną, zlecił wyraźnie zatwierdzoną próbę po sprawdzeniu danych lub naprawie, czy zamknął przegląd bez wysyłki. delivery_attempt_id wskazuje konkretną próbę, której danych dotyczy decyzja.
{
"event": "outreach.message.delivery_resolved",
"created_at": "2026-03-12T10:20:00Z",
"data": {
"id": 84,
"message_id": "om_ghi789",
"delivery_attempt_id": 312,
"campaign_id": "oc_def456",
"prospect_id": "op_abc123",
"outcome": "confirmed_not_sent",
"origin": "web",
"resolved_by_id": 17,
"resolved_at": "2026-03-12T10:20:00Z",
"sent_at": null
}
}
| Pole | Typ | Opis |
|---|---|---|
id |
integer | Identyfikator rekordu audytowego rozstrzygnięcia |
message_id |
string | Identyfikator z prefiksem wiadomości |
delivery_attempt_id |
integer | Próba dostarczenia, której dotyczy decyzja |
campaign_id |
string | Identyfikator z prefiksem kampanii |
prospect_id |
string | Identyfikator z prefiksem leada |
outcome |
string |
confirmed_sent, confirmed_not_sent, retry_authorized lub closed_without_delivery
|
origin |
string | Źródło decyzji: web, mcp lub assistant
|
resolved_by_id |
integer | null | Użytkownik, który potwierdził decyzję; null, jeśli ten użytkownik został później usunięty |
resolved_at |
string | Znacznik czasu decyzji w formacie ISO 8601 |
sent_at |
string | null | Potwierdzony czas wysyłki; obecny wyłącznie dla confirmed_sent
|
Opcjonalna notatka operatora jest szyfrowana w spoczynku i celowo wykluczona, ponieważ może zawierać dane odbiorcy skopiowane ze skrzynki nadawcy.
Zdarzenia testowe
Zdarzenia: test.ping
Zdarzenie test.ping jest wysyłane po kliknięciu przycisku Wyślij test w ustawieniach webhooka. Służy do weryfikacji połączenia z endpointem oraz weryfikacji podpisu.
{
"event": "test.ping",
"created_at": "2025-01-15T14:30:00Z",
"data": {}
}