StartupKit
PL

Dokumentacja zdarzeń webhook

Struktura danych, nagłówki i definicje pól dla każdego zdarzenia webhook.

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ę

application.advanced jest wysyłane przy każdym przeniesieniu aplikacji na dalszy etap, także z pominięciem etapów. Dane zawierają wtedy dwa dodatkowe pola. Oba, podobnie jak current_stage, są zapisywane w chwili przeniesienia, nawet jeśli przed dostarczeniem aplikacja trafi na kolejny etap:

Pole Typ Opis
previous_stage string | null Nazwa etapu, z którego aplikacja została przeniesiona
skipped_stages array Nazwy pominiętych etapów w kolejności z procesu rekrutacji. Pusta tablica, gdy aplikacja trafiła na następny etap

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,
    "manual": false,
    "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
manual boolean true, gdy zespół umówił rozmowę poza Kit i odnotował ją w Kit
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": "Poznań, Poland",
    "remote": true,
    "location_display": "Poznań, Poland · Remote (Poland, EU)",
    "city": "Poznań",
    "region": null,
    "country_code": "PL",
    "remote_regions": ["PL", "EU"],
    "department": "Engineering",
    "employment_type": "full_time",
    "published_at": "2025-01-10T08:00:00Z",
    "review_starts_on": "2025-02-01",
    "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 dokładnie tak, jak wpisał ją rekruter
remote boolean Czy stanowisko można wykonywać zdalnie
location_display string | null Gotowa etykieta miejsca po angielsku, np. Poznań, Poland · Remote (Poland, EU). Pokazuj ją zamiast sklejać location i remote
city, region string | null Biuro lub miasto, w którym jest stanowisko, jeśli są znane
country_code string | null Kraj tego miejsca jako kod ISO 3166-1 alpha-2
remote_regions array Skąd mogą pracować kandydaci zdalni: kody ISO 3166-1 alpha-2 plus EU
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
review_starts_on string | null Data, od której zespół przegląda aplikacje (YYYY-MM-DD), albo null przy przeglądzie na bieżąco
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_breached wysył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_requested wysył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 są w subskrypcji Kit. Nadal wymagają odpowiednich uprawnień do webhooków.

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 wykluczona, ponieważ może zawierać dane odbiorcy skopiowane ze skrzynki nadawcy.

Zdarzenia spotkań Outreach

Zdarzenia spotkań nie są obecnie dostępne w edytorze webhooków. W istniejącej subskrypcji takiego zdarzenia data zawiera tylko id spotkania i campaign_id jego kampanii, oba z prefiksem:

{
  "id": "mtg_abc123",
  "campaign_id": "oc_def456"
}

Spotkania powiązane z prywatnymi skrzynkami są wykluczone. Przed wysyłką Kit ponownie sprawdza wskazaną kampanię i jej skrzynkę w obrębie konta webhooka. Brak kampanii lub odwołanie do innego konta blokuje wysyłkę.

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": {}
}

Wpisz, aby wyszukać...