Przejdź do głównej zawartości

Dokumentacja REST API

PhishSpot udostępnia REST API w formacie JSON pod adresem https://platform.phishspot.com/api/v1. Obejmuje ono praktycznie wszystko, co można zrobić w aplikacji administracyjnej: budować, planować i analizować kampanie, zarządzać odbiorcami/grupami/szablonami/kursami/mediami/domenami/autopilotami oraz przesyłać wyniki do własnych narzędzi.

Ten rozdział dokumentuje szczegółowo każdy punkt końcowy — parametry, treści żądań, pola odpowiedzi i kody statusu — abyś mógł zintegrować się bez czytania kodu źródłowego. Model zdarzeń oparty na powiadomieniach push opisano w Rozdziale 26 Webhooki; interfejs AI w języku naturalnym oferujący te same możliwości opisano w Rozdziale 29 Serwer MCP.

Każde uwierzytelnione żądanie musi przesyłać token API jako nagłówek bearer:

Authorization: Bearer <token>

Token można uzyskać na jeden z dwóch sposobów:

Z interfejsu administracyjnego (zalecane). Ustawienia konta → Tokeny API → Nowy token (zobacz Rozdział 14). Skopiuj wartość — jest ona wyświetlana tylko raz. Przechowuj ją w menedżerze sekretów.

Z API. Wyślij metodą POST email + password (oraz otp_attempt, jeśli włączone jest uwierzytelnianie dwuskładnikowe) na adres /auth:

Okno terminala
curl -X POST https://platform.phishspot.com/api/v1/auth \
-H 'Content-Type: application/json' \
-d '{"email":"admin@example.com","password":"secret"}'
{ "token": "abc123…", "user": { "id": 2, "email": "admin@example.com" } }
PoleTypOpis
emailstringWymagane. Adres e-mail użytkownika.
passwordstringWymagane. Hasło użytkownika.
otp_attemptstringWymagane tylko wtedy, gdy użytkownik ma włączone uwierzytelnianie dwuskładnikowe.

Token należy do pojedynczego użytkownika i dziedziczy jego przynależności do kont. Traktuj go jak hasło. Wszystkie poniższe przykłady zakładają, że $TOKEN zawiera prawidłowy token.

  • Bazowy URL: https://platform.phishspot.com/api/v1. Wszystkie poniższe ścieżki są względne wobec niego.
  • Typ treści: wysyłaj Content-Type: application/json; treści żądań i odpowiedzi są w formacie JSON.
  • Czasy: ISO-8601 (2026-05-20T14:22:33.000Z), UTC, o ile nie zaznaczono inaczej. Wartość wejściowa kampanii scheduled_at jest interpretowana w strefie czasowej konta.
  • Identyfikatory w ścieżkach: wszędzie tam, gdzie ścieżka przyjmuje :id, możesz przekazać albo całkowity klucz główny (/campaigns/42), albo prefiksowany identyfikator rekordu (/campaigns/camp_0u1k…). Odpowiedzi zawsze udostępniają całkowite id; niektóre udostępniają również prefiksowany identyfikator.
  • account_id: trasy zagnieżdżone przyjmują account_id w ścieżce; akceptuje on całkowity identyfikator lub prefiksowany identyfikator acct_…. Swój znajdziesz przez GET /accounts.
  • Zakres konta: token może działać tylko na kontach, do których należy jego użytkownik. Żądanie rekordu z innego konta zwraca 404 — API nigdy nie potwierdza, że dane innego najemcy istnieją.
  • Role: punkty końcowe odczytu wymagają dowolnej roli (w tym member). Punkty końcowe zapisu (POST/PATCH/PUT/DELETE oraz akcje zmieniające stan) wymagają roli admin lub editor; token z rolą member otrzymuje 403. Akcje administracyjne zespołu/rozliczeń oraz domen platformy wymagają roli admin.
  • Stronicowanie: punkty końcowe obsługujące stronicowanie przyjmują ?page=N (liczone od 1), a czasem ?per_page=M lub ?limit=M; wartości domyślne są podane przy każdym punkcie końcowym. Listy bez stronicowania zwracają pełny uporządkowany zbiór.

O ile punkt końcowy nie stanowi inaczej, dotyczą one każdego wywołania (poniżej powtarzane są tylko kody specyficzne dla danego punktu końcowego):

KodTreśćKiedy
401 Unauthorized(puste)Brak lub nieprawidłowy token Authorization.
403 Forbidden{"error":"You are not authorized to perform this action"}Token prawidłowy, ale rola użytkownika jest niewystarczająca dla tej akcji.
404 Not Found{"error":"Resource not found"}Brak takiego rekordu lub rekord należy do konta, do którego token nie ma dostępu.
422 Unprocessable Content{"errors":{"field":["message"]}} (lub {"errors":["message"]} dla punktów końcowych akcji)Walidacja nie powiodła się; sprawdź errors.
429 Too Many Requests(różne)Przekroczono limit żądań; zobacz §27.17. Nagłówek Retry-After wskazuje, kiedy ponowić próbę.

Zwraca użytkownika stojącego za tokenem.

Parametry: brak (tylko token bearer).

Okno terminala
curl -H "Authorization: Bearer $TOKEN" \
https://platform.phishspot.com/api/v1/me

Odpowiedź 200 OK

PoleTypOpis
idintegerIdentyfikator użytkownika.
emailstringAdres e-mail użytkownika.
namestringNazwa wyświetlana.
localestringUstawienia językowe interfejsu (en / pl).
accountsarrayKonta, na których token może działać (zobacz GET /accounts).

Wyświetla wszystkie konta, do których użytkownik tokenu ma dostęp. Użyj tego, aby znaleźć account_id dla tras zagnieżdżonych.

Parametry: brak.

Okno terminala
curl -H "Authorization: Bearer $TOKEN" \
https://platform.phishspot.com/api/v1/accounts

Odpowiedź 200 OK — tablica obiektów:

PoleTypOpis
idintegerIdentyfikator konta (używany w ścieżkach zagnieżdżonych).
prefix_idstringPrefiksowany identyfikator (acct_…).
namestringNazwa konta.
localestringDomyślne ustawienia językowe konta.
[{ "id": 11, "name": "Cydefen Tests", "locale": "pl", "prefix_id": "acct_3kf…" }]

Zarządzaj kampaniami symulacji phishingu: twórz i edytuj wersje robocze, prowadź kampanię przez jej cykl życia (start, pauza, zatrzymanie, anulowanie), zaplanuj przyszłą wysyłkę, duplikuj oraz odczytuj wyniki, postęp odbiorców, odpowiedzi i oś czasu zdarzeń dla pojedynczego kontaktu.

Autoryzacja jest egzekwowana per konto: kampania jest dostępna tylko wtedy, gdy należy do jednego z kont, których członkiem jest użytkownik tokenu (bearer) — każda rola w ramach członkostwa może odczytywać i zapisywać; nie ma akcji kampanii dostępnych wyłącznie dla administratorów. Punkty końcowe zmieniające stan dodatkowo wymagają, aby kampania znajdowała się w zgodnym stanie (np. zapauzować można tylko kampanię w stanie in_progress), w przeciwnym razie zwracają 403.

Obiekt kampanii zwracany przez show, create, update oraz wszystkie punkty końcowe zmieniające stan jest identyczny i opisany jednokrotnie w sekcji GET /campaigns/:id.

Wyświetla listę wszystkich kampanii na koncie, od najnowszych. Użyj go, aby wyliczyć kampanie przed przejściem do szczegółów jednej z nich. Uwierzytelnianie: Bearer; rola: odczyt (dowolna rola).

Parametry

NazwaGdzieTypWymaganeOpis
account_idpathstringtakIdentyfikator konta (acct_… lub liczba całkowita). Musi być kontem, do którego należy użytkownik tokenu.

Żądanie

Okno terminala
curl -H "Authorization: Bearer $TOKEN" \
https://platform.phishspot.com/api/v1/accounts/11/campaigns

Odpowiedź 200 OK — tablica JSON obiektów kampanii (lista pól dla pojedynczego obiektu znajduje się w GET /campaigns/:id), uporządkowana malejąco według created_at.

[
{
"id": 42,
"account_id": 11,
"name": "Q2 Invoice Lure",
"state": "in_progress",
"delivery_mode": "immediate",
"delivery_schedule": null,
"created_at": "2026-05-01T09:00:00.000Z",
"updated_at": "2026-05-02T14:12:00.000Z",
"email_subject": "Your April invoice is ready",
"email_content": "<p>Hello {{first_name}}…</p>",
"landing_html": "<form>…</form>",
"domain": "officelogin.in",
"course_id": 7,
"groups": [{ "id": 3, "name": "Finance" }],
"statistics": {
"total_contacts": 120,
"total_deliverables": 120,
"completion_percentage": 100.0
},
"can_start": false,
"can_pause": true,
"can_cancel": true
}
]

Kody statusu

KodKiedy
200Kampanie wyświetlone (pusta tablica, jeśli konto nie ma żadnych).
403Użytkownik tokenu nie jest uprawniony do wyświetlenia konta.
404account_id nie jest kontem, do którego należy użytkownik tokenu.

Tworzy nową roboczą kampanię na koncie. Wszystkie pola treści są opcjonalne przy tworzeniu — wymagane jest tylko name — dzięki czemu możesz utworzyć pustą wersję roboczą i uzupełnić ją za pomocą PATCH. Uwierzytelnianie: Bearer; rola: dowolna rola.

Parametry

Wszystkie parametry treści żądania są opakowane w obiekt campaign.

NazwaGdzieTypWymaganeOpis
account_idpathstringtakIdentyfikator konta (acct_… lub liczba całkowita).
campaign[name]bodystringtakNazwa kampanii. Musi być unikalna w obrębie konta (bez uwzględniania wielkości liter).
campaign[delivery_mode]bodystringnieJedna z wartości immediate, scheduled, staggered. Domyślnie immediate.
campaign[delivery_schedule]bodystringnieDowolny ciąg harmonogramu używany wyłącznie, gdy delivery_mode to scheduled (data i czas ISO8601 lub 5-polowy cron). Zamiast tego preferuj punkt końcowy /schedule.
campaign[email_subject]bodystringnieTemat wiadomości. Może zawierać znaczniki scalania wiadomości (np. {{first_name}}); nieznane znaczniki nie przejdą walidacji.
campaign[email_content]bodystringnieTreść HTML wiadomości. Musi być poprawnym HTML i używać wyłącznie dozwolonych znaczników scalania wiadomości.
campaign[landing_html]bodystringnieHTML strony docelowej. Musi być poprawnym HTML i używać wyłącznie dozwolonych znaczników scalania strony docelowej.
campaign[landing_css]bodystringnieCSS strony docelowej. Musi być poprawnym CSS.
campaign[landing_page_enabled]bodybooleannieCzy strona docelowa jest serwowana. Domyślnie false.
campaign[platform_domain_id]bodyintegernieIdentyfikator domeny PlatformDomain (domeny atakującego) używanej do wysyłki i strony docelowej. Wymagany, zanim kampania może wystartować.
campaign[course_id]bodyintegernieIdentyfikator kursu e-learningowego, do którego przekierowywane są ofiary (używany, gdy end_action_type to redirect_to_course).
campaign[from_email]bodystringnieAdres e-mail nadawcy. Wymagany, zanim kampania może wystartować.
campaign[from_name]bodystringnieWyświetlana nazwa nadawcy.
campaign[end_action_type]bodystringnieCo dzieje się po działaniu ofiary. Jedna z wartości nothing, redirect_to_course, message_page, redirect_to_url. Domyślnie message_page.
campaign[end_action_url]bodystringnieZewnętrzny adres URL do przekierowania. Wymagany (i musi być http/https, nie może zapętlać się z powrotem do domeny platformy), gdy end_action_type to redirect_to_url.
campaign[end_action_html]bodystringnieNiestandardowa strona z komunikatem HTML. Wymagana, gdy end_action_type to message_page (uzupełniana automatycznie wartością domyślną, jeśli pominięta).
campaign[group_ids]bodyarray of integernieIdentyfikatory grup kontaktów, na które jest kierowana kampania.

Żądanie

Okno terminala
curl -X POST -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{
"campaign": {
"name": "Q2 Invoice Lure",
"delivery_mode": "immediate",
"email_subject": "Your April invoice is ready",
"email_content": "<p>Hello {{first_name}}…</p>",
"from_email": "billing@officelogin.in",
"from_name": "Accounts Payable",
"platform_domain_id": 5,
"end_action_type": "redirect_to_course",
"course_id": 7,
"group_ids": [3]
}
}' \
https://platform.phishspot.com/api/v1/accounts/11/campaigns

Odpowiedź 201 Created — nowo utworzony obiekt kampanii (taki sam kształt jak GET /campaigns/:id).

Kody statusu

KodKiedy
201Kampania utworzona.
400Obiekt campaign brakuje w treści żądania (ParameterMissing).
403Użytkownik tokenu nie jest uprawniony do tworzenia kampanii na koncie.
404account_id nie jest kontem, do którego należy użytkownik tokenu.
422Walidacja nie powiodła się — np. puste/zduplikowane name, nieprawidłowa wartość enum delivery_mode/end_action_type, niepoprawny HTML/CSS, niedozwolony znacznik scalania lub brakujące end_action_url/end_action_html dla wybranego end_action_type. Treść: { "errors": { "<field>": ["…"] } }.

Pobiera pojedynczą kampanię po identyfikatorze (płytka trasa, nie zagnieżdżona pod kontem). Użyj go, aby odczytać pełną treść kampanii oraz flagi akcji informujące, które przejścia są obecnie dozwolone. Uwierzytelnianie: Bearer; rola: dowolna rola.

Parametry

NazwaGdzieTypWymaganeOpis
idpathstringtakIdentyfikator kampanii (camp_… lub liczba całkowita). Musi należeć do konta, którego członkiem jest użytkownik tokenu.

Żądanie

Okno terminala
curl -H "Authorization: Bearer $TOKEN" \
https://platform.phishspot.com/api/v1/campaigns/42

Odpowiedź 200 OK — obiekt kampanii.

PoleTypOpis
idintegerIdentyfikator kampanii.
account_idintegerIdentyfikator konta właściciela.
namestringNazwa kampanii.
statestringStan cyklu życia: draft, in_progress, paused, cancelled, done lub scheduled.
delivery_modestringimmediate, scheduled lub staggered.
delivery_schedulestring | nullSurowy ciąg harmonogramu dostarczania (znaczący tylko dla trybu scheduled).
created_atstringZnacznik czasu ISO8601.
updated_atstringZnacznik czasu ISO8601.
email_subjectstring | nullTemat wiadomości.
email_contentstring | nullTreść HTML wiadomości.
landing_htmlstring | nullHTML strony docelowej.
domainstring | nullNazwa powiązanej domeny PlatformDomain (np. officelogin.in) lub null, jeśli żadna nie jest ustawiona.
course_idinteger | nullIdentyfikator powiązanego kursu lub null.
groupsarrayGrupy docelowe, każda w postaci { "id": integer, "name": string }.
statisticsobjectObecne tylko wtedy, gdy state to in_progress, paused lub done. Obiekt z total_contacts (integer), total_deliverables (integer), completion_percentage (float).
can_startbooleanCzy start/schedule jest teraz dozwolone (true dla draft/scheduled).
can_pausebooleanCzy pause jest teraz dozwolone (true tylko gdy in_progress).
can_cancelbooleanCzy cancel jest teraz dozwolone (true dla in_progress/paused/scheduled).
{
"id": 42,
"account_id": 11,
"name": "Q2 Invoice Lure",
"state": "draft",
"delivery_mode": "immediate",
"delivery_schedule": null,
"created_at": "2026-05-01T09:00:00.000Z",
"updated_at": "2026-05-01T09:00:00.000Z",
"email_subject": "Your April invoice is ready",
"email_content": "<p>Hello {{first_name}}…</p>",
"landing_html": "<form>…</form>",
"domain": "officelogin.in",
"course_id": 7,
"groups": [{ "id": 3, "name": "Finance" }],
"can_start": true,
"can_pause": false,
"can_cancel": false
}

Kody statusu

KodKiedy
200Kampania zwrócona.
404Brak kampanii o tym identyfikatorze na jakimkolwiek koncie, do którego należy użytkownik tokenu (obejmuje próby dostępu między kontami).

Aktualizuje istniejącą kampanię. Edycja jest dozwolona tylko wtedy, gdy kampania znajduje się w stanie draft lub scheduled (polityka autoryzacji odrzuca edycję uruchomionych/zakończonych kampanii). Uwierzytelnianie: Bearer; rola: dowolna rola.

Parametry

Parametry treści żądania są opakowane w obiekt campaign; obowiązują te same dozwolone klucze co przy POST (wszystkie opcjonalne przy aktualizacji — wyślij tylko te pola, które chcesz zmienić).

NazwaGdzieTypWymaganeOpis
idpathstringtakIdentyfikator kampanii (camp_… lub liczba całkowita).
campaign[…]bodynieDowolny podzbiór kluczy wymienionych w POST /accounts/:account_id/campaigns (name, delivery_mode, delivery_schedule, email_subject, email_content, landing_html, landing_css, landing_page_enabled, platform_domain_id, course_id, from_email, from_name, end_action_type, end_action_url, end_action_html, group_ids[]).

Żądanie

Okno terminala
curl -X PATCH -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{ "campaign": { "email_subject": "Action required: invoice overdue" } }' \
https://platform.phishspot.com/api/v1/campaigns/42

Odpowiedź 200 OK — zaktualizowany obiekt kampanii (taki sam kształt jak GET /campaigns/:id).

Kody statusu

KodKiedy
200Kampania zaktualizowana.
400Obiekt campaign brakuje w treści żądania (ParameterMissing).
403Kampania nie jest w stanie draft/scheduled (edycja zablokowana) lub użytkownik nie jest uprawniony.
404Kampania nie została znaleziona na kontach użytkownika.
422Walidacja nie powiodła się (te same walidacje co przy POST). Treść: { "errors": { … } }.

Trwale usuwa kampanię i jej rekordy zależne (odbiorców, przesyłki, zdarzenia, odpowiedzi). Dozwolone w dowolnym stanie. Uwierzytelnianie: Bearer; rola: dowolna rola.

Brak parametrów poza tokenem bearer i identyfikatorem w ścieżce.

NazwaGdzieTypWymaganeOpis
idpathstringtakIdentyfikator kampanii (camp_… lub liczba całkowita).

Żądanie

Okno terminala
curl -X DELETE -H "Authorization: Bearer $TOKEN" \
https://platform.phishspot.com/api/v1/campaigns/42

Odpowiedź 204 No Content — pusta treść.

Kody statusu

KodKiedy
204Kampania usunięta.
403Użytkownik nie jest uprawniony do usunięcia kampanii.
404Kampania nie została znaleziona na kontach użytkownika.

Przenosi kampanię w stanie draft lub scheduled do in_progress i kolejkuje zadania wysyłki. Przed wysłaniem serwer wykonuje kontrolę wstępną gotowości i odrzuca żądanie, jeśli kampania jest niekompletna. Uwierzytelnianie: Bearer; rola: dowolna rola.

Brak parametrów poza tokenem bearer i identyfikatorem w ścieżce.

NazwaGdzieTypWymaganeOpis
idpathstringtakIdentyfikator kampanii (camp_… lub liczba całkowita).

Żądanie

Okno terminala
curl -X POST -H "Authorization: Bearer $TOKEN" \
https://platform.phishspot.com/api/v1/campaigns/42/start

Odpowiedź 200 OK — obiekt kampanii z state: "in_progress".

Kody statusu

KodKiedy
200Kampania uruchomiona; wysyłki zakolejkowane.
403Kampania nie jest w stanie umożliwiającym uruchomienie (draft/paused/scheduled).
404Kampania nie została znaleziona na kontach użytkownika.
422Kontrola wstępna gotowości nie powiodła się. Treść: { "errors": ["…", "…"] } (płaska tablica czytelnych dla człowieka komunikatów). Przyczyny obejmują: brakujący temat wiadomości, brakującą treść wiadomości, brakujący adres e-mail nadawcy, brak ustawionej domeny platformy, nieaktywną lub zablokowaną do wysyłki domenę platformy, brak odbiorców docelowych oraz braki w akcji końcowej (brakujący kurs dla redirect_to_course, brakujący URL dla redirect_to_url, brakujący HTML dla message_page).

Oznacza trwającą kampanię jako done (zakończoną). Użyj go, aby wcześniej zakończyć działającą kampanię; oczekujące wysyłki nie są ponownie kolejkowane. Uwierzytelnianie: Bearer; rola: dowolna rola.

Brak parametrów poza tokenem bearer i identyfikatorem w ścieżce.

NazwaGdzieTypWymaganeOpis
idpathstringtakIdentyfikator kampanii (camp_… lub liczba całkowita).

Żądanie

Okno terminala
curl -X POST -H "Authorization: Bearer $TOKEN" \
https://platform.phishspot.com/api/v1/campaigns/42/stop

Odpowiedź 200 OK — obiekt kampanii z state: "done".

Kody statusu

KodKiedy
200Kampania oznaczona jako zakończona.
403Kampania nie jest w stanie in_progress.
404Kampania nie została znaleziona na kontach użytkownika.
422Przejście stanu odrzucone przez model. Treść: { "errors": { … } }.

Pauzuje trwającą kampanię (stan → paused), wstrzymując dalsze zaplanowane wysyłki. Wznów, wywołując ponownie start. Uwierzytelnianie: Bearer; rola: dowolna rola.

Brak parametrów poza tokenem bearer i identyfikatorem w ścieżce.

NazwaGdzieTypWymaganeOpis
idpathstringtakIdentyfikator kampanii (camp_… lub liczba całkowita).

Żądanie

Okno terminala
curl -X POST -H "Authorization: Bearer $TOKEN" \
https://platform.phishspot.com/api/v1/campaigns/42/pause

Odpowiedź 200 OK — obiekt kampanii z state: "paused".

Kody statusu

KodKiedy
200Kampania zapauzowana.
403Kampania nie jest w stanie in_progress.
404Kampania nie została znaleziona na kontach użytkownika.
422Przejście stanu odrzucone przez model. Treść: { "errors": { … } }.

Anuluje kampanię (stan → cancelled). Dozwolone ze stanu in_progress, paused lub scheduled (nie ze stanu draft ani z już zakończonych kampanii). Uwierzytelnianie: Bearer; rola: dowolna rola.

Brak parametrów poza tokenem bearer i identyfikatorem w ścieżce.

NazwaGdzieTypWymaganeOpis
idpathstringtakIdentyfikator kampanii (camp_… lub liczba całkowita).

Żądanie

Okno terminala
curl -X POST -H "Authorization: Bearer $TOKEN" \
https://platform.phishspot.com/api/v1/campaigns/42/cancel

Odpowiedź 200 OK — obiekt kampanii z state: "cancelled".

Kody statusu

KodKiedy
200Kampania anulowana.
403Kampania nie jest w stanie umożliwiającym anulowanie (in_progress/paused/scheduled).
404Kampania nie została znaleziona na kontach użytkownika.
422Przejście stanu odrzucone przez model. Treść: { "errors": { … } }.

Klonuje kampanię do nowej wersji draft (z nazwą z numerowanym sufiksem, np. "Q2 Invoice Lure (1)"), kopiując treść, grupy docelowe i odbiorców, ale resetując stan, harmonogram i migawkę. Użyj go, aby ponownie uruchomić lub rozgałęzić kampanię. Uwierzytelnianie: Bearer; rola: dowolna rola.

Brak parametrów poza tokenem bearer i identyfikatorem w ścieżce.

NazwaGdzieTypWymaganeOpis
idpathstringtakIdentyfikator kampanii (camp_… lub liczba całkowita) kampanii źródłowej.

Żądanie

Okno terminala
curl -X POST -H "Authorization: Bearer $TOKEN" \
https://platform.phishspot.com/api/v1/campaigns/42/duplicate

Odpowiedź 201 Created — nowy obiekt roboczej kampanii (taki sam kształt jak GET /campaigns/:id), z nowym id i state: "draft".

Kody statusu

KodKiedy
201Duplikat utworzony.
403Użytkownik nie jest uprawniony.
404Kampania źródłowa nie została znaleziona na kontach użytkownika.
422Zapisanie duplikatu nie powiodło się (walidacja). Treść: { "errors": { … } }.

Planuje roboczą kampanię (draft) na przyszłą wysyłkę (stan → scheduled). Wykonuje tę samą kontrolę wstępną gotowości co start, a dodatkowo sprawdza poprawność czasu. Uwierzytelnianie: Bearer; rola: dowolna rola.

Parametry

NazwaGdzieTypWymaganeOpis
idpathstringtakIdentyfikator kampanii (camp_… lub liczba całkowita).
scheduled_atbodystringtakDocelowy czas wysyłki jako lokalna data i czas (w strefie czasowej konta), bez przesunięcia — np. 2026-06-10T09:00 (wartość produkowana przez pole datetime-local). Jest interpretowany w strefie czasowej konta (z fallbackiem do UTC, jeśli konto jej nie ma) i konwertowany na UTC po stronie serwera. Musi przypadać w przyszłości i co najmniej 5 minut od teraz. Nie jest opakowany w obiekt campaign — wysyłany jako klucz najwyższego poziomu w treści żądania.

Żądanie

Okno terminala
curl -X POST -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{ "scheduled_at": "2026-06-10T09:00" }' \
https://platform.phishspot.com/api/v1/campaigns/42/schedule

Odpowiedź 200 OK — obiekt kampanii z state: "scheduled".

Kody statusu

KodKiedy
200Kampania zaplanowana.
403Kampania nie jest w stanie umożliwiającym uruchomienie (musi być draft).
404Kampania nie została znaleziona na kontach użytkownika.
422Planowanie nie powiodło się. Treść: { "errors": ["…"] } (płaska tablica). Przyczyny: puste scheduled_at, niemożliwa do sparsowania data i czas, czas w przeszłości, czas mniej niż 5 minut od teraz lub niepowodzenie kontroli wstępnej gotowości do startu (te same kontrole treści/nadawcy/domeny/odbiorcy/akcji końcowej co przy start).

Anuluje oczekujący harmonogram, przywracając kampanię do stanu draft i usuwając jej zakolejkowane zadanie wysyłki. Ważne tylko dla kampanii w stanie scheduled. Uwierzytelnianie: Bearer; rola: dowolna rola.

Brak parametrów poza tokenem bearer i identyfikatorem w ścieżce.

NazwaGdzieTypWymaganeOpis
idpathstringtakIdentyfikator kampanii (camp_… lub liczba całkowita).

Żądanie

Okno terminala
curl -X POST -H "Authorization: Bearer $TOKEN" \
https://platform.phishspot.com/api/v1/campaigns/42/cancel_schedule

Odpowiedź 200 OK — obiekt kampanii (stan przywrócony do draft).

Kody statusu

KodKiedy
200Harmonogram anulowany.
403Użytkownik nie jest uprawniony (polityka wymaga stanu scheduled).
404Kampania nie została znaleziona na kontach użytkownika.
422Kampania nie jest obecnie w stanie scheduled. Treść: { "error": "Campaign is not scheduled (state: <state>); nothing to cancel." } (zwróć uwagę na klucz error w liczbie pojedynczej w tym przypadku).

Zwraca zagregowane statystyki kampanii: ogólny lejek zaangażowania oraz zestawienia per grupa i per dział. Użyj go do renderowania pulpitów i raportów. Uwierzytelnianie: Bearer; rola: dowolna rola.

Parametry

NazwaGdzieTypWymaganeOpis
idpathstringtakIdentyfikator kampanii (camp_… lub liczba całkowita).

Żądanie

Okno terminala
curl -H "Authorization: Bearer $TOKEN" \
https://platform.phishspot.com/api/v1/campaigns/42/results

Odpowiedź 200 OK — obiekt statystyk.

PoleTypOpis
campaign_idintegerIdentyfikator kampanii.
namestringNazwa kampanii.
funnelobjectOgólny lejek zaangażowania (liczby + współczynniki). Zobacz podpola poniżej.
groupsarrayZestawienie per grupa. Pusta tablica, jeśli kampania nie jest kierowana na żadne grupy. Zobacz podpola poniżej.
departmentsarrayZestawienie per dział (kontakty pogrupowane według ich department). Puste, jeśli brak działów. Te same podpola liczbowe co wpis grupy, z name, ale bez id.

Podpola funnel:

PoleTypOpis
sentintegerLiczba unikalnych kontaktów, do których wiadomość została pomyślnie wysłana.
openedintegerLiczba unikalnych kontaktów, które otworzyły wiadomość.
clickedintegerLiczba unikalnych kontaktów, które kliknęły.
submittedintegerLiczba unikalnych kontaktów, które przesłały dane na stronie docelowej.
trainedintegerPrzesyłki, które osiągnęły stan educated (ukończone szkolenie).
repliedintegerLiczba unikalnych kontaktów, które odpowiedziały na wiadomość phishingową (sygnał z bocznego kanału, niewchodzący w skład lejka kliknięć/przesłań).
open_ratefloatopened / sent jako wartość procentowa (1 miejsce po przecinku).
click_ratefloatclicked / sent w procentach.
submit_ratefloatsubmitted / sent w procentach.
train_ratefloattrained / sent w procentach.
reply_ratefloatreplied / sent w procentach.

Każdy wpis groups[]: name (string), id (integer), total_contacts (integer), sent, opened, clicked, submitted, trained (integers) oraz open_rate, click_rate, submit_rate, train_rate (floats).

{
"campaign_id": 42,
"name": "Q2 Invoice Lure",
"funnel": {
"sent": 120,
"opened": 84,
"clicked": 37,
"submitted": 12,
"trained": 9,
"replied": 3,
"open_rate": 70.0,
"click_rate": 30.8,
"submit_rate": 10.0,
"train_rate": 7.5,
"reply_rate": 2.5
},
"groups": [
{
"name": "Finance",
"id": 3,
"total_contacts": 60,
"sent": 60,
"opened": 45,
"clicked": 22,
"submitted": 8,
"trained": 6,
"open_rate": 75.0,
"click_rate": 36.7,
"submit_rate": 13.3,
"train_rate": 10.0
}
],
"departments": [
{
"name": "Accounting",
"total_contacts": 40,
"sent": 40,
"opened": 30,
"clicked": 15,
"submitted": 5,
"trained": 4,
"open_rate": 75.0,
"click_rate": 37.5,
"submit_rate": 12.5,
"train_rate": 10.0
}
]
}

Kody statusu

KodKiedy
200Statystyki zwrócone.
404Kampania nie została znaleziona na kontach użytkownika.

Zwraca stronicowaną, filtrowalną listę odbiorców kampanii wraz z ich etapem dostarczenia, statusem szkolenia i flagą odpowiedzi dla pojedynczego kontaktu. Odbiorcy są uporządkowani według nazwiska kontaktu, a następnie imienia. Uwierzytelnianie: Bearer; rola: dowolna rola.

Parametry

NazwaGdzieTypWymaganeOpis
idpathstringtakIdentyfikator kampanii (camp_… lub liczba całkowita).
pagequeryintegernieNumer strony liczony od 1; wartości poniżej 1 są przycinane do 1. Domyślnie 1. Rozmiar strony jest ustalony na 25.
stagequerystringnieFiltruj według etapu lejka: sent, opened, clicked, submitted lub trained. all (lub pominięcie) zwraca wszystkich. Filtry są kumulatywne względem etapu (np. opened obejmuje tych, którzy później kliknęli/przesłali/zostali przeszkoleni).
repliedquerybooleannieGdy prawdziwe (true/1), ogranicza do kontaktów, które odpowiedziały na wiadomość.
group_idqueryintegernieOgranicza do kontaktów w tej grupie (musi należeć do konta kampanii).
departmentquerystringnieOgranicza do kontaktów, których department dokładnie odpowiada tej wartości.

Żądanie

Okno terminala
curl -H "Authorization: Bearer $TOKEN" \
"https://platform.phishspot.com/api/v1/campaigns/42/recipients?stage=clicked&page=1"

Odpowiedź 200 OK — stronicowani odbiorcy.

PoleTypOpis
campaign_idintegerIdentyfikator kampanii.
pageintegerBieżący numer strony.
per_pageintegerRozmiar strony (zawsze 25).
totalintegerŁączna liczba odbiorców pasujących do filtrów (na wszystkich stronach).
recipientsarrayWiersze odbiorców (zobacz podpola).

Każdy wpis recipients[]:

PoleTypOpis
idintegerIdentyfikator kontaktu.
contact_idintegerIdentyfikator kontaktu (ta sama wartość co id).
emailstringAdres e-mail kontaktu.
full_namestringPełna nazwa kontaktu.
statusstringStan dostarczenia: pending, sent, delivered, bounced, opened, clicked, submitted lub educated.
stagestringTa sama wartość co status (alias).
training_statusstringnot_started, in_progress lub completed.
repliedbooleanCzy kontakt odpowiedział na wiadomość phishingową.
{
"campaign_id": 42,
"page": 1,
"per_page": 25,
"total": 37,
"recipients": [
{
"id": 901,
"contact_id": 901,
"email": "jane.doe@victimco.com",
"full_name": "Jane Doe",
"status": "clicked",
"stage": "clicked",
"training_status": "in_progress",
"replied": false
}
]
}

Kody statusu

KodKiedy
200Odbiorcy zwróceni.
404Kampania nie została znaleziona na kontach użytkownika lub wyszukiwanie group_id/department odwołuje się do rekordu spoza konta kampanii.

Zwraca stronicowaną listę przychodzących odpowiedzi, które odbiorcy odesłali na wiadomość phishingową, od najnowszych. Użyj go, aby uwidocznić zaangażowane cele i przejrzeć treść odpowiedzi. Uwierzytelnianie: Bearer; rola: dowolna rola.

Parametry

NazwaGdzieTypWymaganeOpis
idpathstringtakIdentyfikator kampanii (camp_… lub liczba całkowita).
pagequeryintegernieNumer strony liczony od 1; przycinany do minimum 1. Domyślnie 1. Rozmiar strony jest ustalony na 25.

Żądanie

Okno terminala
curl -H "Authorization: Bearer $TOKEN" \
"https://platform.phishspot.com/api/v1/campaigns/42/replies?page=1"

Odpowiedź 200 OK — stronicowane odpowiedzi.

PoleTypOpis
campaign_idintegerIdentyfikator kampanii.
pageintegerBieżący numer strony.
per_pageintegerRozmiar strony (zawsze 25).
totalintegerŁączna liczba odpowiedzi dla kampanii.
repliesarrayWiersze odpowiedzi (zobacz podpola).

Każdy wpis replies[]:

PoleTypOpis
idintegerIdentyfikator odpowiedzi.
from_emailstringAdres e-mail nadawcy (odbiorcy).
received_atstringZnacznik czasu ISO8601 momentu otrzymania odpowiedzi.
subjectstringTemat odpowiedzi.
excerptstringTekstowy fragment treści odpowiedzi (skrócony).
attachments_countintegerLiczba załączników w odpowiedzi.
{
"campaign_id": 42,
"page": 1,
"per_page": 25,
"total": 3,
"replies": [
{
"id": 5501,
"from_email": "jane.doe@victimco.com",
"received_at": "2026-05-02T11:24:00Z",
"subject": "Re: Your April invoice is ready",
"excerpt": "Is this really from accounting? I don't recognize…",
"attachments_count": 0
}
]
}

Kody statusu

KodKiedy
200Odpowiedzi zwrócone.
404Kampania nie została znaleziona na kontach użytkownika.

Zwraca chronologiczną oś czasu zdarzeń dla pojedynczego kontaktu w ramach kampanii (sent → opened → clicked → submitted → szkolenie itd.). Użyj go, aby zbadać pełną historię interakcji jednej ofiary. Uwierzytelnianie: Bearer; rola: dowolna rola.

Parametry

NazwaGdzieTypWymaganeOpis
idpathstringtakIdentyfikator kampanii (camp_… lub liczba całkowita).
contact_idqueryintegertakIdentyfikator kontaktu, którego oś czasu należy zwrócić. Musi należeć do konta kampanii.

Żądanie

Okno terminala
curl -H "Authorization: Bearer $TOKEN" \
"https://platform.phishspot.com/api/v1/campaigns/42/timeline?contact_id=901"

Odpowiedź 200 OK — lista zdarzeń kontaktu, uporządkowana od najstarszych.

PoleTypOpis
campaign_idintegerIdentyfikator kampanii.
contact_idintegerIdentyfikator kontaktu.
eventsarrayZdarzenia dla tego kontaktu (zobacz podpola).

Każdy wpis events[]:

PoleTypOpis
genrestringTyp zdarzenia: sent, delivered, bounced, opened, clicked, submitted_data, started_training, completed_training, failed_quiz, passed_quiz lub replied.
created_atstringZnacznik czasu ISO8601 zdarzenia.
metadataobject | nullDowolne metadane zdarzenia (np. user agent, IP, szczegóły quizu), w zapisanej postaci.
{
"campaign_id": 42,
"contact_id": 901,
"events": [
{ "genre": "sent", "created_at": "2026-05-01T09:05:00Z", "metadata": {} },
{ "genre": "opened", "created_at": "2026-05-01T09:41:00Z", "metadata": { "ua": "Mozilla/5.0" } },
{ "genre": "clicked", "created_at": "2026-05-01T09:42:00Z", "metadata": { "ip": "203.0.113.7" } }
]
}

Kody statusu

KodKiedy
200Oś czasu zwrócona.
404Kampania nie została znaleziona na kontach użytkownika lub contact_id nie odwołuje się do kontaktu na koncie kampanii (brakujący/nieprawidłowy contact_id powoduje błąd nieznalezienia).

Biblioteka szablonów phishingowych to katalog gotowych scenariuszy phishingowych (e-mail + strona docelowa + akcja po kliknięciu), które konto może wdrożyć w rzeczywistej kampanii. Szablony występują w dwóch wariantach: kuratorowane (dostarczane przez platformę, współdzielone z każdym kontem, tylko do odczytu) oraz niestandardowe (utworzone przez konto, widoczne wyłącznie dla tego konta). Szablony są zorganizowane w drzewo kategorii (do trzech poziomów zagnieżdżenia). Wdrożenie szablonu tworzy nową roboczą kampanię wstępnie wypełnioną treścią szablonu — nigdy nie wysyła żadnego e-maila.

Zwraca listę szablonów widocznych dla konta, stronicowaną po 12 na stronę. Użyj parametru tab, aby przełączać się między współdzieloną biblioteką kuratorowaną a własnymi szablonami niestandardowymi konta, oraz category/search, aby zawęzić wyniki. Zwraca tylko metadane (bez bloków HTML) — wywołaj punkt końcowy show, aby uzyskać pełną treść. Uwierzytelnianie: Bearer; rola: odczyt (dowolna rola).

Parametry

NazwaGdzieTypWymaganeOpis
account_idpathstringtakIdentyfikator konta (acct_… lub liczba całkowita). Musi być kontem, do którego należy użytkownik tokenu.
tabquerystringnieKtóra biblioteka ma zostać wyświetlona. custom zwraca własne szablony tego konta; każda inna wartość (lub jej pominięcie) zwraca współdzieloną bibliotekę curated. Domyślnie: curated.
categoryquerystring lub tablicanieJeden lub więcej identyfikatorów kategorii (identyfikatory z prefiksem tcat_… lub liczby całkowite) do filtrowania. Dopasowuje szablony przypisane do danej kategorii lub dowolnego z jej potomków. Wiele wartości przekaż jako powtórzone parametry category[]. Nierozpoznane identyfikatory są ignorowane.
searchquerystringnieDopasowanie podciągu (bez rozróżniania wielkości liter) względem name i description szablonu.
pagequeryintegernieNumer strony liczony od 1. Wartości poniżej 1 są zaokrąglane do 1. Domyślnie: 1. Rozmiar strony jest ustalony na 12.

Żądanie

Okno terminala
curl -H "Authorization: Bearer $TOKEN" \
"https://platform.phishspot.com/api/v1/accounts/11/phishing_templates?tab=curated&category=tcat_abc123&search=invoice&page=1"

Odpowiedź 200 OK — koperta stronicowania plus tablica templates z metadanymi szablonów.

PoleTypOpis
tabstringRozwiązana zakładka: "curated" lub "custom".
pageintegerBieżący numer strony.
per_pageintegerRozmiar strony (zawsze 12).
totalintegerŁączna liczba szablonów pasujących do filtrów (na wszystkich stronach).
templatesarrayTablica obiektów szablonów (zobacz pola poniżej).
templates[].idintegerSurowy numeryczny identyfikator szablonu.
templates[].namestringNazwa szablonu.
templates[].descriptionstring | nullOpis w dowolnej formie tekstowej.
templates[].curatedbooleantrue dla szablonów dostarczanych przez platformę, false dla należących do konta.
templates[].draftbooleantrue, jeśli szablon jest nieopublikowaną wersją roboczą (brak wymaganej treści). Wersji roboczych nie można wdrażać.
templates[].email_subjectstring | nullTemat phishingowej wiadomości e-mail.
templates[].landing_page_enabledbooleanCzy szablon zawiera hostowaną stronę docelową.
templates[].created_atstring (ISO 8601)Znacznik czasu utworzenia.
templates[].updated_atstring (ISO 8601)Znacznik czasu ostatniej aktualizacji.
templates[].template_idstringIdentyfikator z prefiksem (tmpl_…). Użyj go w ścieżkach show/deploy.
templates[].categoriesarrayKategorie, do których przypisany jest ten szablon.
templates[].categories[].idintegerSurowy numeryczny identyfikator kategorii.
templates[].categories[].category_idstringIdentyfikator kategorii z prefiksem (tcat_…).
templates[].categories[].namestringZlokalizowana nazwa kategorii (bieżąca lokalizacja żądania, z odwołaniem do angielskiego).
{
"tab": "curated",
"page": 1,
"per_page": 12,
"total": 37,
"templates": [
{
"id": 84,
"name": "Unpaid Invoice Reminder",
"description": "Spoofed accounts-payable invoice with a credential-harvesting login page.",
"curated": true,
"draft": false,
"email_subject": "Action required: invoice #44021 is overdue",
"landing_page_enabled": true,
"created_at": "2026-01-14T09:12:00.000Z",
"updated_at": "2026-03-02T16:40:11.000Z",
"template_id": "tmpl_8x2k9q",
"categories": [
{ "id": 5, "category_id": "tcat_abc123", "name": "Finance" }
]
}
]
}

Kody statusu

KodKiedy
200Szablony wyświetlone (tablica może być pusta).
404account_id nie jest kontem, do którego należy użytkownik tokenu. Treść: {"error":"Account not found"}.

GET /accounts/:account_id/phishing_template_categories

Dział zatytułowany „GET /accounts/:account_id/phishing_template_categories”

Zwraca pełne drzewo kategorii (korzenie z zagnieżdżonymi elementami podrzędnymi, do trzech poziomów) na potrzeby interfejsu filtrowania biblioteki szablonów. Przydatne do zbudowania selektora kategorii przed wywołaniem listy szablonów z parametrem category=. Uwierzytelnianie: Bearer; rola: odczyt (dowolna rola).

Parametry

NazwaGdzieTypWymaganeOpis
account_idpathstringtakIdentyfikator konta (acct_… lub liczba całkowita). Musi być kontem, do którego należy użytkownik tokenu.

(Kategorie są globalne, a nie ograniczone do konta — account_id jedynie kontroluje dostęp. Brak innych parametrów.)

Żądanie

Okno terminala
curl -H "Authorization: Bearer $TOKEN" \
https://platform.phishspot.com/api/v1/accounts/11/phishing_template_categories

Odpowiedź 200 OK — tablica categories kategorii głównych, z których każda rekurencyjnie osadza swoje elementy podrzędne.

PoleTypOpis
categoriesarrayKategorie główne, uporządkowane według position.
categories[].idintegerSurowy numeryczny identyfikator kategorii.
categories[].category_idstringIdentyfikator kategorii z prefiksem (tcat_…).
categories[].namestringZlokalizowana nazwa kategorii (lokalizacja żądania, z odwołaniem do angielskiego).
categories[].slugstringSlug bezpieczny dla adresów URL (unikalny, wyprowadzony z angielskiej nazwy).
categories[].depthintegerGłębokość drzewa: 0 dla korzeni, 1 dla elementów podrzędnych, 2 dla wnuków.
categories[].is_leafbooleantrue, gdy kategoria nie ma elementów podrzędnych.
categories[].childrenarrayZagnieżdżone kategorie podrzędne o tym samym kształcie (pusta tablica dla liści).
{
"categories": [
{
"id": 1,
"category_id": "tcat_root01",
"name": "Finance",
"slug": "finance",
"depth": 0,
"is_leaf": false,
"children": [
{
"id": 5,
"category_id": "tcat_abc123",
"name": "Invoices",
"slug": "invoices",
"depth": 1,
"is_leaf": true,
"children": []
}
]
}
]
}

Kody statusu

KodKiedy
200Zwrócono drzewo kategorii (może być pustą tablicą).
404account_id nie jest kontem, do którego należy użytkownik tokenu. Treść: {"error":"Account not found"}.

Zwraca pojedynczy szablon z jego pełną treścią — treścią wiadomości e-mail, kodem HTML/CSS strony docelowej oraz konfiguracją akcji po kliknięciu (akcji końcowej). Użyj tego, aby wyrenderować podgląd lub sprawdzić, co wdrożenie skopiuje do kampanii. Ta ścieżka jest płytka (bez account_id w ścieżce); użytkownik tokenu musi mieć możliwość zobaczenia szablonu (własne szablony niestandardowe oraz wszystkie kuratorowane). Uwierzytelnianie: Bearer; rola: odczyt (dowolna rola).

Parametry

NazwaGdzieTypWymaganeOpis
idpathstringtakIdentyfikator szablonu (tmpl_… lub liczba całkowita).

Brak parametrów poza tokenem bearer.

Żądanie

Okno terminala
curl -H "Authorization: Bearer $TOKEN" \
https://platform.phishspot.com/api/v1/phishing_templates/tmpl_8x2k9q

Odpowiedź 200 OK — pełny obiekt szablonu.

PoleTypOpis
idintegerSurowy numeryczny identyfikator szablonu.
namestringNazwa szablonu.
descriptionstring | nullOpis w dowolnej formie tekstowej.
curatedbooleantrue dla szablonów dostarczanych przez platformę, false dla należących do konta.
draftbooleantrue, jeśli nieopublikowany. Wersji roboczych nie można wdrażać.
email_subjectstring | nullTemat phishingowej wiadomości e-mail (może zawierać merge tagi).
email_contentstring | nullPełna treść HTML phishingowej wiadomości e-mail.
landing_htmlstring | nullKod HTML strony docelowej.
landing_cssstring | nullKod CSS strony docelowej.
landing_page_enabledbooleanCzy dołączona jest hostowana strona docelowa.
end_action_typestringCo dzieje się po przesłaniu strony docelowej przez ofiarę. Jedna z wartości nothing, redirect_to_course, message_page, redirect_to_url.
end_action_urlstring | nullDocelowy adres URL, gdy end_action_type ma wartość redirect_to_url (musi być http/https).
end_action_htmlstring | nullKod HTML wyświetlany, gdy end_action_type ma wartość message_page (np. strona uświadamiająca).
created_atstring (ISO 8601)Znacznik czasu utworzenia.
updated_atstring (ISO 8601)Znacznik czasu ostatniej aktualizacji.
template_idstringIdentyfikator z prefiksem (tmpl_…).
course_idinteger | nullIdentyfikator powiązanego kursu e-learningowego (używany, gdy end_action_type ma wartość redirect_to_course).
publishablebooleantrue, gdy obecne są wszystkie wymagane pola (nazwa, temat, treść e-maila, HTML strony docelowej).
categoriesarrayPrzypisane kategorie: każda z id (liczba całkowita), category_id (tcat_…) oraz name.
{
"id": 84,
"name": "Unpaid Invoice Reminder",
"description": "Spoofed accounts-payable invoice with a credential-harvesting login page.",
"curated": true,
"draft": false,
"email_subject": "Action required: invoice #44021 is overdue",
"email_content": "<html><body><p>Dear {{first_name}}, your invoice is overdue…</p></body></html>",
"landing_html": "<form action=\"#\">…</form>",
"landing_css": "body { font-family: sans-serif; }",
"landing_page_enabled": true,
"end_action_type": "message_page",
"end_action_url": null,
"end_action_html": "<h1>You've been phished by a simulation.</h1>",
"created_at": "2026-01-14T09:12:00.000Z",
"updated_at": "2026-03-02T16:40:11.000Z",
"template_id": "tmpl_8x2k9q",
"course_id": null,
"publishable": true,
"categories": [
{ "id": 5, "category_id": "tcat_abc123", "name": "Finance" }
]
}

Kody statusu

KodKiedy
200Zwrócono szablon.
403Szablon nie jest widoczny dla użytkownika tokenu (niestandardowy szablon innego konta). Treść: {"error":"You are not authorized to perform this action"}.
404Żaden szablon nie pasuje do id. Treść: {"error":"Resource not found"}.

Tworzy nową roboczą kampanię na koncie docelowym, wstępnie wypełnioną treścią szablonu (temat/treść e-maila, HTML/CSS strony docelowej, akcja końcowa, kurs). Ta ścieżka jest płytka, więc wdrażające konto jest przekazywane w treści żądania jako account_id. Przy quick_launch=true dodatkowo dodaje wszystkich odbiorców z kontaktów konta jako odbiorców i przenosi kampanię do kroku przeglądu. Ten punkt końcowy nigdy nie wysyła żadnego e-maila — kampanię uruchamia człowiek z interfejsu PhishSpot. Wersji roboczych nie można wdrażać. Uwierzytelnianie: Bearer; rola: dowolny członek konta docelowego.

Parametry

NazwaGdzieTypWymaganeOpis
idpathstringtakIdentyfikator szablonu do wdrożenia (tmpl_… lub liczba całkowita). Nie może być szablonem roboczym.
account_idbodystringtakKonto, na którym ma zostać utworzona kampania (acct_… lub liczba całkowita). Musi być kontem, do którego należy użytkownik tokenu.
quick_launchbodybooleannieGdy wartość jest prawdziwa (true, "1" itp.), masowo dodaje każdy kontakt konta jako odbiorcę i oznacza kroki kreatora 1–5 jako ukończone, dzięki czemu kampania trafia do kroku przeglądu. Wymaga aktywnej domeny wysyłkowej i co najmniej jednego kontaktu. Domyślnie: false.

Żądanie

Okno terminala
curl -X POST -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{ "account_id": "acct_4f8a2c", "quick_launch": true }' \
https://platform.phishspot.com/api/v1/phishing_templates/tmpl_8x2k9q/deploy

Odpowiedź 201 Created — nowo utworzona kampania (taki sam kształt jak punkt końcowy show kampanii). Świeżo wdrożona kampania jest w stanie draft, więc blok statistics jest pomijany (pojawia się dopiero, gdy kampania jest w toku, wstrzymana lub zakończona).

PoleTypOpis
idintegerSurowy numeryczny identyfikator kampanii.
account_idintegerIdentyfikator konta będącego właścicielem.
namestringAutomatycznie wygenerowana nazwa: "<Template name> - YYYY-MM-DD HH:MM:SS" (z numerycznym sufiksem w razie kolizji).
statestringStan cyklu życia — draft natychmiast po wdrożeniu. Jedna z wartości draft, in_progress, paused, cancelled, done, scheduled.
delivery_modestring | nullimmediate, scheduled lub staggered (nie ustawiane przy wdrożeniu).
delivery_scheduleobject | nullKonfiguracja harmonogramu dostarczania (nie ustawiana przy wdrożeniu).
created_atstring (ISO 8601)Znacznik czasu utworzenia.
updated_atstring (ISO 8601)Znacznik czasu ostatniej aktualizacji.
email_subjectstring | nullSkopiowane z szablonu.
email_contentstring | nullSkopiowane z szablonu.
landing_htmlstring | nullSkopiowane z szablonu.
domainstring | nullNazwa domeny platformy wysyłkowej/docelowej (automatycznie wybrana spośród dostępnych domen konta, może być null).
course_idinteger | nullIdentyfikator powiązanego kursu (kurs szablonu lub domyślny kurs konta).
groupsarrayGrupy kontaktów w kampanii — puste tuż po wdrożeniu. Każda: id, name.
can_startbooleanCzy kampania może przejść do uruchomienia.
can_pausebooleanCzy kampania może zostać wstrzymana.
can_cancelbooleanCzy kampania może zostać anulowana.
{
"id": 512,
"account_id": 11,
"name": "Unpaid Invoice Reminder - 2026-06-02 14:30:07",
"state": "draft",
"delivery_mode": null,
"delivery_schedule": null,
"created_at": "2026-06-02T14:30:07.000Z",
"updated_at": "2026-06-02T14:30:07.000Z",
"email_subject": "Action required: invoice #44021 is overdue",
"email_content": "<html><body><p>Dear {{first_name}}…</p></body></html>",
"landing_html": "<form action=\"#\">…</form>",
"domain": "officelogin.in",
"course_id": null,
"groups": [],
"can_start": false,
"can_pause": false,
"can_cancel": false
}

Kody statusu

KodKiedy
201Kampania utworzona z szablonu.
403Szablon jest wersją roboczą (wersji roboczych nie można wdrażać) lub nie jest widoczny dla użytkownika tokenu. Treść: {"error":"You are not authorized to perform this action"}.
404Żaden szablon nie pasuje do id, lub account_id w treści żądania nie jest kontem, do którego należy użytkownik tokenu. Treść: {"error":"Resource not found"} (szablon) / {"error":"Account not found"} (konto).
422quick_launch=true, ale konto nie ma aktywnej domeny wysyłkowej ("Quick launch needs an active sending domain for this account.") lub nie ma kontaktów ("Quick launch needs at least one contact in the account."). Treść: {"error":"<message>"}.

Odbiorcy to pracownicy, których obierasz za cel symulacji phishingowych; grupy to nazwane zbiory służące do zawężania kampanii. Oba zasoby są ograniczone do konta: akcje kolekcji są zagnieżdżone pod /accounts/:account_id/…, natomiast odczyty/zapisy na pojedynczym rekordzie korzystają z płytkich ścieżek /contacts/:id i /groups/:id. Członkostwo w koncie jest wymagane dla każdego punktu końcowego — wszystkie sprawdzenia uprawnień przechodzą dla dowolnego członka konta (zarówno odczyt, jak i zapis), więc nie ma tu rozróżnienia admin/edytor. Jedynym ograniczeniem zapisu jest to, że grupa biorąca udział w aktywnej kampanii (in_progress lub paused) jest zablokowana i nie można jej zaktualizować, usunąć ani zmienić jej członkostwa.

Zwraca listę wszystkich odbiorców w koncie, posortowanych według nazwiska, a następnie imienia, z grupami każdego odbiorcy umieszczonymi w treści. Użyj go do stronicowania lub synchronizacji listy. Uwierzytelnianie: Bearer; rola: odczyt (dowolna rola).

Parametry

NazwaGdzieTypWymaganeOpis
account_idpathstringtakIdentyfikator konta (acct_… lub liczba całkowita).

Żądanie

Okno terminala
curl -H "Authorization: Bearer $TOKEN" \
https://platform.phishspot.com/api/v1/accounts/11/contacts

Odpowiedź 200 OK — tablica JSON obiektów odbiorców (zobacz pola odbiorcy poniżej).

PoleTypOpis
idintegerKlucz główny odbiorcy.
account_idintegerIdentyfikator konta będącego właścicielem.
first_namestringImię.
last_namestring|nullNazwisko.
emailstringAdres e-mail (unikalny w obrębie konta).
telephonestring|nullNumer telefonu.
created_atstringZnacznik czasu ISO 8601.
updated_atstringZnacznik czasu ISO 8601.
full_namestringWygodne: "first_name last_name" po przycięciu.
groupsarrayGrupy, do których należy ten odbiorca; każda { id, name }.
groups[].idintegerIdentyfikator grupy.
groups[].namestringNazwa grupy (znormalizowana, snake_case dla grup ręcznych).
[
{
"id": 501,
"account_id": 11,
"first_name": "Ada",
"last_name": "Kowalska",
"email": "ada.kowalska@example.com",
"telephone": "+48 600 123 456",
"created_at": "2026-05-01T09:30:00.000Z",
"updated_at": "2026-05-12T14:02:11.000Z",
"full_name": "Ada Kowalska",
"groups": [
{ "id": 90, "name": "finance" }
]
}
]

Kody statusu

KodKiedy
200Zwrócono odbiorców (być może pustą tablicę).
404account_id nie jest kontem, do którego należy użytkownik tokenu.

Tworzy pojedynczego odbiorcę w koncie. Do masowego ładowania użyj zamiast tego punktu końcowego importu. Uwierzytelnianie: Bearer; rola: odczyt (dowolna rola).

Parametry

Parametry treści żądania są opakowane w obiekt contact.

NazwaGdzieTypWymaganeOpis
account_idpathstringtakIdentyfikator konta (acct_… lub liczba całkowita).
first_namebodystringtakImię (maks. 255). Wymagane przez model.
emailbodystringtakAdres e-mail. Musi odpowiadać standardowemu formatowi e-mail i być unikalny w obrębie konta (bez rozróżniania wielkości liter). Maks. 255.
last_namebodystringnieNazwisko (maks. 255).
telephonebodystringnieNumer telefonu (maks. 50). Musi odpowiadać formatom typu +CC (NNN) NNN-NNNN; dozwolona wartość pusta.
group_idsbodyarraynieTablica identyfikatorów grup, do których odbiorca ma zostać dołączony przy tworzeniu.

Żądanie

Okno terminala
curl -X POST -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{ "contact": { "first_name": "Ada", "last_name": "Kowalska", "email": "ada.kowalska@example.com", "telephone": "+48 600 123 456", "group_ids": [90] } }' \
https://platform.phishspot.com/api/v1/accounts/11/contacts

Odpowiedź 201 Created — utworzony odbiorca, z tymi samymi polami co punkt końcowy listy powyżej.

{
"id": 501,
"account_id": 11,
"first_name": "Ada",
"last_name": "Kowalska",
"email": "ada.kowalska@example.com",
"telephone": "+48 600 123 456",
"created_at": "2026-05-01T09:30:00.000Z",
"updated_at": "2026-05-01T09:30:00.000Z",
"full_name": "Ada Kowalska",
"groups": [
{ "id": 90, "name": "finance" }
]
}

Kody statusu

KodKiedy
201Odbiorca utworzony.
400W treści brakuje klucza najwyższego poziomu contact.
404account_id nie jest kontem, do którego należy użytkownik tokenu.
422Walidacja nie powiodła się (np. brak first_name, brakujący/nieprawidłowy email lub zduplikowany adres e-mail w obrębie konta). Treść to { "errors": { … } }.

Masowo importuje odbiorców do konta z pliku CSV. Istniejący odbiorcy (dopasowani po adresie e-mail) są aktualizowani niepustymi wartościami; nowi są tworzeni; grupy nazwane w danych są tworzone, a powiązania są ustanawiane. Podaj albo surowy tekst CSV w csv, albo tablicę JSON w contacts — tablica jest konwertowana na CSV po stronie serwera przy użyciu kanonicznej kolejności nagłówków. Uwierzytelnianie: Bearer; rola: odczyt (dowolna rola).

Kanoniczna kolejność nagłówków CSV to: first_name, last_name, email, telephone, groups, department, title, location. W kolumnie groups wiele grup rozdziela się znakiem | (pionowa kreska). Przy korzystaniu z formy JSON contacts pole groups każdego wiersza może być tablicą (np. ["finance","exec"]), która jest automatycznie łączona znakiem |.

Parametry

NazwaGdzieTypWymaganeOpis
account_idpathstringtakIdentyfikator konta (acct_… lub liczba całkowita).
csvbodystringwarunkowoSurowy tekst CSV z kanonicznym wierszem nagłówka. Wymagane, jeśli pominięto contacts. Ma pierwszeństwo, jeśli podano oba.
contactsbodyarraywarunkowoTablica obiektów wierszy z kluczami zgodnymi z kanonicznymi nagłówkami. Wymagane, jeśli pominięto csv. Pole groups każdego wiersza może być ciągiem znaków lub tablicą nazw grup.

Żądanie

Okno terminala
curl -X POST -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{ "contacts": [
{ "first_name": "Ada", "last_name": "Kowalska", "email": "ada.kowalska@example.com", "telephone": "+48600123456", "groups": ["finance"], "department": "Finance", "title": "Analyst", "location": "Warsaw" },
{ "first_name": "Jan", "email": "jan.nowak@example.com", "groups": ["finance", "exec"] }
] }' \
https://platform.phishspot.com/api/v1/accounts/11/contacts/import

Odpowiedź 200 OK — podsumowanie sposobu przetworzenia wierszy.

PoleTypOpis
createdintegerLiczba wstawionych nowych odbiorców.
updatedintegerLiczba istniejących odbiorców (dopasowanych po adresie e-mail) zaktualizowanych nowymi niepustymi wartościami.
failedintegerLiczba wierszy odrzuconych jako nieprawidłowe. (Do konta dołączany jest możliwy do pobrania raport CSV z nieudanymi wierszami.)
{
"created": 1,
"updated": 1,
"failed": 0
}

Kody statusu

KodKiedy
200Import wykonany; zwraca podsumowanie {created, updated, failed}.
404account_id nie jest kontem, do którego należy użytkownik tokenu.
422Nie podano ani csv, ani contacts. Treść to { "error": "Provide either csv or contacts." }.

Pobiera pojedynczego odbiorcę po identyfikatorze, ograniczonego do kont użytkownika tokenu. Użyj go do odczytania jednego odbiorcy bez wyświetlania całego konta. Uwierzytelnianie: Bearer; rola: odczyt (dowolna rola).

Parametry

NazwaGdzieTypWymaganeOpis
idpathstringtakIdentyfikator odbiorcy (cont_… lub liczba całkowita).

Brak parametrów poza tokenem bearer i identyfikatorem ścieżki.

Żądanie

Okno terminala
curl -H "Authorization: Bearer $TOKEN" \
https://platform.phishspot.com/api/v1/contacts/cont_abc123

Odpowiedź 200 OK — odbiorca, z tymi samymi polami co punkt końcowy listy.

{
"id": 501,
"account_id": 11,
"first_name": "Ada",
"last_name": "Kowalska",
"email": "ada.kowalska@example.com",
"telephone": "+48 600 123 456",
"created_at": "2026-05-01T09:30:00.000Z",
"updated_at": "2026-05-12T14:02:11.000Z",
"full_name": "Ada Kowalska",
"groups": [
{ "id": 90, "name": "finance" }
]
}

Kody statusu

KodKiedy
200Odbiorca znaleziony.
404Brak odbiorcy o tym identyfikatorze w jakimkolwiek koncie, do którego należy użytkownik tokenu.

Aktualizuje pojedynczego odbiorcę. Wyślij tylko te pola, które chcesz zmienić, opakowane w obiekt contact. Uwierzytelnianie: Bearer; rola: odczyt (dowolna rola).

Parametry

Parametry treści żądania są opakowane w obiekt contact.

NazwaGdzieTypWymaganeOpis
idpathstringtakIdentyfikator odbiorcy (cont_… lub liczba całkowita).
first_namebodystringnieImię (maks. 255). Nie można wyczyścić do wartości pustej — jest wymagane.
last_namebodystringnieNazwisko (maks. 255).
emailbodystringnieAdres e-mail. Musi pozostać prawidłowy i unikalny w obrębie konta (bez rozróżniania wielkości liter). Maks. 255.
telephonebodystringnieNumer telefonu (maks. 50, walidowany formatowo; dozwolona wartość pusta).
group_idsbodyarraynieZastępuje członkostwo grupowe odbiorcy dokładnie tym zestawem identyfikatorów grup.

Żądanie

Okno terminala
curl -X PATCH -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{ "contact": { "title": "Senior Analyst", "group_ids": [90, 91] } }' \
https://platform.phishspot.com/api/v1/contacts/cont_abc123

Odpowiedź 200 OK — zaktualizowany odbiorca, z tymi samymi polami co punkt końcowy listy.

{
"id": 501,
"account_id": 11,
"first_name": "Ada",
"last_name": "Kowalska",
"email": "ada.kowalska@example.com",
"telephone": "+48 600 123 456",
"created_at": "2026-05-01T09:30:00.000Z",
"updated_at": "2026-05-20T08:15:00.000Z",
"full_name": "Ada Kowalska",
"groups": [
{ "id": 90, "name": "finance" },
{ "id": 91, "name": "exec" }
]
}

Kody statusu

KodKiedy
200Odbiorca zaktualizowany.
400W treści brakuje klucza najwyższego poziomu contact.
404Brak odbiorcy o tym identyfikatorze w jakimkolwiek koncie, do którego należy użytkownik tokenu.
422Walidacja nie powiodła się (pusty first_name, nieprawidłowy/zduplikowany email, błędny format telephone). Treść to { "errors": { … } }.

Trwale usuwa odbiorcę oraz jego członkostwa w grupach, dostarczalne elementy, zdarzenia i wyniki. Uwierzytelnianie: Bearer; rola: odczyt (dowolna rola).

Parametry

NazwaGdzieTypWymaganeOpis
idpathstringtakIdentyfikator odbiorcy (cont_… lub liczba całkowita).

Brak parametrów poza tokenem bearer i identyfikatorem ścieżki.

Żądanie

Okno terminala
curl -X DELETE -H "Authorization: Bearer $TOKEN" \
https://platform.phishspot.com/api/v1/contacts/cont_abc123

Odpowiedź 204 No Content — pusta treść.

Kody statusu

KodKiedy
204Odbiorca usunięty.
404Brak odbiorcy o tym identyfikatorze w jakimkolwiek koncie, do którego należy użytkownik tokenu.

Zwraca listę wszystkich grup w koncie, posortowanych według nazwy, z odbiorcami każdej grupy umieszczonymi w treści. Uwierzytelnianie: Bearer; rola: odczyt (dowolna rola).

Parametry

NazwaGdzieTypWymaganeOpis
account_idpathstringtakIdentyfikator konta (acct_… lub liczba całkowita).

Odpowiedź 200 OK — tablica JSON obiektów grup (zobacz pola grupy poniżej).

PoleTypOpis
idintegerKlucz główny grupy.
account_idintegerIdentyfikator konta będącego właścicielem.
namestringNazwa grupy. Dla grup ręcznych jest ona normalizowana do snake_case (spacje → podkreślenia, znaki niealfanumeryczne usuwane, małe litery).
contact_countintegerZbuforowana liczba odbiorców w grupie.
created_atstringZnacznik czasu ISO 8601.
updated_atstringZnacznik czasu ISO 8601.
contactsarrayCzłonkowie grupy.
contacts[].idintegerIdentyfikator odbiorcy.
contacts[].emailstringAdres e-mail odbiorcy.
contacts[].first_namestringImię odbiorcy.
contacts[].last_namestring|nullNazwisko odbiorcy.
contacts[].full_namestring"first_name last_name" po przycięciu.
[
{
"id": 90,
"account_id": 11,
"name": "finance",
"contact_count": 2,
"created_at": "2026-04-10T11:00:00.000Z",
"updated_at": "2026-05-20T08:15:00.000Z",
"contacts": [
{ "id": 501, "email": "ada.kowalska@example.com", "first_name": "Ada", "last_name": "Kowalska", "full_name": "Ada Kowalska" }
]
}
]

Kody statusu

KodKiedy
200Zwrócono grupy (być może pustą tablicę).
404account_id nie jest kontem, do którego należy użytkownik tokenu.

Tworzy grupę w koncie. Nazwy grup ręcznych są normalizowane do snake_case po stronie serwera. Uwierzytelnianie: Bearer; rola: odczyt (dowolna rola).

Parametry

Parametry treści żądania są opakowane w obiekt group.

NazwaGdzieTypWymaganeOpis
account_idpathstringtakIdentyfikator konta (acct_… lub liczba całkowita).
namebodystringtakNazwa grupy (maks. 255). Normalizowana do snake_case; musi być unikalna w obrębie konta (bez rozróżniania wielkości liter, porównywana po normalizacji).
descriptionbodystringnieDowolny opis tekstowy. Dozwolony przez kontroler (model nie ma kolumny description, więc jest akceptowany, ale nieutrwalany/niezwracany).
contact_idsbodyarraynieTablica identyfikatorów odbiorców do dodania jako członkowie przy tworzeniu.

Żądanie

Okno terminala
curl -X POST -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{ "group": { "name": "Finance Team", "contact_ids": [501, 502] } }' \
https://platform.phishspot.com/api/v1/accounts/11/groups

Odpowiedź 201 Created — utworzona grupa, z tymi samymi polami co punkt końcowy listy powyżej. Zwróć uwagę, że "Finance Team" jest zapisywane i zwracane jako "finance_team".

{
"id": 90,
"account_id": 11,
"name": "finance_team",
"contact_count": 2,
"created_at": "2026-04-10T11:00:00.000Z",
"updated_at": "2026-04-10T11:00:00.000Z",
"contacts": [
{ "id": 501, "email": "ada.kowalska@example.com", "first_name": "Ada", "last_name": "Kowalska", "full_name": "Ada Kowalska" },
{ "id": 502, "email": "jan.nowak@example.com", "first_name": "Jan", "last_name": "Nowak", "full_name": "Jan Nowak" }
]
}

Kody statusu

KodKiedy
201Grupa utworzona.
400W treści brakuje klucza najwyższego poziomu group.
404account_id nie jest kontem, do którego należy użytkownik tokenu.
422Walidacja nie powiodła się (pusta name lub nazwa, która po normalizacji jest duplikatem w obrębie konta). Treść to { "errors": { … } }.

Pobiera pojedynczą grupę po identyfikatorze, ograniczoną do kont użytkownika tokenu. Uwierzytelnianie: Bearer; rola: odczyt (dowolna rola).

Parametry

NazwaGdzieTypWymaganeOpis
idpathstringtakIdentyfikator grupy (grp_… lub liczba całkowita).

Brak parametrów poza tokenem bearer i identyfikatorem ścieżki.

Żądanie

Okno terminala
curl -H "Authorization: Bearer $TOKEN" \
https://platform.phishspot.com/api/v1/groups/grp_xyz789

Odpowiedź 200 OK — grupa, z tymi samymi polami co punkt końcowy listy.

{
"id": 90,
"account_id": 11,
"name": "finance",
"contact_count": 1,
"created_at": "2026-04-10T11:00:00.000Z",
"updated_at": "2026-05-20T08:15:00.000Z",
"contacts": [
{ "id": 501, "email": "ada.kowalska@example.com", "first_name": "Ada", "last_name": "Kowalska", "full_name": "Ada Kowalska" }
]
}

Kody statusu

KodKiedy
200Grupa znaleziona.
404Brak grupy o tym identyfikatorze w jakimkolwiek koncie, do którego należy użytkownik tokenu.

Aktualizuje nazwę grupy (i opcjonalnie zastępuje jej członkostwo). Zablokowane, jeśli grupa jest zablokowana przez aktywną kampanię. Uwierzytelnianie: Bearer; rola: odczyt (dowolna rola).

Parametry

Parametry treści żądania są opakowane w obiekt group.

NazwaGdzieTypWymaganeOpis
idpathstringtakIdentyfikator grupy (grp_… lub liczba całkowita).
namebodystringnieNowa nazwa grupy (maks. 255). Normalizowana do snake_case; musi pozostać unikalna w obrębie konta.
descriptionbodystringnieAkceptowana, ale nieutrwalana (brak kolumny w modelu).
contact_idsbodyarraynieZastępuje członkostwo grupy dokładnie tym zestawem identyfikatorów odbiorców.

Żądanie

Okno terminala
curl -X PATCH -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{ "group": { "name": "Finance and Ops", "contact_ids": [501, 503] } }' \
https://platform.phishspot.com/api/v1/groups/grp_xyz789

Odpowiedź 200 OK — zaktualizowana grupa, z tymi samymi polami co punkt końcowy listy.

{
"id": 90,
"account_id": 11,
"name": "finance_and_ops",
"contact_count": 2,
"created_at": "2026-04-10T11:00:00.000Z",
"updated_at": "2026-05-21T10:00:00.000Z",
"contacts": [
{ "id": 501, "email": "ada.kowalska@example.com", "first_name": "Ada", "last_name": "Kowalska", "full_name": "Ada Kowalska" },
{ "id": 503, "email": "ola.wisniewska@example.com", "first_name": "Ola", "last_name": "Wisniewska", "full_name": "Ola Wisniewska" }
]
}

Kody statusu

KodKiedy
200Grupa zaktualizowana.
400W treści brakuje klucza najwyższego poziomu group.
403Grupa jest zablokowana (używana w kampanii in_progress/paused), więc nie można jej zmodyfikować.
404Brak grupy o tym identyfikatorze w jakimkolwiek koncie, do którego należy użytkownik tokenu.
422Walidacja nie powiodła się (pusta name lub nazwa, która po normalizacji jest duplikatem). Treść to { "errors": { … } }.

Trwale usuwa grupę oraz jej powiązania odbiorca-grupa / kampania-grupa (sami odbiorcy nie są usuwani). Zablokowane, jeśli grupa jest zablokowana przez aktywną kampanię. Uwierzytelnianie: Bearer; rola: odczyt (dowolna rola).

Parametry

NazwaGdzieTypWymaganeOpis
idpathstringtakIdentyfikator grupy (grp_… lub liczba całkowita).

Brak parametrów poza tokenem bearer i identyfikatorem ścieżki.

Żądanie

Okno terminala
curl -X DELETE -H "Authorization: Bearer $TOKEN" \
https://platform.phishspot.com/api/v1/groups/grp_xyz789

Odpowiedź 204 No Content — pusta treść.

Kody statusu

KodKiedy
204Grupa usunięta.
403Grupa jest zablokowana (używana w kampanii in_progress/paused), więc nie można jej usunąć.
404Brak grupy o tym identyfikatorze w jakimkolwiek koncie, do którego należy użytkownik tokenu.

Dodaje jednego lub więcej odbiorców do grupy. Identyfikatory odbiorców są rozwiązywane względem własnego konta grupy — identyfikatory należące do innego konta lub nieistniejące są po cichu odrzucane. Odbiorcy już znajdujący się w grupie są pomijani. Zablokowane, jeśli grupa jest zablokowana. Uwierzytelnianie: Bearer; rola: odczyt (dowolna rola).

Parametry

NazwaGdzieTypWymaganeOpis
idpathstringtakIdentyfikator grupy (grp_… lub liczba całkowita).
contact_idsbodyarraytakIdentyfikatory odbiorców (cont_… lub liczby całkowite) do dodania. Identyfikatory spoza konta grupy lub nieistniejące są ignorowane.

Żądanie

Okno terminala
curl -X POST -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{ "contact_ids": [501, "cont_def456"] }' \
https://platform.phishspot.com/api/v1/groups/grp_xyz789/add_contacts

Odpowiedź 200 OK — zaktualizowana grupa (po przeładowaniu), z tymi samymi polami co punkt końcowy listy. Odpowiedź nie zawiera osobnej liczby dodanych elementów; porównaj contact_count / contacts przed i po.

{
"id": 90,
"account_id": 11,
"name": "finance",
"contact_count": 2,
"created_at": "2026-04-10T11:00:00.000Z",
"updated_at": "2026-05-22T09:00:00.000Z",
"contacts": [
{ "id": 501, "email": "ada.kowalska@example.com", "first_name": "Ada", "last_name": "Kowalska", "full_name": "Ada Kowalska" },
{ "id": 540, "email": "marek.zielinski@example.com", "first_name": "Marek", "last_name": "Zielinski", "full_name": "Marek Zielinski" }
]
}

Kody statusu

KodKiedy
200Zwraca zaktualizowaną grupę (nawet jeśli każdy podany identyfikator został odrzucony/już był obecny — po prostu nic się nie zmieni).
403Grupa jest zablokowana (używana w kampanii in_progress/paused).
404Brak grupy o tym identyfikatorze w jakimkolwiek koncie, do którego należy użytkownik tokenu.

Usuwa jednego lub więcej odbiorców z grupy. Identyfikatory odbiorców są rozwiązywane względem konta grupy; identyfikatory spoza grupy (lub spoza konta) są ignorowane. Zablokowane, jeśli grupa jest zablokowana. Uwierzytelnianie: Bearer; rola: odczyt (dowolna rola).

Parametry

NazwaGdzieTypWymaganeOpis
idpathstringtakIdentyfikator grupy (grp_… lub liczba całkowita).
contact_idsbodyarraytakIdentyfikatory odbiorców (cont_… lub liczby całkowite) do usunięcia z grupy.

Żądanie

Okno terminala
curl -X DELETE -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{ "contact_ids": [540] }' \
https://platform.phishspot.com/api/v1/groups/grp_xyz789/remove_contacts

Odpowiedź 200 OK — zaktualizowana grupa (po przeładowaniu), z tymi samymi polami co punkt końcowy listy.

{
"id": 90,
"account_id": 11,
"name": "finance",
"contact_count": 1,
"created_at": "2026-04-10T11:00:00.000Z",
"updated_at": "2026-05-22T09:10:00.000Z",
"contacts": [
{ "id": 501, "email": "ada.kowalska@example.com", "first_name": "Ada", "last_name": "Kowalska", "full_name": "Ada Kowalska" }
]
}

Kody statusu

KodKiedy
200Zwraca zaktualizowaną grupę (identyfikatory spoza grupy są po prostu ignorowane).
403Grupa jest zablokowana (używana w kampanii in_progress/paused).
404Brak grupy o tym identyfikatorze w jakimkolwiek koncie, do którego należy użytkownik tokenu.

Te trzy zasoby rejestrują telemetrię kampanii per odbiorca. Dostarczenie (deliverable) to powiązanie kampanii z kontaktem (jeden wiersz na odbiorcę) i śledzi jego pozycję w lejku zaangażowania poprzez state. Zdarzenie (event) to w zasadzie niezmienny wpis na osi czasu (sent, opened, clicked, …) identyfikowany przez genre. Wynik (result) przechowuje odpowiedź/punktację kontaktu dla pojedynczego bloku block szkolenia e-learning.

Wszystkie punkty końcowe w tej sekcji autoryzują za pomocą polityki Pundit danego zasobu, która zezwala każdemu członkowi zespołu (każdej roli) na odczyt, tworzenie, aktualizację i usuwanie. Nie ma bramki admin/edytor. Listowanie i tworzenie są zagnieżdżone w koncie (/accounts/:account_id/…); show/update/destroy są płytkie (/deliverables/:id itd.) i ograniczone do kont, do których należy użytkownik tokena — żądanie rekordu spoza tych kont zwraca 404, nigdy danych innego najemcy.

Listuje wszystkie dostarczenia dla konta, od najnowszych, opcjonalnie ograniczone do jednej kampanii. Użyj go, aby pobrać listę odbiorców i stan lejka kampanii. Uwierzytelnianie: Bearer; rola: odczyt (każda rola).

Parametry

NazwaGdzieTypWymaganeOpis
account_idpathstringtakIdentyfikator konta (acct_… lub liczba całkowita).
campaign_idquerystringnieOgraniczenie do jednej kampanii (camp_… lub liczba całkowita). Po pominięciu zwracane są wszystkie dostarczenia dla konta.

Żądanie

Okno terminala
curl -H "Authorization: Bearer $TOKEN" \
"https://platform.phishspot.com/api/v1/accounts/11/deliverables?campaign_id=42"

Odpowiedź 200 OK — tablica JSON obiektów dostarczenia.

PoleTypOpis
idintegerIdentyfikator dostarczenia.
campaign_idintegerKampania będąca właścicielem.
contact_idintegerKontakt będący celem.
statestringStan lejka (zobacz enum poniżej).
user_agentstring | nullUser-agent przechwycony przy otwarciu/kliknięciu, jeśli istnieje.
ip_addressstring | nullAdres IP przechwycony przy otwarciu/kliknięciu, jeśli istnieje.
created_atstringZnacznik czasu ISO 8601.
updated_atstringZnacznik czasu ISO 8601.
campaignobject | nullObecne, gdy kampania się załaduje: { id, name, account_id }.
contactobject | nullObecne, gdy kontakt się załaduje: { id, email, first_name, last_name, full_name }.
eventsarrayObecne tylko wtedy, gdy kontakt ma zdarzenia w tej kampanii; każdy element to { id, genre, created_at }.

state przyjmuje jedną z wartości: pending (jeszcze niewysłane), sent, delivered, bounced, opened, clicked, submitted (dane wprowadzone na stronie docelowej), educated (ukończono szkolenie).

[
{
"id": 5012,
"campaign_id": 42,
"contact_id": 880,
"state": "clicked",
"user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)",
"ip_address": "203.0.113.7",
"created_at": "2026-05-30T09:12:44.000Z",
"updated_at": "2026-05-30T10:01:08.000Z",
"campaign": { "id": 42, "name": "Q2 Invoice Lure", "account_id": 11 },
"contact": { "id": 880, "email": "jan.kowalski@acme.test", "first_name": "Jan", "last_name": "Kowalski", "full_name": "Jan Kowalski" },
"events": [
{ "id": 9001, "genre": "sent", "created_at": "2026-05-30T09:12:44.000Z" },
{ "id": 9044, "genre": "opened", "created_at": "2026-05-30T09:58:21.000Z" },
{ "id": 9051, "genre": "clicked", "created_at": "2026-05-30T10:01:08.000Z" }
]
}
]

Kody statusu

KodKiedy
200Zwrócono dostarczenia.
403Użytkownik tokena nie jest uprawniony do wyświetlenia konta (account.show? odmówiono).
404account_id nie należy do użytkownika tokena.

Tworzy dostarczenie, łącząc kontakt z kampanią. account_id jest pobierane automatycznie z kampanii (podany segment ścieżki account_id wybiera kontekst konta). Uwierzytelnianie: Bearer; rola: odczyt (każda rola).

Parametry

Wszystkie parametry treści żądania są opakowane w obiekt deliverable.

NazwaGdzieTypWymaganeOpis
account_idpathstringtakIdentyfikator konta (acct_… lub liczba całkowita).
deliverable.campaign_idbodyintegertakKampania, do której ma zostać dołączone. Walidowane presence.
deliverable.contact_idbodyintegertakKontakt będący celem. Walidowane presence.
deliverable.statebodystringnieStan lejka; domyślnie pending. Jedna z wartości enuma state. Walidowane presence.
deliverable.namebodystringnieAkceptowane przez strong params, ale niezapisywane (brak kolumny name).

Żądanie

Okno terminala
curl -X POST -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{ "deliverable": { "campaign_id": 42, "contact_id": 880, "state": "pending" } }' \
https://platform.phishspot.com/api/v1/accounts/11/deliverables

Odpowiedź 201 Created — utworzone dostarczenie (taki sam kształt jak obiekt show/index powyżej).

{
"id": 5099,
"campaign_id": 42,
"contact_id": 880,
"state": "pending",
"user_agent": null,
"ip_address": null,
"created_at": "2026-06-02T08:00:00.000Z",
"updated_at": "2026-06-02T08:00:00.000Z",
"campaign": { "id": 42, "name": "Q2 Invoice Lure", "account_id": 11 },
"contact": { "id": 880, "email": "jan.kowalski@acme.test", "first_name": "Jan", "last_name": "Kowalski", "full_name": "Jan Kowalski" }
}

Kody statusu

KodKiedy
201Utworzono dostarczenie.
404account_id nie należy do użytkownika tokena.
422Walidacja nie powiodła się (brak campaign_id/contact_id/state lub nieprawidłowa wartość state). Treść: { "errors": { … } }.

Pobiera pojedyncze dostarczenie wraz z jego kampanią, kontaktem i osią czasu zdarzeń. Uwierzytelnianie: Bearer; rola: odczyt (każda rola).

Parametry

NazwaGdzieTypWymaganeOpis
idpathstringtakIdentyfikator dostarczenia (delv_… lub liczba całkowita).

Żądanie

Okno terminala
curl -H "Authorization: Bearer $TOKEN" \
https://platform.phishspot.com/api/v1/deliverables/5012

Odpowiedź 200 OK — pojedynczy obiekt dostarczenia (te same pola co element listy powyżej).

{
"id": 5012,
"campaign_id": 42,
"contact_id": 880,
"state": "clicked",
"user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)",
"ip_address": "203.0.113.7",
"created_at": "2026-05-30T09:12:44.000Z",
"updated_at": "2026-05-30T10:01:08.000Z",
"campaign": { "id": 42, "name": "Q2 Invoice Lure", "account_id": 11 },
"contact": { "id": 880, "email": "jan.kowalski@acme.test", "first_name": "Jan", "last_name": "Kowalski", "full_name": "Jan Kowalski" },
"events": [
{ "id": 9001, "genre": "sent", "created_at": "2026-05-30T09:12:44.000Z" }
]
}

Kody statusu

KodKiedy
200Zwrócono dostarczenie.
404Brak dostarczenia o tym identyfikatorze w koncie, do którego należy użytkownik tokena.

Aktualizuje dostarczenie — zazwyczaj w celu przesunięcia jego state lub ponownego powiązania kampanii/kontaktu. Uwierzytelnianie: Bearer; rola: odczyt (każda rola).

Parametry

Parametry treści żądania są opakowane w obiekt deliverable; wyślij tylko te pola, które chcesz zmienić.

NazwaGdzieTypWymaganeOpis
idpathstringtakIdentyfikator dostarczenia (delv_… lub liczba całkowita).
deliverable.statebodystringnieNowy stan lejka (jedna z wartości enuma state).
deliverable.campaign_idbodyintegernieZmiana przypisania kampanii (presence nadal wymuszane — nie można wyczyścić).
deliverable.contact_idbodyintegernieZmiana przypisania kontaktu (presence nadal wymuszane).
deliverable.namebodystringnieAkceptowane, ale niezapisywane (brak kolumny).

Żądanie

Okno terminala
curl -X PATCH -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{ "deliverable": { "state": "submitted" } }' \
https://platform.phishspot.com/api/v1/deliverables/5012

Odpowiedź 200 OK — zaktualizowany obiekt dostarczenia (taki sam kształt jak show).

Kody statusu

KodKiedy
200Zaktualizowano dostarczenie.
404Brak dostarczenia o tym identyfikatorze w koncie, do którego należy użytkownik tokena.
422Walidacja nie powiodła się (np. nieprawidłowy state lub wyczyszczony campaign_id/contact_id). Treść: { "errors": { … } }.

Trwale usuwa dostarczenie (oraz zależne campaign_replies). Uwierzytelnianie: Bearer; rola: odczyt (każda rola).

Brak parametrów poza tokenem bearer i identyfikatorem w ścieżce.

Żądanie

Okno terminala
curl -X DELETE -H "Authorization: Bearer $TOKEN" \
https://platform.phishspot.com/api/v1/deliverables/5012

Odpowiedź 204 No Content — pusta treść po sukcesie.

Kody statusu

KodKiedy
204Usunięto dostarczenie.
404Brak dostarczenia o tym identyfikatorze w koncie, do którego należy użytkownik tokena.

Listuje zdarzenia konta od najnowszych, z opcjonalnym filtrowaniem według kampanii, kontaktu i rodzaju (genre). Użyj go, aby zrekonstruować oś czasu zaangażowania. Uwierzytelnianie: Bearer; rola: odczyt (każda rola).

Parametry

NazwaGdzieTypWymaganeOpis
account_idpathstringtakIdentyfikator konta (acct_… lub liczba całkowita).
campaign_idquerystringnieOgraniczenie do jednej kampanii (camp_… lub liczba całkowita).
contact_idquerystringnieOgraniczenie do jednego kontaktu (cont_… lub liczba całkowita).
genrequerystringnieOgraniczenie do jednego rodzaju (zobacz enum poniżej).

genre przyjmuje jedną z wartości: sent, delivered, bounced, opened, clicked, submitted_data (dane przesłane na stronie docelowej), started_training, completed_training, failed_quiz, passed_quiz, replied (odbiorca odpowiedział na e-mail phishingowy).

Żądanie

Okno terminala
curl -H "Authorization: Bearer $TOKEN" \
"https://platform.phishspot.com/api/v1/accounts/11/events?campaign_id=42&genre=clicked"

Odpowiedź 200 OK — tablica JSON obiektów zdarzeń.

PoleTypOpis
idintegerIdentyfikator zdarzenia.
account_idintegerKonto będące właścicielem.
campaign_idintegerKampania, do której należy zdarzenie.
contact_idintegerKontakt, do którego należy zdarzenie.
genrestringRodzaj zdarzenia (zobacz enum powyżej).
metadataobjectDowolny JSON (np. ip_address, user_agent, przesłane pola, dane quizu). Domyślnie {}.
created_atstringZnacznik czasu ISO 8601.
updated_atstringZnacznik czasu ISO 8601.
genre_display_namestringCzytelna nazwa rodzaju (np. "Submitted data"); obecne tylko gdy genre jest ustawione.
ip_addressstringWygodna kopia metadata.ip_address; obecne tylko gdy ustawione.
user_agentstringWygodna kopia metadata.user_agent; obecne tylko gdy ustawione.
[
{
"id": 9051,
"account_id": 11,
"campaign_id": 42,
"contact_id": 880,
"genre": "clicked",
"metadata": { "ip_address": "203.0.113.7", "user_agent": "Mozilla/5.0" },
"created_at": "2026-05-30T10:01:08.000Z",
"updated_at": "2026-05-30T10:01:08.000Z",
"genre_display_name": "Clicked",
"ip_address": "203.0.113.7",
"user_agent": "Mozilla/5.0"
}
]

Kody statusu

KodKiedy
200Zwrócono zdarzenia.
404account_id nie należy do użytkownika tokena.

Rejestruje nowe zdarzenie. account zdarzenia jest ustawiane na podstawie konta ze ścieżki, a przy zapisie model nadpisuje je tak, aby pasowało do konta kampanii. Uwierzytelnianie: Bearer; rola: odczyt (każda rola).

Parametry

Parametry treści żądania są opakowane w obiekt event.

NazwaGdzieTypWymaganeOpis
account_idpathstringtakIdentyfikator konta (acct_… lub liczba całkowita).
event.campaign_idbodyintegertakKampania dla tego zdarzenia. Walidowane presence.
event.contact_idbodyintegertakKontakt dla tego zdarzenia. Walidowane presence.
event.genrebodystringnieRodzaj zdarzenia; domyślnie sent. Jedna z wartości enuma genre. Walidowane presence.
event.metadatabodyobjectnieDowolny hash JSON (dozwolony jako metadata: {}). Domyślnie {}.
event.namebodystringnieAkceptowane przez strong params, ale niezapisywane (brak kolumny name).

Żądanie

Okno terminala
curl -X POST -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{ "event": { "campaign_id": 42, "contact_id": 880, "genre": "opened", "metadata": { "ip_address": "203.0.113.7", "user_agent": "Mozilla/5.0" } } }' \
https://platform.phishspot.com/api/v1/accounts/11/events

Odpowiedź 201 Created — utworzony obiekt zdarzenia (taki sam kształt jak element listy powyżej).

{
"id": 9044,
"account_id": 11,
"campaign_id": 42,
"contact_id": 880,
"genre": "opened",
"metadata": { "ip_address": "203.0.113.7", "user_agent": "Mozilla/5.0" },
"created_at": "2026-05-30T09:58:21.000Z",
"updated_at": "2026-05-30T09:58:21.000Z",
"genre_display_name": "Opened",
"ip_address": "203.0.113.7",
"user_agent": "Mozilla/5.0"
}

Kody statusu

KodKiedy
201Utworzono zdarzenie.
404account_id nie należy do użytkownika tokena.
422Walidacja nie powiodła się (brak campaign_id/contact_id/genre lub nieprawidłowy genre). Treść: { "errors": { … } }.

Pobiera pojedyncze zdarzenie. Uwierzytelnianie: Bearer; rola: odczyt (każda rola).

Parametry

NazwaGdzieTypWymaganeOpis
idpathstringtakIdentyfikator zdarzenia (evt_… lub liczba całkowita).

Żądanie

Okno terminala
curl -H "Authorization: Bearer $TOKEN" \
https://platform.phishspot.com/api/v1/events/9044

Odpowiedź 200 OK — pojedynczy obiekt zdarzenia (te same pola co element listy powyżej).

{
"id": 9044,
"account_id": 11,
"campaign_id": 42,
"contact_id": 880,
"genre": "opened",
"metadata": { "ip_address": "203.0.113.7" },
"created_at": "2026-05-30T09:58:21.000Z",
"updated_at": "2026-05-30T09:58:21.000Z",
"genre_display_name": "Opened",
"ip_address": "203.0.113.7"
}

Kody statusu

KodKiedy
200Zwrócono zdarzenie.
404Brak zdarzenia o tym identyfikatorze w koncie, do którego należy użytkownik tokena. Treść: { "error": "Event not found" }.

Aktualizuje rodzaj (genre) lub metadane zdarzenia. Uwierzytelnianie: Bearer; rola: odczyt (każda rola).

Parametry

Parametry treści żądania są opakowane w obiekt event; wyślij tylko te pola, które chcesz zmienić.

NazwaGdzieTypWymaganeOpis
idpathstringtakIdentyfikator zdarzenia (evt_… lub liczba całkowita).
event.genrebodystringnieNowy rodzaj (jedna z wartości enuma genre; presence nadal wymuszane).
event.metadatabodyobjectnieZastępczy hash metadanych.
event.campaign_idbodyintegernieZmiana przypisania kampanii (presence wymuszane).
event.contact_idbodyintegernieZmiana przypisania kontaktu (presence wymuszane).
event.namebodystringnieAkceptowane, ale niezapisywane.

Żądanie

Okno terminala
curl -X PATCH -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{ "event": { "metadata": { "note": "manual correction" } } }' \
https://platform.phishspot.com/api/v1/events/9044

Odpowiedź 200 OK — zaktualizowany obiekt zdarzenia (taki sam kształt jak show).

Kody statusu

KodKiedy
200Zaktualizowano zdarzenie.
404Brak zdarzenia o tym identyfikatorze w koncie, do którego należy użytkownik tokena. Treść: { "error": "Event not found" }.
422Walidacja nie powiodła się (np. nieprawidłowy/pusty genre). Treść: { "errors": { … } }.

Trwale usuwa zdarzenie. Uwierzytelnianie: Bearer; rola: odczyt (każda rola).

Brak parametrów poza tokenem bearer i identyfikatorem w ścieżce.

Żądanie

Okno terminala
curl -X DELETE -H "Authorization: Bearer $TOKEN" \
https://platform.phishspot.com/api/v1/events/9044

Odpowiedź 204 No Content — pusta treść po sukcesie.

Kody statusu

KodKiedy
204Usunięto zdarzenie.
404Brak zdarzenia o tym identyfikatorze w koncie, do którego należy użytkownik tokena. Treść: { "error": "Event not found" }.

Listuje wyniki e-learningu konta od najnowszych. Ten punkt końcowy nie ma filtrów query. Uwierzytelnianie: Bearer; rola: odczyt (każda rola).

Parametry

NazwaGdzieTypWymaganeOpis
account_idpathstringtakIdentyfikator konta (acct_… lub liczba całkowita).

Żądanie

Okno terminala
curl -H "Authorization: Bearer $TOKEN" \
https://platform.phishspot.com/api/v1/accounts/11/results

Odpowiedź 200 OK — tablica JSON obiektów wyników.

PoleTypOpis
idintegerIdentyfikator wyniku.
block_idintegerBlok kursu, którego dotyczy ten wynik.
contact_idintegerKontakt, który wytworzył wynik.
account_idintegerKonto będące właścicielem.
metadataobjectDowolny JSON (np. answer, correct, score, time_spent, completed). Domyślnie {}.
created_atstringZnacznik czasu ISO 8601.
updated_atstringZnacznik czasu ISO 8601.
blockobject | nullObecne, gdy blok się załaduje: { id, name }.
contactobject | nullObecne, gdy kontakt się załaduje: { id, email, first_name, last_name, full_name }.
[
{
"id": 7100,
"block_id": 320,
"contact_id": 880,
"account_id": 11,
"metadata": { "answer": "B", "correct": true, "score": 100, "completed": true },
"created_at": "2026-05-31T14:20:00.000Z",
"updated_at": "2026-05-31T14:20:00.000Z",
"block": { "id": 320, "name": "Spot the Lookalike Domain" },
"contact": { "id": 880, "email": "jan.kowalski@acme.test", "first_name": "Jan", "last_name": "Kowalski", "full_name": "Jan Kowalski" }
}
]

Kody statusu

KodKiedy
200Zwrócono wyniki.
403Użytkownik tokena nie jest uprawniony do wyświetlenia konta (account.show? odmówiono).
404account_id nie należy do użytkownika tokena.

Rejestruje wynik kontaktu dla bloku kursu. account jest pobierane automatycznie z bloku. Uwierzytelnianie: Bearer; rola: odczyt (każda rola).

Parametry

Parametry treści żądania są opakowane w obiekt result.

NazwaGdzieTypWymaganeOpis
account_idpathstringtakIdentyfikator konta (acct_… lub liczba całkowita).
result.block_idbodyintegertakBlok kursu, którego dotyczy ten wynik. Walidowane presence.
result.contact_idbodyintegertakKontakt wytwarzający wynik. Walidowane presence.
result.metadatabodyobjectnieHash JSON z danymi odpowiedzi/punktacji/ukończenia. Domyślnie {}. Dozwolone jako parametr skalarny (:metadata), więc wyślij go jako wartość obiektu JSON.
result.namebodystringnieAkceptowane przez strong params, ale niezapisywane (brak kolumny name).
result.statebodystringnieAkceptowane przez strong params, ale niezapisywane (Result nie ma kolumny/enuma state).

Żądanie

Okno terminala
curl -X POST -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{ "result": { "block_id": 320, "contact_id": 880, "metadata": { "answer": "B", "correct": true, "score": 100, "completed": true } } }' \
https://platform.phishspot.com/api/v1/accounts/11/results

Odpowiedź 201 Created — utworzony obiekt wyniku (taki sam kształt jak element listy powyżej).

{
"id": 7150,
"block_id": 320,
"contact_id": 880,
"account_id": 11,
"metadata": { "answer": "B", "correct": true, "score": 100, "completed": true },
"created_at": "2026-06-02T08:30:00.000Z",
"updated_at": "2026-06-02T08:30:00.000Z",
"block": { "id": 320, "name": "Spot the Lookalike Domain" },
"contact": { "id": 880, "email": "jan.kowalski@acme.test", "first_name": "Jan", "last_name": "Kowalski", "full_name": "Jan Kowalski" }
}

Kody statusu

KodKiedy
201Utworzono wynik.
404account_id nie należy do użytkownika tokena.
422Walidacja nie powiodła się (brak block_id/contact_id). Treść: { "errors": { … } }.

Pobiera pojedynczy wynik. Uwierzytelnianie: Bearer; rola: odczyt (każda rola).

Parametry

NazwaGdzieTypWymaganeOpis
idpathstringtakIdentyfikator wyniku (res_… lub liczba całkowita).

Żądanie

Okno terminala
curl -H "Authorization: Bearer $TOKEN" \
https://platform.phishspot.com/api/v1/results/7100

Odpowiedź 200 OK — pojedynczy obiekt wyniku (te same pola co element listy powyżej).

{
"id": 7100,
"block_id": 320,
"contact_id": 880,
"account_id": 11,
"metadata": { "answer": "B", "correct": true, "score": 100 },
"created_at": "2026-05-31T14:20:00.000Z",
"updated_at": "2026-05-31T14:20:00.000Z",
"block": { "id": 320, "name": "Spot the Lookalike Domain" },
"contact": { "id": 880, "email": "jan.kowalski@acme.test", "first_name": "Jan", "last_name": "Kowalski", "full_name": "Jan Kowalski" }
}

Kody statusu

KodKiedy
200Zwrócono wynik.
404Brak wyniku o tym identyfikatorze w koncie, do którego należy użytkownik tokena.

Aktualizuje wynik, zazwyczaj w celu skorygowania jego metadanych (odpowiedź, punktacja, ukończenie). Uwierzytelnianie: Bearer; rola: odczyt (każda rola).

Parametry

Parametry treści żądania są opakowane w obiekt result; wyślij tylko te pola, które chcesz zmienić.

NazwaGdzieTypWymaganeOpis
idpathstringtakIdentyfikator wyniku (res_… lub liczba całkowita).
result.metadatabodyobjectnieZastępczy hash metadanych.
result.block_idbodyintegernieZmiana przypisania bloku (presence wymuszane).
result.contact_idbodyintegernieZmiana przypisania kontaktu (presence wymuszane).
result.namebodystringnieAkceptowane, ale niezapisywane.
result.statebodystringnieAkceptowane, ale niezapisywane.

Żądanie

Okno terminala
curl -X PATCH -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{ "result": { "metadata": { "answer": "C", "correct": false, "score": 0 } } }' \
https://platform.phishspot.com/api/v1/results/7100

Odpowiedź 200 OK — zaktualizowany obiekt wyniku (taki sam kształt jak show).

Kody statusu

KodKiedy
200Zaktualizowano wynik.
404Brak wyniku o tym identyfikatorze w koncie, do którego należy użytkownik tokena.
422Walidacja nie powiodła się (np. wyczyszczony block_id/contact_id). Treść: { "errors": { … } }.

Trwale usuwa wynik. Uwierzytelnianie: Bearer; rola: odczyt (każda rola).

Brak parametrów poza tokenem bearer i identyfikatorem w ścieżce.

Żądanie

Okno terminala
curl -X DELETE -H "Authorization: Bearer $TOKEN" \
https://platform.phishspot.com/api/v1/results/7100

Odpowiedź 204 No Content — pusta treść po sukcesie.

Kody statusu

KodKiedy
204Usunięto wynik.
404Brak wyniku o tym identyfikatorze w koncie, do którego należy użytkownik tokena.

Zagregowana analityka podatności na phishing dla konta: jeden punkt danych na każdą dostarczoną kampanię w zakresie dat, plus podsumowanie zbiorcze. Oparte na Campaigns::TrendService, który liczy tylko kampanie w stanie in_progress lub done (scope delivered) utworzone w wybranym zakresie.

Zwraca metryki podatności dla dostarczonych kampanii konta, uporządkowane od najstarszych, wraz z podsumowaniem (liczba kampanii, średni współczynnik kliknięć, kierunek trendu oraz grupa odbiorców o najwyższej klikalności). Użyj go, aby zasilić panel trendów lub śledzić, czy pracownicy z czasem coraz lepiej (czy gorzej) rozpoznają phishing. Uwierzytelnianie: Bearer; rola: read (dowolna rola — każdy członek konta).

Parametry

NazwaGdzieTypWymaganeOpis
account_idpathstringtakIdentyfikator konta (acct_… lub liczba całkowita). Musi to być konto, do którego należy użytkownik tokena.
start_datequerystringniePoczątek niestandardowego zakresu, YYYY-MM-DD. Parsowany do początku tego dnia. Jeśli jest obecny (z end_date lub bez), niestandardowy zakres ma pierwszeństwo przed range. Gdy pominięty, ale podano end_date, domyślnie przyjmuje datę sprzed 1 roku.
end_datequerystringnieKoniec niestandardowego zakresu, YYYY-MM-DD. Parsowany do końca tego dnia. Gdy pominięty, ale podano start_date, domyślnie przyjmuje teraz.
rangequerystringniePredefiniowany zakres, używany tylko wtedy, gdy nie podano ani start_date, ani end_date. Jedna z wartości 30d, 90d, 6m, all. Każda inna/brakująca wartość (w tym domyślna) daje ostatni 1 rok. all obejmuje okres od epoki uniksowej do teraz.

Żądanie

Okno terminala
curl -X GET -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
"https://platform.phishspot.com/api/v1/accounts/11/trends?start_date=2026-01-01&end_date=2026-06-01"

Odpowiedź 200 OK — obiekt z tablicą campaigns (jeden wpis na każdą dostarczoną kampanię w zakresie) oraz obiektem summary.

PoleTypOpis
campaignsarrayDostarczone kampanie w zakresie, uporządkowane rosnąco według created_at. Każdy element to punkt danych (pola poniżej). Pusta tablica, jeśli brak.
campaigns[].idintegerIdentyfikator kampanii (surowa liczba całkowita).
campaigns[].namestringNazwa kampanii.
campaigns[].datestringData uruchomienia kampanii, YYYY-MM-DD (data ISO 8601). Używa scheduled_at, jeśli ustawiono, w przeciwnym razie created_at.
campaigns[].open_ratenumber (float)Procent odbiorców, którzy otworzyli e-mail (0.0, gdy brak danych).
campaigns[].click_ratenumber (float)Procent odbiorców, którzy kliknęli link (0.0, gdy brak danych).
campaigns[].submit_ratenumber (float)Procent odbiorców, którzy przesłali dane na stronie docelowej (0.0, gdy brak danych).
campaigns[].total_sentintegerLiczba odbiorców, do których wysłano kampanię.
summaryobjectZestawienie zbiorcze dla powyższych kampanii (pola poniżej).
summary.total_campaignsintegerLiczba dostarczonych kampanii w zakresie (0, gdy brak).
summary.avg_click_ratenumber (float)Średnia z wartości click_rate poszczególnych kampanii, zaokrąglona do 1 miejsca po przecinku (0.0, gdy brak).
summary.trend_directionstringJedna z wartości improving, worsening, stable lub neutral. Porównuje średni współczynnik kliknięć ostatnich do 3 kampanii ze średnią najwcześniejszych do 3; neutral, gdy mniej niż 2 kampanie, stable, gdy zmiana mieści się w zakresie ±1.0 punktu procentowego.
summary.most_vulnerable_groupstring | nullNazwa grupy odbiorców o najwyższym stosunku kliknięć do wysłanych w zakresie; null, gdy brak danych o grupach.
{
"campaigns": [
{
"id": 42,
"name": "Q1 Invoice Lure",
"date": "2026-01-14",
"open_rate": 61.5,
"click_rate": 23.1,
"submit_rate": 7.7,
"total_sent": 130
},
{
"id": 57,
"name": "Password Expiry Notice",
"date": "2026-04-02",
"open_rate": 54.0,
"click_rate": 12.0,
"submit_rate": 4.0,
"total_sent": 150
}
],
"summary": {
"total_campaigns": 2,
"avg_click_rate": 17.6,
"trend_direction": "improving",
"most_vulnerable_group": "Finance"
}
}

Kody statusu

KodKiedy
200Zwrócono dane trendów (tablica campaigns i summary są obecne nawet wtedy, gdy nie ma pasujących kampanii).
404account_id nie należy do użytkownika tokena ({"error":"Account not found"}).
422start_date lub end_date nie jest możliwą do sparsowania datą YYYY-MM-DD ({"error":"Invalid date; use YYYY-MM-DD."}).

Kursy e-learningowe dostarczane pracownikom, którzy dali się nabrać na symulację phishingu. Kurs to uporządkowany zbiór bloków (tekst, HTML, wideo, quiz itp.). Kursy należą do Twojego konta albo są globalne (wyselekcjonowana, współdzielona biblioteka). Bloki są zagnieżdżone w kursie na potrzeby listowania/tworzenia, ale są adresowalne po własnym płytkim id na potrzeby wyświetlania/aktualizacji/usuwania.

Listuje wszystkie kursy dostępne dla konta — kursy należące do Twojego konta plus wszystkie kursy z global: true — uporządkowane według nazwy, z dołączonym lekkim podsumowaniem bloków. Uwierzytelnianie: Bearer; rola: odczyt (dowolna rola).

Parametry

NazwaGdzieTypWymaganeOpis
account_idpathstringtakId konta (acct_… lub liczba całkowita). Musi być kontem, do którego należy użytkownik tokena.

Żądanie

Okno terminala
curl -H "Authorization: Bearer $TOKEN" \
https://platform.phishspot.com/api/v1/accounts/11/courses

Odpowiedź 200 OK — tablica JSON obiektów kursu (zobacz pola kursu poniżej).

PoleTypOpis
idintegerId kursu.
account_idintegerId konta będącego właścicielem.
namestringNazwa kursu.
descriptionstringOpis kursu.
globalbooleantrue dla współdzielonych/wyselekcjonowanych kursów z biblioteki, false dla kursów należących do konta.
created_atstringZnacznik czasu ISO 8601.
updated_atstringZnacznik czasu ISO 8601.
blocksarrayDołączone podsumowania bloków (zobacz pola poniżej). Uporządkowane tak, jak zapisano w asocjacji.
blocks[].idintegerId bloku.
blocks[].namestringNazwa bloku.
blocks[].orderintegerPozycja w kursie liczona od zera.
blocks[].genrestringRodzaj bloku (zobacz enum przy punktach końcowych bloków).
[
{
"id": 7,
"account_id": 11,
"name": "Spotting Spoofed Senders",
"description": "A short course on recognising display-name and domain spoofing.",
"global": false,
"created_at": "2026-05-01T09:12:00.000Z",
"updated_at": "2026-05-14T16:40:11.000Z",
"blocks": [
{ "id": 31, "name": "Intro", "order": 0, "genre": "html" },
{ "id": 32, "name": "Quick check", "order": 1, "genre": "quiz" }
]
}
]

Kody statusu

KodKiedy
200Kursy zwrócone.
404account_id nie jest kontem, do którego należy użytkownik tokena.

Tworzy nowy kurs należący do konta. Kurs jest zawsze tworzony pod kontem z ścieżki (nie można ustawić global — nowe kursy są prywatne). Zarówno name, jak i description są wymagane przez model. Uwierzytelnianie: Bearer; rola: odczyt (dowolna rola — wszyscy członkowie zespołu mogą tworzyć kursy).

Parametry

Parametry treści żądania są opakowane w obiekt course.

NazwaGdzieTypWymaganeOpis
account_idpathstringtakId konta (acct_… lub liczba całkowita).
coursebodyobjecttakObiekt opakowujący zawierający pola poniżej.
course.namebodystringtakNazwa kursu. Walidowana pod kątem obecności.
course.descriptionbodystringtakOpis kursu. Walidowany pod kątem obecności.

Żądanie

Okno terminala
curl -X POST -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{ "course": { "name": "Invoice Fraud 101", "description": "Recognising fake supplier invoices." } }' \
https://platform.phishspot.com/api/v1/accounts/11/courses

Odpowiedź 201 Created — utworzony kurs, taki sam kształt jak element listy (z pustą tablicą blocks).

PoleTypOpis
idintegerId nowego kursu.
account_idintegerId konta będącego właścicielem (konto ze ścieżki).
namestringNazwa kursu.
descriptionstringOpis kursu.
globalbooleanZawsze false dla nowo utworzonych kursów.
created_atstringZnacznik czasu ISO 8601.
updated_atstringZnacznik czasu ISO 8601.
blocksarrayPusta przy tworzeniu.
{
"id": 19,
"account_id": 11,
"name": "Invoice Fraud 101",
"description": "Recognising fake supplier invoices.",
"global": false,
"created_at": "2026-06-02T10:00:00.000Z",
"updated_at": "2026-06-02T10:00:00.000Z",
"blocks": []
}

Kody statusu

KodKiedy
201Kurs utworzony.
404account_id nie jest kontem, do którego należy użytkownik tokena.
422Walidacja nie powiodła się — np. name lub description puste. Treść: {"errors": {"name": ["can't be blank"]}}.

Pobiera pojedynczy kurs po jego płytkim id. Rozwiązywalne dla kursów należących do Twojego konta lub dowolnego kursu global; kurs należący do innego najemcy zwraca 404. Uwierzytelnianie: Bearer; rola: odczyt (dowolna rola).

Parametry

NazwaGdzieTypWymaganeOpis
idpathstringtakId kursu (course_… lub liczba całkowita).

Żądanie

Okno terminala
curl -H "Authorization: Bearer $TOKEN" \
https://platform.phishspot.com/api/v1/courses/7

Odpowiedź 200 OK — jeden obiekt kursu, te same pola co element listy (w tym dołączone podsumowanie blocks).

PoleTypOpis
idintegerId kursu.
account_idintegerId konta będącego właścicielem.
namestringNazwa kursu.
descriptionstringOpis kursu.
globalbooleanCzy kurs pochodzi ze współdzielonej biblioteki.
created_atstringZnacznik czasu ISO 8601.
updated_atstringZnacznik czasu ISO 8601.
blocksarrayDołączone podsumowania bloków: id, name, order, genre.
{
"id": 7,
"account_id": 11,
"name": "Spotting Spoofed Senders",
"description": "A short course on recognising display-name and domain spoofing.",
"global": false,
"created_at": "2026-05-01T09:12:00.000Z",
"updated_at": "2026-05-14T16:40:11.000Z",
"blocks": [
{ "id": 31, "name": "Intro", "order": 0, "genre": "html" },
{ "id": 32, "name": "Quick check", "order": 1, "genre": "quiz" }
]
}

Kody statusu

KodKiedy
200Kurs zwrócony.
404Brak kursu o tym id należącego do Twojego konta, a kurs nie jest globalny.

Aktualizuje pola name i/lub description kursu. Uwierzytelnianie: Bearer; rola: odczyt (dowolna rola), z zastrzeżeniem kontroli własności globalnej i blokady opisanych poniżej.

Parametry

Parametry treści żądania są opakowane w obiekt course. Dozwolone są tylko name i description.

NazwaGdzieTypWymaganeOpis
idpathstringtakId kursu (course_… lub liczba całkowita).
coursebodyobjecttakObiekt opakowujący zawierający pola poniżej.
course.namebodystringnieNowa nazwa. Nie może być pusta, jeśli podana (walidacja obecności).
course.descriptionbodystringnieNowy opis. Nie może być pusty, jeśli podany (walidacja obecności).

Żądanie

Okno terminala
curl -X PATCH -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{ "course": { "description": "Updated for the 2026 supplier-fraud wave." } }' \
https://platform.phishspot.com/api/v1/courses/7

Odpowiedź 200 OK — zaktualizowany kurs (taki sam kształt jak GET /courses/:id).

{
"id": 7,
"account_id": 11,
"name": "Spotting Spoofed Senders",
"description": "Updated for the 2026 supplier-fraud wave.",
"global": false,
"created_at": "2026-05-01T09:12:00.000Z",
"updated_at": "2026-06-02T10:05:00.000Z",
"blocks": [
{ "id": 31, "name": "Intro", "order": 0, "genre": "html" }
]
}

Kody statusu

KodKiedy
200Kurs zaktualizowany.
403Kurs jest global i nie należy do Twojego konta, albo jest zablokowany przez trwającą/wstrzymaną kampanię.
404Kurs nieosiągalny dla Twojego konta (nie jest własnością i nie jest globalny).
422Walidacja nie powiodła się — np. name/description ustawione na puste. Treść: {"errors": {...}}.

Usuwa kurs i (poprzez dependent: :destroy) wszystkie jego bloki. Uwierzytelnianie: Bearer; rola: odczyt (dowolna rola), z zastrzeżeniem kontroli własności globalnej i blokady opisanych poniżej.

Parametry

Brak parametrów poza tokenem bearer i id ze ścieżki.

NazwaGdzieTypWymaganeOpis
idpathstringtakId kursu (course_… lub liczba całkowita).

Żądanie

Okno terminala
curl -X DELETE -H "Authorization: Bearer $TOKEN" \
https://platform.phishspot.com/api/v1/courses/19

Odpowiedź 204 No Content — pusta treść po sukcesie.

Kody statusu

KodKiedy
204Kurs usunięty.
403Kurs jest global i nie należy do Twojego konta, albo jest zablokowany przez trwającą/wstrzymaną kampanię.
404Kurs nieosiągalny dla Twojego konta.

Listuje bloki kursu, uporządkowane według order (rosnąco), zawężone przez Pundit do bloków dostępnych (własnych lub globalnych) kursów. Uwierzytelnianie: Bearer; rola: odczyt (dowolna rola).

Parametry

NazwaGdzieTypWymaganeOpis
course_idpathstringtakId kursu (course_… lub liczba całkowita). Musi należeć do Twojego konta lub być globalny.

Żądanie

Okno terminala
curl -H "Authorization: Bearer $TOKEN" \
https://platform.phishspot.com/api/v1/courses/7/blocks

Odpowiedź 200 OK — tablica JSON pełnych obiektów bloku (pola poniżej).

PoleTypOpis
idintegerId bloku.
namestringNazwa bloku.
course_idintegerId kursu nadrzędnego.
orderintegerPozycja w kursie liczona od zera.
genrestringJeden z: text, html, image, video, quiz, interactive, code, file_download.
metadataobjectDowolny JSON. Dla bloków quizowych przechowuje ładunek z pytaniem/odpowiedziami.
created_atstringZnacznik czasu ISO 8601.
updated_atstringZnacznik czasu ISO 8601.
html_datastringWyrenderowany HTML z tekstu sformatowanego. Obecne tylko wtedy, gdy blok ma treść ActionText.
lockedbooleantrue, gdy powiązana kampania jest w toku (bloku nie można aktualizować/usuwać).
quiz_questionstringTylko bloki quizowe. Sparsowany tekst pytania.
quiz_answersarrayTylko bloki quizowe. Tablica hashy odpowiedzi sparsowanych z metadata.
urlstringKanoniczny adres URL API tego bloku (/api/v1/blocks/:id).
[
{
"id": 31,
"name": "Intro",
"course_id": 7,
"order": 0,
"genre": "html",
"metadata": {},
"created_at": "2026-05-01T09:12:00.000Z",
"updated_at": "2026-05-01T09:12:00.000Z",
"html_data": "<div>Welcome to the course.</div>",
"locked": false,
"url": "https://platform.phishspot.com/api/v1/blocks/31"
},
{
"id": 32,
"name": "Quick check",
"course_id": 7,
"order": 1,
"genre": "quiz",
"metadata": [
{ "question_text": "Which sender is spoofed?" },
{ "answer_text": "no-reply@paypa1.com", "right_answer": "on" },
{ "answer_text": "no-reply@paypal.com" }
],
"created_at": "2026-05-01T09:13:00.000Z",
"updated_at": "2026-05-01T09:13:00.000Z",
"locked": false,
"quiz_question": "Which sender is spoofed?",
"quiz_answers": [
{ "answer_text": "no-reply@paypa1.com", "right_answer": "on" },
{ "answer_text": "no-reply@paypal.com" }
],
"url": "https://platform.phishspot.com/api/v1/blocks/32"
}
]

Kody statusu

KodKiedy
200Bloki zwrócone (pusta tablica, jeśli kurs nie ma żadnych).
404course_id nieosiągalny dla Twojego konta (nie jest własnością i nie jest globalny).

Dodaje blok do kursu. Pole account bloku jest ustawiane automatycznie na podstawie kursu; jeśli order jest pominięte, jest automatycznie przypisywane na koniec kursu. Wymagania dotyczące treści różnią się w zależności od genre (zobacz poniżej). Uwierzytelnianie: Bearer; rola: odczyt (dowolna rola), ale nie możesz dodawać bloków do kursu globalnego, który nie należy do Ciebie (403).

Parametry

Parametry treści żądania są opakowane w obiekt block.

NazwaGdzieTypWymaganeOpis
course_idpathstringtakId kursu (course_… lub liczba całkowita).
blockbodyobjecttakObiekt opakowujący zawierający pola poniżej.
block.namebodystringtakNazwa bloku. Walidowana pod kątem obecności.
block.genrebodystringtakJeden z text, html, image, video, quiz, interactive, code, file_download. Domyślnie text, jeśli pominięty.
block.bodybodystringwarunkowoTreść w zwykłym tekście/markdownie. Wymagana, chyba że genre to quiz, html, video lub file_download. Dla video/file_download służy jako opcjonalny opis.
block.html_databodystringwarunkowoTreść w formacie rich HTML (ActionText). Dla bloków html/text podaj body albo html_data.
block.metadatabodyobject/arraywarunkowoDowolny JSON. Wymagane dla bloków quiz, gdzie niesie pytanie i odpowiedzi (zobacz ograniczenia quizu).
block.orderbodyintegerniePozycja w kursie (liczba całkowita ≥ 0). Automatycznie przypisana na koniec, jeśli pominięta.
block.course_idbodyintegernieDozwolone, ale zwykle nadmiarowe wobec course_id ze ścieżki.
block.video_filebodyfilewarunkowoZałącznik wideo. Wymagany dla bloków video. Musi być video/mp4 lub video/webm, ≤ 300 MB, ≤ 1920×1080, ≤ 600 s, kodek wideo h264/vp8/vp9, kodek audio aac/opus. Puste wartości tekstowe są ignorowane.
block.document_filebodyfilewarunkowoZałącznik dokumentu. Wymagany dla bloków file_download. Dowolny format, ≤ 100 MB. Puste wartości tekstowe są ignorowane.

Żądanie

Okno terminala
curl -X POST -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{
"block": {
"name": "Identify the phish",
"genre": "quiz",
"metadata": [
{ "question_text": "Which sender is spoofed?" },
{ "answer_text": "no-reply@paypa1.com", "right_answer": "on" },
{ "answer_text": "no-reply@paypal.com" }
]
}
}' \
https://platform.phishspot.com/api/v1/courses/7/blocks

Odpowiedź 201 Created — utworzony blok (taki sam kształt jak element listy).

{
"id": 33,
"name": "Identify the phish",
"course_id": 7,
"order": 2,
"genre": "quiz",
"metadata": [
{ "question_text": "Which sender is spoofed?" },
{ "answer_text": "no-reply@paypa1.com", "right_answer": "on" },
{ "answer_text": "no-reply@paypal.com" }
],
"created_at": "2026-06-02T10:10:00.000Z",
"updated_at": "2026-06-02T10:10:00.000Z",
"locked": false,
"quiz_question": "Which sender is spoofed?",
"quiz_answers": [
{ "answer_text": "no-reply@paypa1.com", "right_answer": "on" },
{ "answer_text": "no-reply@paypal.com" }
],
"url": "https://platform.phishspot.com/api/v1/blocks/33"
}

Kody statusu

KodKiedy
201Blok utworzony.
403Kurs nadrzędny jest global i nie należy do Twojego konta.
404course_id nieosiągalny dla Twojego konta.
422Walidacja nie powiodła się — brak name/genre, brak wymaganej treści dla danego genre (body, html_data, metadata, video_file lub document_file), zbyt mało/zbyt wiele odpowiedzi quizowych, brak poprawnej odpowiedzi quizowej lub niedozwolony plik wideo/dokumentu. Treść: {"errors": {...}}.

Pobiera pojedynczy blok po jego płytkim id, zawężony do bloków kursów, do których Twoje konto ma dostęp (własnych lub globalnych). Uwierzytelnianie: Bearer; rola: odczyt (dowolna rola).

Parametry

NazwaGdzieTypWymaganeOpis
idpathstringtakId bloku (blk_… lub liczba całkowita).

Żądanie

Okno terminala
curl -H "Authorization: Bearer $TOKEN" \
https://platform.phishspot.com/api/v1/blocks/32

Odpowiedź 200 OK — jeden obiekt bloku (pełne pola jak na liście bloków).

PoleTypOpis
idintegerId bloku.
namestringNazwa bloku.
course_idintegerId kursu nadrzędnego.
orderintegerPozycja liczona od zera.
genrestringRodzaj bloku (zobacz enum powyżej).
metadataobject/arrayDowolny JSON; ładunek quizu dla bloków quizowych.
created_atstringZnacznik czasu ISO 8601.
updated_atstringZnacznik czasu ISO 8601.
html_datastringWyrenderowany tekst sformatowany. Obecne tylko, gdy ustawione.
lockedbooleantrue, gdy powiązana kampania jest w toku.
quiz_questionstringTylko bloki quizowe.
quiz_answersarrayTylko bloki quizowe.
urlstringKanoniczny adres URL API tego bloku.
{
"id": 32,
"name": "Quick check",
"course_id": 7,
"order": 1,
"genre": "quiz",
"metadata": [
{ "question_text": "Which sender is spoofed?" },
{ "answer_text": "no-reply@paypa1.com", "right_answer": "on" },
{ "answer_text": "no-reply@paypal.com" }
],
"created_at": "2026-05-01T09:13:00.000Z",
"updated_at": "2026-05-01T09:13:00.000Z",
"locked": false,
"quiz_question": "Which sender is spoofed?",
"quiz_answers": [
{ "answer_text": "no-reply@paypa1.com", "right_answer": "on" },
{ "answer_text": "no-reply@paypal.com" }
],
"url": "https://platform.phishspot.com/api/v1/blocks/32"
}

Kody statusu

KodKiedy
200Blok zwrócony.
404Blok nieosiągalny dla Twojego konta (jego kurs nie jest ani własnością, ani globalny).

Aktualizuje blok. Te same dozwolone pola i reguły treści zależne od genre co przy tworzeniu. Uwierzytelnianie: Bearer; rola: odczyt (dowolna rola), ale nie możesz edytować bloku w kursie globalnym, który nie należy do Ciebie (403), a blok locked? (kampania w toku) wywołuje błąd not-destroyed podczas aktualizacji.

Parametry

Parametry treści żądania są opakowane w obiekt block. Dozwolone klucze: name, body, course_id, order, genre, metadata, html_data, video_file, document_file.

NazwaGdzieTypWymaganeOpis
idpathstringtakId bloku (blk_… lub liczba całkowita).
blockbodyobjecttakObiekt opakowujący zawierający dowolne z dozwolonych pól.
block.namebodystringnieNowa nazwa (walidacja obecności, jeśli podana).
block.genrebodystringnieZmiana genre; ten sam enum co przy tworzeniu. Zmiana genre może sprawić, że inne pola staną się wymagane.
block.bodybodystringnieTreść tekstowa. Wymagana, chyba że genre to quiz/html/video/file_download.
block.html_databodystringnieTreść w formacie rich HTML.
block.metadatabodyobject/arraynieDowolny JSON; ładunek quizu (2–6 odpowiedzi, ≥1 poprawna).
block.orderbodyintegernieNowa pozycja (liczba całkowita ≥ 0).
block.video_filebodyfilenieZastępcze wideo (te same ograniczenia co przy tworzeniu). Puste ciągi ignorowane.
block.document_filebodyfilenieZastępczy dokument (≤ 100 MB). Puste ciągi ignorowane.

Żądanie

Okno terminala
curl -X PATCH -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{ "block": { "name": "Identify the phishing sender", "order": 1 } }' \
https://platform.phishspot.com/api/v1/blocks/32

Odpowiedź 200 OK — zaktualizowany blok (taki sam kształt jak GET /blocks/:id).

{
"id": 32,
"name": "Identify the phishing sender",
"course_id": 7,
"order": 1,
"genre": "quiz",
"metadata": [
{ "question_text": "Which sender is spoofed?" },
{ "answer_text": "no-reply@paypa1.com", "right_answer": "on" },
{ "answer_text": "no-reply@paypal.com" }
],
"created_at": "2026-05-01T09:13:00.000Z",
"updated_at": "2026-06-02T10:15:00.000Z",
"locked": false,
"quiz_question": "Which sender is spoofed?",
"quiz_answers": [
{ "answer_text": "no-reply@paypa1.com", "right_answer": "on" },
{ "answer_text": "no-reply@paypal.com" }
],
"url": "https://platform.phishspot.com/api/v1/blocks/32"
}

Kody statusu

KodKiedy
200Blok zaktualizowany.
403Kurs bloku jest global i nie należy do Twojego konta.
404Blok nieosiągalny dla Twojego konta.
422Walidacja nie powiodła się — puste name, brak treści wymaganej przez genre, nieprawidłowe odpowiedzi quizowe, niedozwolony plik, albo blok jest zablokowany przez kampanię w toku. Treść: {"errors": {...}}.

Usuwa blok. Kontroler najpierw sprawdza, czy blok jest zablokowany przez trwającą kampanię, i odmawia z kodem 422, jeśli tak jest. Uwierzytelnianie: Bearer; rola: odczyt (dowolna rola), ale nie możesz usunąć bloku w kursie globalnym, który nie należy do Ciebie (403).

Parametry

Brak parametrów poza tokenem bearer i id ze ścieżki.

NazwaGdzieTypWymaganeOpis
idpathstringtakId bloku (blk_… lub liczba całkowita).

Żądanie

Okno terminala
curl -X DELETE -H "Authorization: Bearer $TOKEN" \
https://platform.phishspot.com/api/v1/blocks/33

Odpowiedź 204 No Content — pusta treść po sukcesie.

Kody statusu

KodKiedy
204Blok usunięty.
403Kurs bloku jest global i nie należy do Twojego konta.
404Blok nieosiągalny dla Twojego konta.
422Blok jest zablokowany (powiązana kampania jest w toku). Treść: {"errors": ["Cannot delete block because connected campaign is in progress"]}.

Autopiloty to powtarzalne, bezobsługowe programy phishingowe: opisujesz odbiorców i kadencję, a platforma sama generuje i dostarcza kampanie, dopóki jej nie zatrzymasz. Autopilot powstaje jako draft, a następnie przechodzi przez niewielki cykl życia (draft → running ⇄ paused → stopped) za pomocą dedykowanych akcji opisanych poniżej.

::: caution Uruchomienie autopilotu aktywuje działający, wysyłający program — platforma zacznie generować i dostarczać prawdziwe kampanie phishingowe do wskazanych członków zgodnie ze skonfigurowaną kadencją. Traktuj POST /autopilots/:id/start jak akcję uruchamiającą produkcję, nie jak przebieg testowy. :::

Kilka faktów o modelu, do których odwołujemy się w całym tym rozdziale:

  • Stan (state): jeden z draft, running, paused, stopped.
  • Okres intensywności (intensity_period): jeden z day, week, month, year.
  • Rodzaj czasu trwania (duration_kind): continuous (działa bez końca) lub until_date (zatrzymuje się w dniu ends_on).
  • Typ akcji końcowej (end_action_type): jeden z nothing, redirect_to_course, message_page, redirect_to_url — decyduje, co widzi cel po zakończeniu symulacji.
  • Limit dziennego tempa: efektywne tempo wysyłki to intensity_count / period_in_days i nie może przekroczyć 2 kampanii/dzień (day=1, week=7, month=30, year=365 dni na okres). Przekroczenie powoduje błąd walidacji na intensity_count.
  • Edytowalność: autopilot jest edytowalny, dopóki nie jest stopped. Po przejściu w stan stopped dostępne pozostają tylko odczyt i usunięcie.

Listuje wszystkie autopiloty należące do konta, od najnowszych. Użyj, aby wyrenderować panel autopilotów lub znaleźć id autopilotu przed wykonaniem na nim akcji. Uwierzytelnianie: Bearer; rola: odczyt (dowolna rola — członek, edytor lub admin).

Parametry

NazwaGdzieTypWymaganeOpis
account_idpathstringtakId konta (acct_… lub liczba całkowita).
statequerystringnieFiltruje do pojedynczego stanu. Jeden z draft, running, paused, stopped. Każda inna wartość zwraca 422.

Żądanie

Okno terminala
curl -H "Authorization: Bearer $TOKEN" \
"https://platform.phishspot.com/api/v1/accounts/11/autopilots?state=running"

Odpowiedź 200 OK — tablica JSON obiektów autopilota (każdy identyczny z odpowiedzią dla pojedynczego autopilotu poniżej).

PoleTypOpis
idintegerId autopilotu.
account_idintegerId konta będącego właścicielem.
namestringNazwa wyświetlana.
statestringdraft | running | paused | stopped.
all_groupsbooleanCzy autopilot kieruje się do wszystkich grup (zamiast do wymienionych groups).
intensity_countintegerLiczba kampanii na intensity_period.
intensity_periodstringday | week | month | year.
duration_kindstringcontinuous | until_date.
ai_optimizer_enabledbooleanCzy optymalizacja AI jest włączona.
auto_include_new_membersbooleanCzy nowi członkowie są automatycznie dołączani.
languagestringKod języka docelowego (np. en, pl).
end_action_typestringnothing | redirect_to_course | message_page | redirect_to_url.
end_action_urlstring | nullURL przekierowania (używany, gdy end_action_type to redirect_to_url).
created_atstringZnacznik czasu ISO-8601.
updated_atstringZnacznik czasu ISO-8601.
ends_onstring | nullData ISO-8601, w której program się zatrzymuje (gdy duration_kind to until_date), w przeciwnym razie null.
started_atstring | nullZnacznik czasu ISO-8601 pierwszego uruchomienia, w przeciwnym razie null.
daily_ratenumberEfektywna liczba kampanii/dzień, zaokrąglona do 2 miejsc po przecinku.
progress_percentageinteger | nullCałkowity % oczekiwanych kampanii dostarczonych w bieżącym okresie; null dla draft/stopped.
course_idinteger | nullId powiązanego kursu e-learningowego, w przeciwnym razie null.
editablebooleanfalse tylko wtedy, gdy state to stopped.
groupsarrayDocelowe grupy. Każda: { "id": integer, "name": string }.
recent_campaignsarrayDo 10 najnowszych wygenerowanych kampanii, od najnowszych. Każda: { "id": integer, "name": string, "state": string }.
[
{
"id": 7,
"account_id": 11,
"name": "Finance team — quarterly drip",
"state": "running",
"all_groups": false,
"intensity_count": 2,
"intensity_period": "month",
"duration_kind": "continuous",
"ai_optimizer_enabled": true,
"auto_include_new_members": true,
"language": "en",
"end_action_type": "redirect_to_course",
"end_action_url": null,
"created_at": "2026-05-01T09:00:00Z",
"updated_at": "2026-06-01T12:30:00Z",
"ends_on": null,
"started_at": "2026-05-02T08:00:00Z",
"daily_rate": 0.07,
"progress_percentage": 88,
"course_id": 14,
"editable": true,
"groups": [
{ "id": 3, "name": "Finance" }
],
"recent_campaigns": [
{ "id": 102, "name": "Invoice approval — May", "state": "completed" }
]
}
]

Kody statusu

KodKiedy
200Lista zwrócona (być może pusta).
404account_id nie istnieje lub użytkownik tokenu nie jest jego członkiem.
422Parametr query state jest obecny, ale nie jest jednym z draft, running, paused, stopped.

Tworzy nowy autopilot w stanie draft. Puste pola są wstępnie wypełniane z ustawień autopilotu konta oraz domyślnych wartości konta (branża, język, URL/HTML akcji końcowej, domyślny kurs), więc nawet minimalna treść żądania daje użyteczny szkic. Autopilot nie jest uruchamiany — wywołaj potem start, aby przejść na żywo. Uwierzytelnianie: Bearer; rola: admin/edytor.

Treść żądania jest opakowana w obiekt autopilot.

Parametry

NazwaGdzieTypWymaganeOpis
account_idpathstringtakId konta (acct_… lub liczba całkowita).
namebodystringtakNazwa wyświetlana. Maks. 80 znaków; musi być unikalna w obrębie konta (bez rozróżniania wielkości liter).
all_groupsbodybooleannieKieruj do wszystkich grup. Domyślnie true.
group_idsbodyarrayniePrefiksowane id grup (grp_…), do których kierować. Nieznane/obce id → 422. Używane, gdy all_groups to false.
intensity_countbodyintegernieLiczba kampanii na okres. Musi być ≥ 1. Domyślnie 1. Wynikowe dzienne tempo (intensity_count / period_days) musi być ≤ 2/dzień.
intensity_periodbodystringnieday | week | month | year. Domyślnie month.
duration_kindbodystringniecontinuous | until_date. Domyślnie continuous.
ends_onbodystring (date)warunkowoWymagane (i musi być datą przyszłą), gdy duration_kind to until_date.
ai_optimizer_enabledbodybooleannieDomyślnie true.
auto_include_new_membersbodybooleannieDomyślnie true.
languagebodystringnieKod języka docelowego (np. en, pl). Wstępnie wypełniany z ustawień/lokalizacji konta, jeśli pusty.
industry_code_idbodyintegernieId kodu branży. Wstępnie wypełniany z ustawień konta, jeśli pusty.
end_action_typebodystringnienothing | redirect_to_course | message_page | redirect_to_url. Domyślnie message_page.
end_action_urlbodystringwarunkowoWymagane i musi być http/https, gdy end_action_type to redirect_to_url.
end_action_htmlbodystringwarunkowoWymagane, gdy end_action_type to message_page (wstępnie wypełniane z domyślnych wartości konta, jeśli puste).
course_idbodystringwarunkowoPrefiksowane id kursu (course_…); musi należeć do konta albo być kursem globalnym (inaczej 422). Wymagane, gdy end_action_type to redirect_to_course.

Żądanie

Okno terminala
curl -X POST -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{
"autopilot": {
"name": "Finance team — quarterly drip",
"all_groups": false,
"group_ids": ["grp_3a9k"],
"intensity_count": 2,
"intensity_period": "month",
"duration_kind": "continuous",
"end_action_type": "redirect_to_course",
"course_id": "course_8h2d"
}
}' \
https://platform.phishspot.com/api/v1/accounts/11/autopilots

Odpowiedź 201 Created — nowo utworzony autopilot, w tym samym kształcie co element listy powyżej (state będzie draft, a started_at i progress_percentage null).

{
"id": 9,
"account_id": 11,
"name": "Finance team — quarterly drip",
"state": "draft",
"all_groups": false,
"intensity_count": 2,
"intensity_period": "month",
"duration_kind": "continuous",
"ai_optimizer_enabled": true,
"auto_include_new_members": true,
"language": "en",
"end_action_type": "redirect_to_course",
"end_action_url": null,
"created_at": "2026-06-02T10:15:00Z",
"updated_at": "2026-06-02T10:15:00Z",
"ends_on": null,
"started_at": null,
"daily_rate": 0.07,
"progress_percentage": null,
"course_id": 14,
"editable": true,
"groups": [
{ "id": 3, "name": "Finance" }
],
"recent_campaigns": []
}

Kody statusu

KodKiedy
201Autopilot utworzony.
400Opakowanie treści autopilot jest całkowicie nieobecne.
403Użytkownik tokenu jest member (tylko odczyt) na koncie — tylko admini/edytorzy mogą tworzyć.
404account_id nie istnieje lub użytkownik tokenu nie jest jego członkiem.
422Walidacja nie powiodła się — np. pusta/zduplikowana/zbyt długa name, dzienne tempo powyżej limitu 2/dzień, brak ends_on dla until_date, brak end_action_url/end_action_html/course_id dla wybranego end_action_type albo nieznane group_ids / course_id.

Pobiera pojedynczy autopilot po jego id. To trasa płaska (niezagnieżdżona) — bez account_id w ścieżce; konto jest wnioskowane z autopilotu, a członkostwo użytkownika tokenu jest weryfikowane. Uwierzytelnianie: Bearer; rola: admin/edytor.

Brak parametrów poza tokenem bearer.

NazwaGdzieTypWymaganeOpis
idpathstringtakId autopilotu (auto_… lub liczba całkowita).

Żądanie

Okno terminala
curl -H "Authorization: Bearer $TOKEN" \
https://platform.phishspot.com/api/v1/autopilots/9

Odpowiedź 200 OK — pojedynczy obiekt autopilota (identyczny zestaw pól jak element listy udokumentowany w GET …/autopilots).

{
"id": 9,
"account_id": 11,
"name": "Finance team — quarterly drip",
"state": "running",
"all_groups": false,
"intensity_count": 2,
"intensity_period": "month",
"duration_kind": "continuous",
"ai_optimizer_enabled": true,
"auto_include_new_members": true,
"language": "en",
"end_action_type": "redirect_to_course",
"end_action_url": null,
"created_at": "2026-06-02T10:15:00Z",
"updated_at": "2026-06-02T10:16:00Z",
"ends_on": null,
"started_at": "2026-06-02T10:16:00Z",
"daily_rate": 0.07,
"progress_percentage": 100,
"course_id": 14,
"editable": true,
"groups": [
{ "id": 3, "name": "Finance" }
],
"recent_campaigns": []
}

Kody statusu

KodKiedy
200Autopilot zwrócony.
403Użytkownik tokenu jest member (tylko odczyt) na koncie autopilotu — odczyt pojedynczego autopilotu wymaga roli admin/edytor.
404Brak autopilotu o tym id lub użytkownik tokenu nie ma aktywnego członkostwa w jego koncie.

Aktualizuje konfigurację autopilotu. Treść żądania jest opakowana w obiekt autopilot i przyjmuje te same pola co przy tworzeniu. Przekazanie group_ids zastępuje cały zestaw docelowych grup. Uwierzytelnianie: Bearer; rola: admin/edytor — a autopilot musi być edytowalny (nie stopped). Trasa płaska (bez account_id).

Parametry

NazwaGdzieTypWymaganeOpis
idpathstringtakId autopilotu (auto_… lub liczba całkowita).
namebodystringnieNazwa wyświetlana. Maks. 80 znaków; unikalna w obrębie konta (bez rozróżniania wielkości liter).
all_groupsbodybooleannieKieruj do wszystkich grup.
group_idsbodyarrayniePrefiksowane id grup (grp_…). Gdy obecne, zastępują bieżący zestaw grup; nieznane/obce id → 422.
intensity_countbodyintegernieLiczba kampanii na okres (≥ 1; dzienne tempo musi pozostać ≤ 2/dzień).
intensity_periodbodystringnieday | week | month | year.
duration_kindbodystringniecontinuous | until_date.
ends_onbodystring (date)warunkowoWymagana data przyszła, gdy duration_kind to until_date.
ai_optimizer_enabledbodybooleanniePrzełącz optymalizację AI.
auto_include_new_membersbodybooleanniePrzełącz automatyczne dołączanie.
languagebodystringnieKod języka docelowego.
industry_code_idbodyintegernieId kodu branży.
end_action_typebodystringnienothing | redirect_to_course | message_page | redirect_to_url.
end_action_urlbodystringwarunkowoWymagany URL http/https, gdy end_action_type to redirect_to_url.
end_action_htmlbodystringwarunkowoWymagane, gdy end_action_type to message_page.
course_idbodystringwarunkowoPrefiksowane id kursu (course_…); musi należeć do konta albo być globalne. Wymagane, gdy end_action_type to redirect_to_course.

Żądanie

Okno terminala
curl -X PATCH -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{ "autopilot": { "intensity_count": 1, "intensity_period": "week" } }' \
https://platform.phishspot.com/api/v1/autopilots/9

Odpowiedź 200 OK — zaktualizowany obiekt autopilota (ten sam kształt co GET /autopilots/:id).

{
"id": 9,
"account_id": 11,
"name": "Finance team — quarterly drip",
"state": "running",
"all_groups": false,
"intensity_count": 1,
"intensity_period": "week",
"duration_kind": "continuous",
"ai_optimizer_enabled": true,
"auto_include_new_members": true,
"language": "en",
"end_action_type": "redirect_to_course",
"end_action_url": null,
"created_at": "2026-06-02T10:15:00Z",
"updated_at": "2026-06-02T11:00:00Z",
"ends_on": null,
"started_at": "2026-06-02T10:16:00Z",
"daily_rate": 0.14,
"progress_percentage": 100,
"course_id": 14,
"editable": true,
"groups": [
{ "id": 3, "name": "Finance" }
],
"recent_campaigns": []
}

Kody statusu

KodKiedy
200Autopilot zaktualizowany.
400Opakowanie treści autopilot jest całkowicie nieobecne.
403Użytkownik tokenu jest member (tylko odczyt) lub autopilot jest stopped (zatrzymane autopiloty są tylko do odczytu — wyłącznie usunięcie).
404Brak autopilotu o tym id lub użytkownik tokenu nie ma aktywnego członkostwa w jego koncie.
422Walidacja nie powiodła się — te same przyczyny co przy tworzeniu (name, limit dziennego tempa, ends_on, wymagania akcji końcowej, nieznane group_ids/course_id).

Trwale usuwa autopilot i jego powiązania z grupami; wygenerowane kampanie są odłączane (nie usuwane). Autopilotu w stanie running nie da się usunąć — najpierw go zatrzymaj. Uwierzytelnianie: Bearer; rola: admin/edytor. Trasa płaska (bez account_id).

Brak parametrów poza tokenem bearer.

NazwaGdzieTypWymaganeOpis
idpathstringtakId autopilotu (auto_… lub liczba całkowita).

Żądanie

Okno terminala
curl -X DELETE -H "Authorization: Bearer $TOKEN" \
https://platform.phishspot.com/api/v1/autopilots/9

Odpowiedź 204 No Content — puste ciało przy powodzeniu.

Kody statusu

KodKiedy
204Autopilot usunięty.
403Użytkownik tokenu jest member (tylko odczyt) na koncie autopilotu.
404Brak autopilotu o tym id lub użytkownik tokenu nie ma aktywnego członkostwa w jego koncie.
422Autopilot jest running — zatrzymaj go przed usunięciem. (Autopilot paused lub draft można usunąć bezpośrednio.)

Aktywuje autopilot: ustawia state na running (oznaczając started_at przy pierwszym uruchomieniu), aby platforma zaczęła generować i dostarczać kampanie ze skonfigurowaną kadencją. Użyj, aby przejść na żywo lub wznowić autopilot w stanie paused. Uwierzytelnianie: Bearer; rola: admin/edytor — a autopilot musi być edytowalny (nie stopped). Trasa płaska.

::: caution To akcja na żywo: udane wywołanie rozpoczyna wysyłkę prawdziwych symulowanych wiadomości phishingowych do wskazanych członków. :::

Brak parametrów poza tokenem bearer.

NazwaGdzieTypWymaganeOpis
idpathstringtakId autopilotu (auto_… lub liczba całkowita).

Żądanie

Okno terminala
curl -X POST -H "Authorization: Bearer $TOKEN" \
https://platform.phishspot.com/api/v1/autopilots/9/start

Odpowiedź 200 OK — obiekt autopilota z state: "running" (ten sam kształt co GET /autopilots/:id).

{
"id": 9,
"name": "Finance team — quarterly drip",
"state": "running",
"started_at": "2026-06-02T10:16:00Z",
"editable": true,
"progress_percentage": 100,
"daily_rate": 0.07
}

Kody statusu

KodKiedy
200Autopilot uruchomiony/wznowiony; teraz running.
403Użytkownik tokenu jest member (tylko odczyt) lub autopilot jest stopped (zatrzymanego autopilotu nie można uruchomić ponownie).
404Brak autopilotu o tym id lub użytkownik tokenu nie ma aktywnego członkostwa w jego koncie.

Wstrzymuje działający (running) autopilot: ustawia state na paused, więc nie są generowane nowe kampanie. Wznów później przez start. Uwierzytelnianie: Bearer; rola: admin/edytor — a autopilot musi być edytowalny (nie stopped). Trasa płaska.

Brak parametrów poza tokenem bearer.

NazwaGdzieTypWymaganeOpis
idpathstringtakId autopilotu (auto_… lub liczba całkowita).

Żądanie

Okno terminala
curl -X POST -H "Authorization: Bearer $TOKEN" \
https://platform.phishspot.com/api/v1/autopilots/9/pause

Odpowiedź 200 OK — obiekt autopilota z state: "paused" (ten sam kształt co GET /autopilots/:id).

{
"id": 9,
"name": "Finance team — quarterly drip",
"state": "paused",
"started_at": "2026-06-02T10:16:00Z",
"editable": true,
"progress_percentage": 92
}

Kody statusu

KodKiedy
200Autopilot wstrzymany.
403Użytkownik tokenu jest member (tylko odczyt) lub autopilot jest stopped.
404Brak autopilotu o tym id lub użytkownik tokenu nie ma aktywnego członkostwa w jego koncie.

Zatrzymuje autopilot na stałe: ustawia state na stopped. Zatrzymany autopilot staje się tylko do odczytu — nie można go już aktualizować, uruchamiać, wstrzymywać ani ponownie zatrzymywać, można go jedynie przeglądać lub usunąć. Uwierzytelnianie: Bearer; rola: admin/edytor — a autopilot musi być nadal edytowalny (nie już stopped). Trasa płaska.

Brak parametrów poza tokenem bearer.

NazwaGdzieTypWymaganeOpis
idpathstringtakId autopilotu (auto_… lub liczba całkowita).

Żądanie

Okno terminala
curl -X POST -H "Authorization: Bearer $TOKEN" \
https://platform.phishspot.com/api/v1/autopilots/9/stop

Odpowiedź 200 OK — obiekt autopilota z state: "stopped" i editable: false (ten sam kształt co GET /autopilots/:id).

{
"id": 9,
"name": "Finance team — quarterly drip",
"state": "stopped",
"started_at": "2026-06-02T10:16:00Z",
"editable": false,
"progress_percentage": null
}

Kody statusu

KodKiedy
200Autopilot zatrzymany.
403Użytkownik tokenu jest member (tylko odczyt) lub autopilot jest już stopped.
404Brak autopilotu o tym id lub użytkownik tokenu nie ma aktywnego członkostwa w jego koncie.

Dwa powiązane zasoby kontrolują, z których domen może wysyłać kampania:

  • Domeny platformy (pdm_…) to domeny atakującego/landingowe obsługiwane przez PhishSpot. Większość należy do platformy (“publiczne” lub przypisane “prywatne” domeny); klienci mogą też dostarczyć własne (BYOD) za pomocą provision_byod. Bezpośredni zapis rekordów domen platformy (POST/PATCH/DELETE /platform_domains) jest zarezerwowany dla użytkowników z rolą admin; provisioning domeny BYOD jest dostępny dla każdego członka konta.
  • Domeny zabezpieczone (sdm_…) to dowody własności DNS. Klient dodaje domenę, którą kontroluje, umieszcza rekord TXT i weryfikuje go — w ten sposób PhishSpot potwierdza, że nadawca może wysyłać “z” tej domeny.

Zwraca listę wszystkich domen platformy widocznych dla konta wywołującego tokena — wszystkie operacyjne domeny publiczne oraz wszystkie operacyjne domeny prywatne przypisane do konta. Wyniki są uporządkowane według nazwy. Uwierzytelnianie: Bearer; rola: odczyt (dowolna rola).

Brak parametrów poza tokenem bearer.

Żądanie

Okno terminala
curl -H "Authorization: Bearer $TOKEN" \
https://platform.phishspot.com/api/v1/platform_domains

Odpowiedź 200 OK — tablica JSON obiektów domen platformy (każdy obiekt używa tych samych pól, co poniższy punkt końcowy show).

PoleTypOpis
idintegerNumeryczny identyfikator. (W adresach URL używaj identyfikatora z prefiksem pdm_….)
namestringNazwa domeny (np. officelogin.in).
publicbooleanStarsza flaga publiczna z kolumny.
mailbooleanCzy jest to domena pocztowa platformy.
statestringStan cyklu życia. Jeden z pending, checking, confirmed, purchasing, purchased, configuring_dns, dns_pending, configuring_postal, active, failed.
expires_onstring|nullData wygaśnięcia rejestracji w formacie ISO8601 lub null.
metadataobjectDowolny JSON (szczegóły provisioningu Cloudflare/Postal, diagnostyka itp.).
created_atstringZnacznik czasu ISO8601.
updated_atstringZnacznik czasu ISO8601.
activebooleanTrue, gdy state == "active".
byodbooleanTrue dla rekordów klienta typu “bring your own domain”.
sending_blockedbooleanTrue, gdy domena jest aktywna, ale zablokowana przed rozpoczęciem nowych wysyłek.
nameserversarraySerwery nazw Cloudflare przypisane do strefy tej domeny (puste, dopóki nie zostaną przechwycone).
cloudflare_errorstring|nullUstawione, jeśli nie udało się utworzyć/odczytać strefy Cloudflare.
[
{
"id": 42,
"name": "officelogin.in",
"public": true,
"mail": false,
"state": "active",
"expires_on": "2027-03-01T00:00:00.000Z",
"metadata": {},
"created_at": "2026-01-10T09:00:00.000Z",
"updated_at": "2026-05-30T14:22:00.000Z",
"active": true,
"byod": false,
"sending_blocked": false,
"nameservers": [],
"cloudflare_error": null
}
]

Kody statusu

KodKiedy
200Domeny zwrócone (możliwe, że pusta tablica).

Pobiera pojedynczą domenę platformy po identyfikatorze. Przydatne do sprawdzenia stanu, serwerów nazw BYOD oraz sending_blocked przed wybraniem jej do kampanii. Uwierzytelnianie: Bearer; rola: odczyt (dowolna rola).

Parametry

NazwaGdzieTypWymaganeOpis
idpathstringtakIdentyfikator domeny platformy (pdm_… lub liczba całkowita).

Żądanie

Okno terminala
curl -H "Authorization: Bearer $TOKEN" \
https://platform.phishspot.com/api/v1/platform_domains/pdm_42

Odpowiedź 200 OK — pojedynczy obiekt domeny platformy (te same pola, co powyższy punkt końcowy listy).

{
"id": 42,
"name": "officelogin.in",
"public": true,
"mail": false,
"state": "active",
"expires_on": "2027-03-01T00:00:00.000Z",
"metadata": {},
"created_at": "2026-01-10T09:00:00.000Z",
"updated_at": "2026-05-30T14:22:00.000Z",
"active": true,
"byod": false,
"sending_blocked": false,
"nameservers": [],
"cloudflare_error": null
}

Kody statusu

KodKiedy
200Domena znaleziona.
404Brak domeny platformy o tym identyfikatorze.

Tworzy bezpośrednio rekord domeny należącej do platformy. Jest to operacja administracyjna służąca do zarządzania własną pulą domen platformy — klienci powinni zamiast tego używać provision_byod. Uwierzytelnianie: Bearer; rola: admin.

Parametry — opakowane w obiekt platform_domain.

NazwaGdzieTypWymaganeOpis
platform_domain.namebodystringtakNazwa domeny. Zamieniana na małe litery/przycinana; musi być prawidłową domeną (3–253 znaki, co najmniej jedna kropka, tylko a-z 0-9 . -, bez wiodącej/końcowej kropki ani myślnika, bez kolejnych ../--, etykiety ≤63 znaki). Musi być globalnie unikalna (bez rozróżniania wielkości liter).
platform_domain.publicbodybooleannieStarsza flaga publiczna.
platform_domain.metadatabodyobjectnieDowolne metadane JSON.
platform_domain.expires_onbodystringnieData wygaśnięcia rejestracji w formacie ISO8601.
`state`, `genre` i `source` nie są ustawialne przez API; rekord utworzony tutaj domyślnie przyjmuje `state: "active"`, `genre: "public"`, `source: "manual"`.

Żądanie

Okno terminala
curl -X POST -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{ "platform_domain": { "name": "secure-portal.co", "public": true } }' \
https://platform.phishspot.com/api/v1/platform_domains

Odpowiedź 201 Created — utworzony obiekt domeny platformy (te same pola, co punkt końcowy show).

{
"id": 77,
"name": "secure-portal.co",
"public": true,
"mail": false,
"state": "active",
"expires_on": null,
"metadata": {},
"created_at": "2026-06-02T10:00:00.000Z",
"updated_at": "2026-06-02T10:00:00.000Z",
"active": true,
"byod": false,
"sending_blocked": false,
"nameservers": [],
"cloudflare_error": null
}

Kody statusu

KodKiedy
201Domena utworzona.
403Wywołujący nie jest administratorem.
422Walidacja nieudana (np. pusta/zduplikowana/nieprawidłowa name). Treść: { "errors": { "name": ["..."] } }.

Aktualizuje rekord domeny należącej do platformy. Uwierzytelnianie: Bearer; rola: admin.

Parametry — ta sama opakowana treść platform_domain, co przy tworzeniu; wszystkie pola opcjonalne.

NazwaGdzieTypWymaganeOpis
idpathstringtakIdentyfikator domeny platformy (pdm_… lub liczba całkowita).
platform_domain.namebodystringnieNowa nazwa domeny (te same reguły walidacji, co przy tworzeniu).
platform_domain.publicbodybooleannieStarsza flaga publiczna.
platform_domain.metadatabodyobjectnieDowolne metadane JSON.
platform_domain.expires_onbodystringnieData wygaśnięcia rejestracji w formacie ISO8601.
Zmiana nazwy lub inna aktualizacja domeny powiązanej z trwającą (zablokowaną) kampanią jest odrzucana na poziomie modelu (`ActiveRecord::RecordNotDestroyed`), co objawia się jako błąd z zakresu 500, a nie 422. Unikaj edytowania domen przypisanych do działających kampanii.

Żądanie

Okno terminala
curl -X PATCH -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{ "platform_domain": { "expires_on": "2028-01-01T00:00:00Z" } }' \
https://platform.phishspot.com/api/v1/platform_domains/pdm_42

Odpowiedź 200 OK — zaktualizowany obiekt domeny platformy (te same pola, co punkt końcowy show).

Kody statusu

KodKiedy
200Domena zaktualizowana.
403Wywołujący nie jest administratorem.
404Brak domeny platformy o tym identyfikatorze.
422Walidacja nieudana. Treść: { "errors": { ... } }.

Usuwa domenę należącą do platformy. Domenę można usunąć tylko wtedy, gdy nie ma blokujących powiązań: domeny należące do platformy nie mogą mieć kampanii ani przypisanych kont; domeny BYOD nie mogą mieć aktywnych (trwających/wstrzymanych) kampanii. Uwierzytelnianie: Bearer; rola: admin.

Parametry

NazwaGdzieTypWymaganeOpis
idpathstringtakIdentyfikator domeny platformy (pdm_… lub liczba całkowita).

Żądanie

Okno terminala
curl -X DELETE -H "Authorization: Bearer $TOKEN" \
https://platform.phishspot.com/api/v1/platform_domains/pdm_42

Odpowiedź 204 No Content — pusta treść przy powodzeniu.

Kody statusu

KodKiedy
204Domena usunięta.
403Wywołujący nie jest administratorem.
404Brak domeny platformy o tym identyfikatorze.
422Domena nadal ma aktywne kampanie (lub inne blokujące powiązania). Treść: { "error": "Cannot delete platform domain with active campaigns" }.

Ponownie sprawdza stan provisioningu/kondycji BYOD domeny należącej do konta wywołującego, a następnie zwraca (przeładowaną) domenę. Użyj tego do odpytywania domeny BYOD po delegowaniu serwerów nazw: aktywna domena uruchamia kontrolę kondycji, a domena nadal w trakcie provisioningu odświeża swój status konfiguracji. Przejściowe błędy odświeżania są wyciszane, aby odpytywanie nigdy nie zwracało błędu — otrzymujesz po prostu ostatni utrwalony stan. Uwierzytelnianie: Bearer; rola: odczyt (dowolna rola), ale użytkownik tokena musi należeć do konta będącego właścicielem domeny.

Parametry

NazwaGdzieTypWymaganeOpis
idpathstringtakIdentyfikator domeny platformy (pdm_… lub liczba całkowita). Musi to być domena BYOD należąca do konta, do którego należy wywołujący.

Żądanie

Okno terminala
curl -X POST -H "Authorization: Bearer $TOKEN" \
https://platform.phishspot.com/api/v1/platform_domains/pdm_88/check

Odpowiedź 200 OK — odświeżony obiekt domeny platformy (te same pola, co punkt końcowy show). Obserwuj state, active, nameservers, sending_blocked oraz cloudflare_error, aby śledzić postęp.

{
"id": 88,
"name": "mail.acme-customer.com",
"public": false,
"mail": false,
"state": "dns_pending",
"expires_on": null,
"metadata": { "cloudflare_nameservers": ["kara.ns.cloudflare.com", "rob.ns.cloudflare.com"] },
"created_at": "2026-06-01T08:00:00.000Z",
"updated_at": "2026-06-02T09:30:00.000Z",
"active": false,
"byod": true,
"sending_blocked": false,
"nameservers": ["kara.ns.cloudflare.com", "rob.ns.cloudflare.com"],
"cloudflare_error": null
}

Kody statusu

KodKiedy
200Status odświeżony i domena zwrócona.
404Brak takiej domeny lub domena nie ma konta właściciela / wywołujący nie należy do jej konta właściciela.

POST /api/v1/accounts/:account_id/platform_domains/provision_byod

Dział zatytułowany „POST /api/v1/accounts/:account_id/platform_domains/provision_byod”

Provisionuje dla konta domenę wysyłkową klienta typu “bring your own domain” (BYOD). Tworzy prywatną domenę platformy BYOD w stanie provisioningu i zwraca serwery nazw Cloudflare, które właściciel domeny musi ustawić u swojego rejestratora; delegacja i weryfikacja kończą się następnie asynchronicznie (odpytuj za pomocą POST /platform_domains/:id/check). Idempotentne — ponowny provisioning domeny, którą konto już posiada, po prostu ponownie wyświetla jej serwery nazw. Uwierzytelnianie: Bearer; rola: dowolna rola, ale wywołujący musi należeć do account_id.

Parametry

NazwaGdzieTypWymaganeOpis
account_idpathstringtakIdentyfikator konta (acct_… lub liczba całkowita), do którego należy wywołujący.
domain_namebodystringtakDomena do provisioningu (np. mail.acme-customer.com). Zamieniana na małe litery/przycinana po stronie serwera. Nie opakowana w żaden obiekt — wysyłana jako klucz najwyższego poziomu.

Żądanie

Okno terminala
curl -X POST -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{ "domain_name": "mail.acme-customer.com" }' \
https://platform.phishspot.com/api/v1/accounts/11/platform_domains/provision_byod

Odpowiedź 201 Created — wyprovisionowany obiekt domeny platformy wraz ze wskazówkami dotyczącymi provisioningu. Wszystkie pola domeny platformy z punktu końcowego show oraz dodatkowo:

PoleTypOpis
nameserversarraySerwery nazw Cloudflare, które właściciel domeny musi ustawić u swojego rejestratora. (Obecne także w obiekcie bazowym; powtórzone na najwyższym poziomie dla wygody.)
next_stepstringCzytelna dla człowieka instrukcja opisująca zmianę u rejestratora oraz punkt końcowy check do odpytywania.
{
"id": 88,
"name": "mail.acme-customer.com",
"public": null,
"mail": false,
"state": "dns_pending",
"expires_on": null,
"metadata": { "cloudflare_nameservers": ["kara.ns.cloudflare.com", "rob.ns.cloudflare.com"] },
"created_at": "2026-06-02T09:00:00.000Z",
"updated_at": "2026-06-02T09:00:00.000Z",
"active": false,
"byod": true,
"sending_blocked": false,
"nameservers": ["kara.ns.cloudflare.com", "rob.ns.cloudflare.com"],
"cloudflare_error": null,
"next_step": "At the registrar for mail.acme-customer.com, replace the nameservers with the ones above, then poll POST /api/v1/platform_domains/pdm_88/check."
}

Kody statusu

KodKiedy
201Domena wyprovisionowana (lub ponownie wyświetlona, jeśli już należy do tego konta).
403Wywołujący nie należy do account_id (odmowa Pundit show?).
404account_id nie znaleziono wśród kont wywołującego. Treść: { "error": "Account not found" }.
422Provisioning odrzucony. Treść: { "error": "<message>" }, jeden z: pusta nazwa ("Domain name is required."), już zarejestrowana przez inne konto ("That domain is already registered in PhishSpot by another account.") lub nieprawidłowa domena ("That domain name is invalid.").

Zwraca listę zabezpieczonych (z potwierdzoną własnością) domen konta, od najnowszej. Opcjonalnie filtruje według stanu weryfikacji. Uwierzytelnianie: Bearer; rola: dowolna rola, ale wywołujący musi należeć do account_id.

Parametry

NazwaGdzieTypWymaganeOpis
account_idpathstringtakIdentyfikator konta (acct_… lub liczba całkowita), do którego należy wywołujący.
statequerystringnieFiltr według stanu weryfikacji. Jeden z pending, verified, failed. Pomiń, aby uzyskać wszystkie.

Żądanie

Okno terminala
curl -H "Authorization: Bearer $TOKEN" \
"https://platform.phishspot.com/api/v1/accounts/11/secured_domains?state=verified"

Odpowiedź 200 OK — tablica JSON obiektów domen zabezpieczonych.

PoleTypOpis
idintegerNumeryczny identyfikator. (W adresach URL używaj identyfikatora z prefiksem sdm_….)
account_idintegerIdentyfikator konta będącego właścicielem.
domainstringWeryfikowana domena (zamieniona na małe litery).
statestringStan weryfikacji: pending, verified lub failed.
verification_attemptsintegerLiczba wykonanych prób weryfikacji DNS.
verified_atstring|nullZnacznik czasu ISO8601 pomyślnej weryfikacji lub null.
created_atstringZnacznik czasu ISO8601.
updated_atstringZnacznik czasu ISO8601.
dns_recordobjectRekord TXT, który właściciel musi opublikować, aby udowodnić własność.
dns_record.typestringZawsze "TXT".
dns_record.namestringHost rekordu, np. _phishspot-verify.example.com.
dns_record.valuestringWartość rekordu, np. phishspot-verify=<64-hex-token>.
[
{
"id": 5,
"account_id": 11,
"domain": "acme-customer.com",
"state": "verified",
"verification_attempts": 2,
"verified_at": "2026-05-20T11:00:00.000Z",
"created_at": "2026-05-19T16:30:00.000Z",
"updated_at": "2026-05-20T11:00:00.000Z",
"dns_record": {
"type": "TXT",
"name": "_phishspot-verify.acme-customer.com",
"value": "phishspot-verify=3f9a...c2"
}
}
]

Kody statusu

KodKiedy
200Domeny zwrócone (możliwe, że pusta tablica).
403Wywołujący nie należy do account_id.
404account_id nie znaleziono wśród kont wywołującego. Treść: { "error": "Account not found" }.

Dodaje domenę kontrolowaną przez klienta i zwraca rekord TXT do opublikowania w celu weryfikacji własności. Domeny publicznych dostawców poczty (np. gmail.com) są odrzucane. Uwierzytelnianie: Bearer; rola: dowolna rola, ale wywołujący musi należeć do account_id.

Parametry — opakowane w obiekt secured_domain.

NazwaGdzieTypWymaganeOpis
account_idpathstringtakIdentyfikator konta (acct_… lub liczba całkowita), do którego należy wywołujący.
secured_domain.domainbodystringtakDomena do weryfikacji (np. acme-customer.com). Zamieniana na małe litery/przycinana; musi odpowiadać standardowemu formatowi domeny; musi być unikalna w obrębie konta (bez rozróżniania wielkości liter); nie może być zablokowaną domeną publicznego dostawcy poczty.

Żądanie

Okno terminala
curl -X POST -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{ "secured_domain": { "domain": "acme-customer.com" } }' \
https://platform.phishspot.com/api/v1/accounts/11/secured_domains

Odpowiedź 201 Created — utworzony obiekt domeny zabezpieczonej (te same pola, co punkt końcowy listy), z state: "pending" oraz świeżo wygenerowanym dns_record do opublikowania.

{
"id": 6,
"account_id": 11,
"domain": "acme-customer.com",
"state": "pending",
"verification_attempts": 0,
"verified_at": null,
"created_at": "2026-06-02T10:00:00.000Z",
"updated_at": "2026-06-02T10:00:00.000Z",
"dns_record": {
"type": "TXT",
"name": "_phishspot-verify.acme-customer.com",
"value": "phishspot-verify=3f9a...c2"
}
}

Kody statusu

KodKiedy
201Domena dodana; opublikuj zwrócony rekord TXT, a następnie wywołaj verify_dns.
403Wywołujący nie należy do account_id.
404account_id nie znaleziono wśród kont wywołującego. Treść: { "error": "Account not found" }.
422Walidacja nieudana — pusty/nieprawidłowy format, duplikat dla tego konta lub zablokowana domena publicznego dostawcy poczty. Treść: { "errors": { "domain": ["..."] } }.

Pobiera pojedynczą domenę zabezpieczoną po identyfikatorze, wraz z rekordem TXT potrzebnym do weryfikacji. Trasa płytka (nie zagnieżdżona pod kontem) — wywołujący musi należeć do konta będącego właścicielem. Uwierzytelnianie: Bearer; rola: dowolna rola (członek konta).

Parametry

NazwaGdzieTypWymaganeOpis
idpathstringtakIdentyfikator domeny zabezpieczonej (sdm_… lub liczba całkowita).

Żądanie

Okno terminala
curl -H "Authorization: Bearer $TOKEN" \
https://platform.phishspot.com/api/v1/secured_domains/sdm_6

Odpowiedź 200 OK — pojedynczy obiekt domeny zabezpieczonej (te same pola, co powyższy punkt końcowy listy).

Kody statusu

KodKiedy
200Domena znaleziona.
403Odmowa Pundit (zwykle nie powinna wystąpić — polityka zezwala każdemu członkowi).
404Brak takiej domeny lub wywołujący nie należy do konta będącego jej właścicielem.

Usuwa domenę zabezpieczoną. Zablokowane, dopóki jakakolwiek aktywna (trwająca/wstrzymana) kampania wysyła z adresu e-mail w tej domenie. Trasa płytka — wywołujący musi należeć do konta będącego właścicielem. Uwierzytelnianie: Bearer; rola: dowolna rola (członek konta).

Parametry

NazwaGdzieTypWymaganeOpis
idpathstringtakIdentyfikator domeny zabezpieczonej (sdm_… lub liczba całkowita).

Żądanie

Okno terminala
curl -X DELETE -H "Authorization: Bearer $TOKEN" \
https://platform.phishspot.com/api/v1/secured_domains/sdm_6

Odpowiedź 204 No Content — pusta treść przy powodzeniu.

Kody statusu

KodKiedy
204Domena usunięta.
403Odmowa Pundit (zwykle nie powinna wystąpić).
404Brak takiej domeny lub wywołujący nie należy do konta będącego jej właścicielem.
422Domena jest zweryfikowana i używana przez aktywne kampanie. Treść: { "error": "Cannot delete secured domain <domain> while it is used by active campaigns: <campaign names>" }.

Uruchamia weryfikację DNS: wyszukuje oczekiwany rekord TXT dla domeny i, jeśli go znajdzie, oznacza domenę jako verified. Wywołaj to po opublikowaniu rekordu TXT zwróconego przy tworzeniu. Zwraca (przeładowaną) domenę, abyś mógł odczytać wynikowy state. Trasa płytka — wywołujący musi należeć do konta będącego właścicielem. Uwierzytelnianie: Bearer; rola: dowolna rola (członek konta).

Parametry

NazwaGdzieTypWymaganeOpis
idpathstringtakIdentyfikator domeny zabezpieczonej (sdm_… lub liczba całkowita).

Żądanie

Okno terminala
curl -X POST -H "Authorization: Bearer $TOKEN" \
https://platform.phishspot.com/api/v1/secured_domains/sdm_6/verify_dns

Odpowiedź 200 OK — odświeżony obiekt domeny zabezpieczonej (te same pola, co punkt końcowy listy). Przy powodzeniu state zmienia się na "verified", a verified_at zostaje ustawione; w przeciwnym razie pozostaje pending/failed, a verification_attempts wzrasta.

{
"id": 6,
"account_id": 11,
"domain": "acme-customer.com",
"state": "verified",
"verification_attempts": 1,
"verified_at": "2026-06-02T10:05:00.000Z",
"created_at": "2026-06-02T10:00:00.000Z",
"updated_at": "2026-06-02T10:05:00.000Z",
"dns_record": {
"type": "TXT",
"name": "_phishspot-verify.acme-customer.com",
"value": "phishspot-verify=3f9a...c2"
}
}

Kody statusu

KodKiedy
200Weryfikacja przeprowadzona; sprawdź state w odpowiedzi.
403Odmowa Pundit (zwykle nie powinna wystąpić).
404Brak takiej domeny lub wywołujący nie należy do konta będącego jej właścicielem.

Zgłoszone wiadomości to podejrzane e-maile, które pracownicy oznaczyli — przekazane do skrzynki zgłoszeń konta (source: inbound_webhook) albo przesłane przez dodatek do Outlooka (source: outlook_addin). Poniższe punkty końcowe odczytu zwracają wyłącznie metadane (nadawca, temat, data odebrania, źródło, zgłaszający) — nigdy treści wiadomości, nagłówków ani załączników. Są ograniczone do kont, do których należy użytkownik wywołującego tokenu.

Wyświetla listę zgłoszonych wiadomości dla jednego konta, od najnowszych (sortowanie po received_at malejąco). Użyj go, aby zasilić kolejkę do weryfikacji lub zsynchronizować zgłoszenia z narzędziami SOC. Uwierzytelnianie: Bearer; rola: odczyt (dowolna rola).

Parametry

NazwaGdzieTypWymaganeOpis
account_idpathstringtakIdentyfikator konta (acct_… lub liczba całkowita). Musi być kontem, do którego należy użytkownik tokenu.
sourcequerystringnieFiltruj według źródła zgłoszenia. Jedna z wartości inbound_webhook, outlook_addin. Nieznana wartość zwraca 422. Pomiń, aby zwrócić wszystkie źródła.
limitqueryintegernieRozmiar strony. Domyślnie 50; ograniczony do zakresu 1500 (wartości <1 lub 0 przyjmują wartość 50, wartości >500 są ograniczane do 500).
pagequeryintegernieNumer strony liczony od 1. Domyślnie 1; wartości poniżej 1 są traktowane jako 1. Przesunięcie obliczane jest jako (page - 1) * limit.

Żądanie

Okno terminala
curl -H "Authorization: Bearer $TOKEN" \
"https://platform.phishspot.com/api/v1/accounts/11/reported_messages?source=outlook_addin&limit=25&page=1"

Odpowiedź 200 OK — tablica JSON obiektów metadanych zgłoszonych wiadomości (bez koperty). Każdy element zawiera następujące pola:

PoleTypOpis
idintegerIdentyfikator zgłoszonej wiadomości.
account_idintegerIdentyfikator konta właściciela.
from_emailstringAdres nadawcy zgłoszonego e-maila.
from_namestring | nullWyświetlana nazwa nadawcy, jeśli została przechwycona.
subjectstring | nullTemat zgłoszonego e-maila.
message_idstring | nullOryginalny Message-ID zgodny z RFC, jeśli został przechwycony.
sourcestringŹródło zgłoszenia: inbound_webhook lub outlook_addin.
received_atstring (ISO 8601)Kiedy oryginalny e-mail został odebrany.
created_atstring (ISO 8601)Kiedy zgłoszenie zostało przyjęte do PhishSpot.
from_domainstringCzęść domenowa adresu from_email zapisana małymi literami (tekst po @).
reporter_contact_emailstring | nullE-mail odbiorcy z konta, który dokonał zgłoszenia (dopasowany po from_email); null, gdy nie istnieje pasujący odbiorca.
[
{
"id": 4821,
"account_id": 11,
"from_email": "billing@suspicious-invoice.example",
"from_name": "Accounts Payable",
"subject": "Overdue invoice — action required",
"message_id": "<CADnf9x1@mail.suspicious-invoice.example>",
"source": "outlook_addin",
"received_at": "2026-05-28T09:14:00.000Z",
"created_at": "2026-05-28T09:15:32.000Z",
"from_domain": "suspicious-invoice.example",
"reporter_contact_email": "jane.doe@acme.test"
}
]

Kody statusu

KodKiedy
200Zwrócono zgłoszenia (tablica może być pusta).
403Użytkownik tokenu jest autoryzowany, ale Pundit odmawia AccountPolicy#show? dla tego konta.
404account_id nie jest kontem, do którego należy użytkownik tokenu (zwraca { "error": "Account not found" }).
422source jest podane, ale nie jest jednym z prawidłowych źródeł (zwraca { "error": "Unknown source …; valid sources: inbound_webhook, outlook_addin." }).

Pobiera metadane pojedynczej zgłoszonej wiadomości. Jest to trasa płytka — przyjmuje identyfikator zgłoszenia bezpośrednio, bez segmentu ścieżki account_id. Izolacja kont jest wymuszana po stronie serwera: wyszukiwanie jest ograniczone do kont użytkownika tokenu, więc żądanie zgłoszenia z innego konta zwraca 404. Uwierzytelnianie: Bearer; rola: odczyt (dowolna rola).

Parametry

NazwaGdzieTypWymaganeOpis
idpathstringtakIdentyfikator zgłoszonej wiadomości (rep_… lub liczba całkowita).

Brak parametrów poza tokenem bearer i identyfikatorem w ścieżce.

Żądanie

Okno terminala
curl -H "Authorization: Bearer $TOKEN" \
https://platform.phishspot.com/api/v1/reported_messages/rep_4821

Odpowiedź 200 OK — pojedynczy obiekt metadanych zgłoszonej wiadomości z tymi samymi polami co jeden element tablicy indeksu:

PoleTypOpis
idintegerIdentyfikator zgłoszonej wiadomości.
account_idintegerIdentyfikator konta właściciela.
from_emailstringAdres nadawcy zgłoszonego e-maila.
from_namestring | nullWyświetlana nazwa nadawcy, jeśli została przechwycona.
subjectstring | nullTemat zgłoszonego e-maila.
message_idstring | nullOryginalny Message-ID zgodny z RFC, jeśli został przechwycony.
sourcestringŹródło zgłoszenia: inbound_webhook lub outlook_addin.
received_atstring (ISO 8601)Kiedy oryginalny e-mail został odebrany.
created_atstring (ISO 8601)Kiedy zgłoszenie zostało przyjęte do PhishSpot.
from_domainstringCzęść domenowa adresu from_email zapisana małymi literami.
reporter_contact_emailstring | nullE-mail pasującego odbiorcy z konta lub null.
{
"id": 4821,
"account_id": 11,
"from_email": "billing@suspicious-invoice.example",
"from_name": "Accounts Payable",
"subject": "Overdue invoice — action required",
"message_id": "<CADnf9x1@mail.suspicious-invoice.example>",
"source": "outlook_addin",
"received_at": "2026-05-28T09:14:00.000Z",
"created_at": "2026-05-28T09:15:32.000Z",
"from_domain": "suspicious-invoice.example",
"reporter_contact_email": "jane.doe@acme.test"
}

Kody statusu

KodKiedy
200Zgłoszenie zostało znalezione i zwrócone.
404Nie istnieje zgłoszenie o tym identyfikatorze w obrębie kont użytkownika tokenu (zwraca { "error": "Resource not found" }).

Tylko dodatek. Przyjmuje nowo zgłoszoną wiadomość z dodatku do Outlooka. Ten punkt końcowy nie używa zwykłego tokenu bearer API ani Pundita — wymaga tokenu uprawnień dodatku (reported_messages:create), którego przypięty account_id odpowiada :account_id w adresie URL. Standardowe integracje go nie wywołują; do odczytu służą dwa powyższe punkty końcowe. Treść jest opakowana w obiekt reported_message (dozwolone klucze: from_email, from_name, subject, plain_body, html_body, received_at, message_id, headers oraz tablica attachments), a pomyślne wywołanie zwraca 201 Created z { "id": "rep_…", "url": "…" }. Niezgodność uprawnień/konta zwraca 403; błędy walidacji zwracają 422.

Kody statusu

KodKiedy
201Zgłoszenie zostało utworzone.
403Token nie ma uprawnienia reported_messages:create albo jego przypięty account_id nie odpowiada adresowi URL.
404account_id nie odpowiada istniejącemu kontu (zwraca { "error": "Account not found" }).
422Usługa przyjmowania odrzuciła ładunek (zwraca { "error": "…" }).

Biblioteka mediów przechowuje hostowane pliki graficzne i CSS dla konta. Prześlij plik raz, a następnie odwołuj się do zwróconego url w treści HTML wiadomości kampanii, na stronach docelowych i w szablonach. Zawsze osadzaj hostowany url — klienty pocztowe (Gmail, Outlook) usuwają wbudowane identyfikatory URI data:, więc obrazy osadzone jako base64 nie zostaną wyświetlone.

Dozwolone typy zawartości: image/png, image/jpg, image/jpeg, image/gif, image/svg+xml oraz text/css. Maksymalny rozmiar pliku to 5 MB. Każdy element mediów musi mieć unikalną (bez rozróżniania wielkości liter) name w obrębie swojego konta.

Wszystkie punkty końcowe mediów mogą być używane przez dowolnego członka konta (bez ograniczenia do roli admin/edytor). Punkty końcowe kolekcji (index, create) są zagnieżdżone pod kontem; punkty końcowe pojedynczego elementu (show, update, destroy) są płytkie (/media/:id) i rozpoznają tylko media należące do jednego z kont użytkownika tokenu — wszystko inne zwraca 404.

Wyświetla wszystkie elementy mediów dla konta, od najnowszego. Użyj go, aby znaleźć hostowany url pliku przed osadzeniem go w kampanii. Uwierzytelnianie: bearer; rola: odczyt (dowolna rola).

Parametry

NazwaGdzieTypWymaganeOpis
account_idpathstringtakIdentyfikator konta (acct_… lub liczba całkowita).

Żądanie

Okno terminala
curl -H "Authorization: Bearer $TOKEN" \
https://platform.phishspot.com/api/v1/accounts/11/media

Odpowiedź 200 OK — tablica JSON obiektów mediów (każdy ma kształt opisany poniżej).

PoleTypOpis
idintegerIdentyfikator elementu mediów.
account_idintegerIdentyfikator konta będącego właścicielem.
namestringNazwa wyświetlana (unikalna w obrębie konta, bez rozróżniania wielkości liter).
created_atstringZnacznik czasu ISO 8601.
updated_atstringZnacznik czasu ISO 8601.
urlstring|nullAdres URL hostowanego pliku (ścieżka względna); osadź go w HTML. null, jeśli żaden plik nie jest dołączony.
filenamestring|nullOryginalna nazwa przesłanego pliku.
content_typestring|nullTyp MIME, np. image/png.
[
{
"id": 42,
"account_id": 11,
"name": "phishing-logo",
"created_at": "2026-06-02T10:15:00.000Z",
"updated_at": "2026-06-02T10:15:00.000Z",
"url": "/rails/active_storage/blobs/redirect/eyJfcmFpbHMi.../phishing-logo.png",
"filename": "phishing-logo.png",
"content_type": "image/png"
}
]

Kody statusu

KodKiedy
200Zwrócono listę mediów.
404account_id nie jest jednym z kont użytkownika tokenu.

Przesyła nowy plik do biblioteki mediów konta. To żądanie jest typu multipart/form-data, a nie JSON — plik jest wysyłany jako pole formularza, a nie jako ciąg base64 w treści JSON. Uwierzytelnianie: bearer; rola: dowolny członek konta.

Parametry (pola formularza opakowane w obiekt medium[...])

NazwaGdzieTypWymaganeOpis
account_idpathstringtakIdentyfikator konta (acct_… lub liczba całkowita).
medium[name]bodystringtakNazwa wyświetlana; musi być unikalna (bez rozróżniania wielkości liter) w obrębie konta.
medium[attachment]bodyfiletakPlik do przesłania. Musi być jednym z image/png, image/jpg, image/jpeg, image/gif, image/svg+xml, text/css oraz ≤ 5 MB.

Żądanie

Zwróć uwagę na flagi -F (multipart). Nie ustawiaj Content-Type: application/json; pozwól curl ustawić granicę multipart. Plik jest odczytywany z dysku za pomocą @/path.

Okno terminala
curl -X POST -H "Authorization: Bearer $TOKEN" \
-F "medium[name]=phishing-logo" \
-F "medium[attachment]=@./phishing-logo.png;type=image/png" \
https://platform.phishspot.com/api/v1/accounts/11/media

Odpowiedź 201 Created — utworzony obiekt mediów (taki sam kształt jak element listy powyżej).

PoleTypOpis
idintegerIdentyfikator nowego elementu mediów.
account_idintegerIdentyfikator konta będącego właścicielem.
namestringNazwa wyświetlana.
created_atstringZnacznik czasu ISO 8601.
updated_atstringZnacznik czasu ISO 8601.
urlstringAdres URL hostowanego pliku — osadź go w treści HTML kampanii.
filenamestringZapisana nazwa pliku.
content_typestringTyp MIME przesłanego pliku.
{
"id": 42,
"account_id": 11,
"name": "phishing-logo",
"created_at": "2026-06-02T10:15:00.000Z",
"updated_at": "2026-06-02T10:15:00.000Z",
"url": "/rails/active_storage/blobs/redirect/eyJfcmFpbHMi.../phishing-logo.png",
"filename": "phishing-logo.png",
"content_type": "image/png"
}

Kody statusu

KodKiedy
201Utworzono media.
404account_id nie jest jednym z kont użytkownika tokenu.
422Walidacja nie powiodła się — brakująca/pusta name, zduplikowana name w koncie, brakujący attachment, niedozwolony typ zawartości lub plik większy niż 5 MB. Treść: { "errors": { … } }.

Przykładowa treść 422 (brakujący załącznik):

{ "errors": { "attachment": ["can't be blank"] } }

Zwraca pojedynczy element mediów według identyfikatora. Rozpoznaje tylko media należące do jednego z kont użytkownika tokenu. Uwierzytelnianie: bearer; rola: odczyt (dowolna rola).

Parametry

NazwaGdzieTypWymaganeOpis
idpathstringtakIdentyfikator elementu mediów (med_… lub liczba całkowita).

Brak parametrów poza tokenem bearer.

Żądanie

Okno terminala
curl -H "Authorization: Bearer $TOKEN" \
https://platform.phishspot.com/api/v1/media/42

Odpowiedź 200 OK — obiekt mediów (te same pola co w odpowiedzi POST powyżej).

{
"id": 42,
"account_id": 11,
"name": "phishing-logo",
"created_at": "2026-06-02T10:15:00.000Z",
"updated_at": "2026-06-02T10:15:00.000Z",
"url": "/rails/active_storage/blobs/redirect/eyJfcmFpbHMi.../phishing-logo.png",
"filename": "phishing-logo.png",
"content_type": "image/png"
}

Kody statusu

KodKiedy
200Zwrócono element mediów.
404Żaden element mediów o tym identyfikatorze nie należy do jednego z kont użytkownika tokenu.

Aktualizuje element mediów. W praktyce tylko name ma znaczenie; można też ponownie przesłać plik, wysyłając nowy attachment (multipart). Uwierzytelnianie: bearer; rola: dowolny członek konta.

Parametry (opakowane w obiekt medium[...])

NazwaGdzieTypWymaganeOpis
idpathstringtakIdentyfikator elementu mediów (med_… lub liczba całkowita).
medium[name]bodystringnieNowa nazwa wyświetlana; musi pozostać unikalna (bez rozróżniania wielkości liter) w obrębie konta.
medium[attachment]bodyfileniePlik zastępczy (wysyłany jako multipart). Te same ograniczenia typu zawartości i 5 MB co przy tworzeniu.

Żądanie

Zmianę samej nazwy można wysłać jako JSON:

Okno terminala
curl -X PATCH -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{ "medium": { "name": "phishing-logo-v2" } }' \
https://platform.phishspot.com/api/v1/media/42

Aby zastąpić plik, wyślij zamiast tego multipart (-F "medium[attachment]=@./new.png;type=image/png").

Odpowiedź 200 OK — zaktualizowany obiekt mediów (te same pola co w show).

{
"id": 42,
"account_id": 11,
"name": "phishing-logo-v2",
"created_at": "2026-06-02T10:15:00.000Z",
"updated_at": "2026-06-02T11:02:00.000Z",
"url": "/rails/active_storage/blobs/redirect/eyJfcmFpbHMi.../phishing-logo.png",
"filename": "phishing-logo.png",
"content_type": "image/png"
}

Kody statusu

KodKiedy
200Zaktualizowano media.
404Żaden element mediów o tym identyfikatorze nie należy do jednego z kont użytkownika tokenu.
422Walidacja nie powiodła się — pusta name, zduplikowana name lub (przy zastępowaniu pliku) niedozwolony typ zawartości / powyżej 5 MB. Treść: { "errors": { … } }.

Trwale usuwa element mediów i dołączony do niego plik. Każda treść HTML kampanii nadal odwołująca się do url pliku przestanie działać, więc najpierw usuń odwołania. Uwierzytelnianie: bearer; rola: dowolny członek konta.

Parametry

NazwaGdzieTypWymaganeOpis
idpathstringtakIdentyfikator elementu mediów (med_… lub liczba całkowita).

Brak parametrów poza tokenem bearer.

Żądanie

Okno terminala
curl -X DELETE -H "Authorization: Bearer $TOKEN" \
https://platform.phishspot.com/api/v1/media/42

Odpowiedź 204 No Content — pusta treść.

Kody statusu

KodKiedy
204Usunięto media.
404Żaden element mediów o tym identyfikatorze nie należy do jednego z kont użytkownika tokenu.

Zarządzaj subskrypcjami wychodzących webhooków i przeglądaj zdarzenia, które PhishSpot wygenerował dla konta. Punkt końcowy to adres URL, który rejestrujesz, aby otrzymywać podpisane żądania HTTP POST; zdarzenie to niezmienny zapis czegoś, co się wydarzyło (utworzono kampanię, usunięto odbiorcę itp.), rozsyłany do każdego włączonego punktu końcowego subskrybującego jego typ. Mechanikę dostarczania — harmonogram ponawiania, nagłówek HMAC X-Webhook-Signature oraz sposób jego weryfikacji za pomocą signing_secret — opisano w Dostarczanie webhooków i podpisy.

Dostępne wartości event_type_ids. Punkt końcowy subskrybuje, wymieniając jeden lub więcej z tych ciągów. Te same ciągi pojawiają się jako event_type w emitowanych zdarzeniach:

Typ zdarzeniaWyzwalane gdy
campaign.createdUtworzono kampanię.
campaign.updatedZaktualizowano kampanię.
campaign.deletedUsunięto kampanię.
contact.createdDodano odbiorcę.
contact.updatedZaktualizowano odbiorcę.
contact.deletedUsunięto odbiorcę.
deliverable.createdUtworzono pozycję dostarczenia kampanii (wysyłka do jednego odbiorcy).
deliverable.updatedPozycja dostarczenia zmienia stan (wysłana, otwarta, kliknięta itp.).
spam_whitelist.updatedZmienia się migawka listy spamu/dozwolonych nadawców konta.

Wyświetla każdy punkt końcowy webhooka zarejestrowany na koncie, od najnowszych. Użyj tego, aby wyrenderować interfejs zarządzania lub uzgodnić lokalną konfigurację. Uwierzytelnianie: Bearer; rola: odczyt (dowolna rola).

Parametry

NazwaGdzieTypWymaganeOpis
account_idpathstringtakId konta (acct_… lub liczba całkowita).

Żądanie

Okno terminala
curl -H "Authorization: Bearer $TOKEN" \
https://platform.phishspot.com/api/v1/accounts/11/webhooks/endpoints

Odpowiedź 200 OK — tablica JSON obiektów punktów końcowych. signing_secret jest pomijany w tym widoku listy (jest zwracany wyłącznie w widokach pojedynczego punktu końcowego).

PoleTypOpis
idintegerId punktu końcowego. Segment ścieżki/widoku akceptuje również formę z prefiksem whep_….
account_idintegerId konta będącego właścicielem.
namestringCzytelna etykieta punktu końcowego.
urlstringDocelowy adres URL, który otrzymuje żądania POST.
event_type_idsarray of stringSubskrybowane typy zdarzeń (zobacz tabelę powyżej).
enabledbooleanCzy dostarczenia są obecnie wysyłane.
api_versionintegerWersja schematu treści (obecnie 1).
created_atstringZnacznik czasu ISO 8601.
updated_atstringZnacznik czasu ISO 8601.
total_deliveriesintegerLiczba wszystkich rekordów dostarczenia dla tego punktu końcowego.
successful_deliveriesintegerLiczba dostarczeń w statusie delivered.
failed_deliveriesintegerLiczba dostarczeń w statusie failed.
[
{
"id": 42,
"account_id": 11,
"name": "Production listener",
"url": "https://hooks.example.com/phishspot",
"event_type_ids": ["campaign.created", "deliverable.updated"],
"enabled": true,
"api_version": 1,
"created_at": "2026-05-30T09:14:22Z",
"updated_at": "2026-06-01T12:03:10Z",
"total_deliveries": 128,
"successful_deliveries": 121,
"failed_deliveries": 7
}
]

Kody statusu

KodKiedy
200Zwrócono punkty końcowe (pusta tablica, jeśli brak).
403Wywołujący nie jest członkiem account_id.
404account_id nie istnieje lub wywołujący nie jest członkiem.

Rejestruje nowy punkt końcowy webhooka. Odpowiedź zawiera signing_secret dokładnie raz — zapisz go natychmiast, ponieważ jest potrzebny do weryfikacji podpisów dostarczeń i nigdy więcej nie jest pokazywany w całości, z wyjątkiem operacji show/update/toggle na tym samym punkcie końcowym. Uwierzytelnianie: Bearer; rola: odczyt (dowolna rola — wystarczy członkostwo w koncie).

Parametry

Parametry treści są opakowane w obiekt webhook_endpoint.

NazwaGdzieTypWymaganeOpis
account_idpathstringtakId konta (acct_… lub liczba całkowita).
webhook_endpoint.namebodystringtakCzytelna etykieta. Walidowana pod kątem obecności.
webhook_endpoint.urlbodystringtakDocelowy adres URL. Musi być prawidłowym adresem URL http/https i przejść opisane powyżej kontrole bezpieczeństwa.
webhook_endpoint.event_type_idsbodyarray of stringtakJeden lub więcej typów zdarzeń do subskrybowania (zobacz tabelę). Walidowane pod kątem obecności — wymagany co najmniej jeden.
webhook_endpoint.enabledbodybooleannieCzy punkt końcowy ma startować jako włączony. Domyślnie true.

Żądanie

Okno terminala
curl -X POST -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{
"webhook_endpoint": {
"name": "Production listener",
"url": "https://hooks.example.com/phishspot",
"event_type_ids": ["campaign.created", "deliverable.updated"],
"enabled": false
}
}' \
https://platform.phishspot.com/api/v1/accounts/11/webhooks/endpoints

Odpowiedź 201 Created — utworzony punkt końcowy, w tym jednorazowy signing_secret. Pola są takie same jak w widoku listy, plus signing_secret:

PoleTypOpis
idintegerId punktu końcowego.
account_idintegerId konta będącego właścicielem.
namestringCzytelna etykieta.
urlstringDocelowy adres URL (przycięty/znormalizowany).
event_type_idsarray of stringSubskrybowane typy zdarzeń.
enabledbooleanCzy dostarczenia są aktywne.
api_versionintegerWersja schematu treści (1).
created_atstringZnacznik czasu ISO 8601.
updated_atstringZnacznik czasu ISO 8601.
signing_secretstring64-znakowy sekret HMAC w formacie hex. Zwracany tutaj — zapisz go teraz.
total_deliveriesinteger0 dla nowego punktu końcowego.
successful_deliveriesinteger0 dla nowego punktu końcowego.
failed_deliveriesinteger0 dla nowego punktu końcowego.
{
"id": 42,
"account_id": 11,
"name": "Production listener",
"url": "https://hooks.example.com/phishspot",
"event_type_ids": ["campaign.created", "deliverable.updated"],
"enabled": false,
"api_version": 1,
"created_at": "2026-06-02T10:00:00Z",
"updated_at": "2026-06-02T10:00:00Z",
"signing_secret": "9f2c1e7b4a6d8f0c3e5a7b9d1f3c5e7a9b1d3f5c7e9a1b3d5f7c9e1a3b5d7f9c",
"total_deliveries": 0,
"successful_deliveries": 0,
"failed_deliveries": 0
}

Kody statusu

KodKiedy
201Utworzono punkt końcowy.
403Wywołujący nie jest członkiem account_id.
404account_id nie istnieje lub wywołujący nie jest członkiem.
422Walidacja nie powiodła się — brak name/url/event_type_ids, nieprawidłowy adres URL lub adres URL wskazujący na localhost / prywatny IP / host *.phishspot.com.

Pobiera pojedynczy punkt końcowy, w tym jego pełny signing_secret i statystyki dostarczeń z całego okresu. Użyj tego, aby ponownie odczytać sekret, jeśli go zgubisz, lub aby monitorować kondycję dostarczeń. Uwierzytelnianie: Bearer; rola: odczyt (dowolna rola — musisz być członkiem konta będącego właścicielem).

Parametry

NazwaGdzieTypWymaganeOpis
idpathstringtakId punktu końcowego (whep_… lub liczba całkowita).

Brak parametrów poza tokenem bearer i id w ścieżce.

Żądanie

Okno terminala
curl -H "Authorization: Bearer $TOKEN" \
https://platform.phishspot.com/api/v1/webhooks/endpoints/whep_8xk2p9

Odpowiedź 200 OK — jeden obiekt punktu końcowego z tymi samymi polami co odpowiedź na tworzenie (zawiera signing_secret).

{
"id": 42,
"account_id": 11,
"name": "Production listener",
"url": "https://hooks.example.com/phishspot",
"event_type_ids": ["campaign.created", "deliverable.updated"],
"enabled": true,
"api_version": 1,
"created_at": "2026-05-30T09:14:22Z",
"updated_at": "2026-06-01T12:03:10Z",
"signing_secret": "9f2c1e7b4a6d8f0c3e5a7b9d1f3c5e7a9b1d3f5c7e9a1b3d5f7c9e1a3b5d7f9c",
"total_deliveries": 128,
"successful_deliveries": 121,
"failed_deliveries": 7
}

Kody statusu

KodKiedy
200Zwrócono punkt końcowy.
403Wywołujący nie jest członkiem konta będącego właścicielem punktu końcowego.
404Brak punktu końcowego o tym id.

Aktualizuje nazwę punktu końcowego, adres URL, subskrybowane typy zdarzeń lub flagę włączenia. signing_secret nie jest regenerowany i nie może zostać zmieniony za pomocą tego wywołania. Uwierzytelnianie: Bearer; rola: odczyt (dowolna rola — musisz być członkiem konta będącego właścicielem).

Parametry

Parametry treści są opakowane w obiekt webhook_endpoint; wyślij tylko te pola, które chcesz zmienić.

NazwaGdzieTypWymaganeOpis
idpathstringtakId punktu końcowego (whep_… lub liczba całkowita).
webhook_endpoint.namebodystringnieNowa etykieta. Nie może zostać wyczyszczona (walidowana pod kątem obecności).
webhook_endpoint.urlbodystringnieNowy docelowy adres URL. Ponownie walidowany pod kątem bezpieczeństwa (te same reguły co przy tworzeniu).
webhook_endpoint.event_type_idsbodyarray of stringnieZastępczy zestaw subskrybowanych typów zdarzeń. Nie może zostać opróżniony.
webhook_endpoint.enabledbodybooleannieWłącz/wyłącz.

Żądanie

Okno terminala
curl -X PATCH -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{
"webhook_endpoint": {
"event_type_ids": ["campaign.created", "campaign.updated", "campaign.deleted"]
}
}' \
https://platform.phishspot.com/api/v1/webhooks/endpoints/whep_8xk2p9

Odpowiedź 200 OK — zaktualizowany obiekt punktu końcowego (te same pola co show, w tym signing_secret).

{
"id": 42,
"account_id": 11,
"name": "Production listener",
"url": "https://hooks.example.com/phishspot",
"event_type_ids": ["campaign.created", "campaign.updated", "campaign.deleted"],
"enabled": true,
"api_version": 1,
"created_at": "2026-05-30T09:14:22Z",
"updated_at": "2026-06-02T11:20:45Z",
"signing_secret": "9f2c1e7b4a6d8f0c3e5a7b9d1f3c5e7a9b1d3f5c7e9a1b3d5f7c9e1a3b5d7f9c",
"total_deliveries": 128,
"successful_deliveries": 121,
"failed_deliveries": 7
}

Kody statusu

KodKiedy
200Zaktualizowano punkt końcowy.
403Wywołujący nie jest członkiem konta będącego właścicielem.
404Brak punktu końcowego o tym id.
422Walidacja nie powiodła się — pusty name, pusty event_type_ids lub nieprawidłowy/niebezpieczny url.

Trwale usuwa punkt końcowy i wszystkie jego rekordy dostarczenia. Same zdarzenia nie są usuwane. Uwierzytelnianie: Bearer; rola: odczyt (dowolna rola — musisz być członkiem konta będącego właścicielem).

Parametry

NazwaGdzieTypWymaganeOpis
idpathstringtakId punktu końcowego (whep_… lub liczba całkowita).

Brak parametrów poza tokenem bearer i id w ścieżce.

Żądanie

Okno terminala
curl -X DELETE -H "Authorization: Bearer $TOKEN" \
https://platform.phishspot.com/api/v1/webhooks/endpoints/whep_8xk2p9

Odpowiedź 204 No Content — pusta treść w przypadku powodzenia.

Kody statusu

KodKiedy
204Usunięto punkt końcowy.
403Wywołujący nie jest członkiem konta będącego właścicielem.
404Brak punktu końcowego o tym id.

Przełącza flagę enabled punktu końcowego — włącza wyłączony punkt końcowy lub wyłącza włączony. Użyj tego, aby wstrzymać/wznowić dostarczenia bez usuwania punktu końcowego ani utraty jego sekretu. Uwierzytelnianie: Bearer; rola: odczyt (dowolna rola — musisz być członkiem konta będącego właścicielem).

Parametry

NazwaGdzieTypWymaganeOpis
idpathstringtakId punktu końcowego (whep_… lub liczba całkowita).

Brak parametrów poza tokenem bearer i id w ścieżce — nowy stan jest wyprowadzany z bieżącego.

Żądanie

Okno terminala
curl -X POST -H "Authorization: Bearer $TOKEN" \
https://platform.phishspot.com/api/v1/webhooks/endpoints/whep_8xk2p9/toggle

Odpowiedź 200 OK — punkt końcowy z przełączoną wartością enabled (te same pola co show, w tym signing_secret).

{
"id": 42,
"account_id": 11,
"name": "Production listener",
"url": "https://hooks.example.com/phishspot",
"event_type_ids": ["campaign.created", "deliverable.updated"],
"enabled": false,
"api_version": 1,
"created_at": "2026-05-30T09:14:22Z",
"updated_at": "2026-06-02T11:30:00Z",
"signing_secret": "9f2c1e7b4a6d8f0c3e5a7b9d1f3c5e7a9b1d3f5c7e9a1b3d5f7c9e1a3b5d7f9c",
"total_deliveries": 128,
"successful_deliveries": 121,
"failed_deliveries": 7
}

Kody statusu

KodKiedy
200Stan przełączony; zwrócono zaktualizowany punkt końcowy.
403Wywołujący nie jest członkiem konta będącego właścicielem.
404Brak punktu końcowego o tym id.

Wyświetla zdarzenia wygenerowane dla konta, od najnowszych, ze stronicowaniem. Każde zdarzenie rejestruje, co się wydarzyło, i dołącza liczby dostarczeń przypadające na zdarzenie. Użyj tego, aby skontrolować, co PhishSpot próbował wysłać, niezależnie od jakiegokolwiek pojedynczego punktu końcowego. Uwierzytelnianie: Bearer; rola: odczyt (dowolna rola).

Parametry

NazwaGdzieTypWymaganeOpis
account_idpathstringtakId konta (acct_… lub liczba całkowita).
event_typequerystringnieFiltruj do pojedynczego typu zdarzenia (np. deliverable.updated). Pomiń, aby uwzględnić wszystkie typy.
pagequeryintegernieNumer strony. Domyślnie 1.
per_pagequeryintegernieLiczba elementów na stronę. Domyślnie 50.

Żądanie

Okno terminala
curl -H "Authorization: Bearer $TOKEN" \
"https://platform.phishspot.com/api/v1/accounts/11/webhooks/events?event_type=deliverable.updated&page=1&per_page=50"

Odpowiedź 200 OK — tablica JSON obiektów zdarzeń.

PoleTypOpis
idintegerId zdarzenia. Segment widoku akceptuje również formę z prefiksem/surową.
account_idintegerId konta będącego właścicielem.
subject_idintegerId rekordu, którego dotyczy zdarzenie (kampania, odbiorca, pozycja dostarczenia, …).
subject_typestringNazwa klasy podmiotu (np. Campaign, Contact, Deliverable).
event_typestringJeden z typów zdarzeń z tabeli powyżej.
api_versionintegerWersja schematu treści (1).
uuidstringStabilne unikalne id tego zdarzenia (używane również jako payload.id).
created_atstringZnacznik czasu ISO 8601.
updated_atstringZnacznik czasu ISO 8601.
dataobjectDane specyficzne dla zdarzenia opisujące zmianę (kształt różni się w zależności od event_type).
payloadobjectDokładna treść JSON dostarczana do punktów końcowych (zobacz poniżej).
deliveriesobjectLiczby dostarczeń przypadające na zdarzenie.
deliveries.totalintegerWszystkie rekordy dostarczenia dla tego zdarzenia.
deliveries.deliveredintegerDostarczenia w statusie delivered.
deliveries.failedintegerDostarczenia w statusie failed.
deliveries.pendingintegerDostarczenia w statusie pending.

Obiekt payload to dokładnie to, co otrzymują odbiorniki, o następującym kształcie: id (uuid zdarzenia), type (event_type), created_at (ISO 8601), data (takie samo jak data na najwyższym poziomie) oraz api_version.

[
{
"id": 9001,
"account_id": 11,
"subject_id": 305,
"subject_type": "Deliverable",
"event_type": "deliverable.updated",
"api_version": 1,
"uuid": "3f1c8a02-7d4e-4b9a-9c1e-2a6b5d8f0e11",
"created_at": "2026-06-02T09:58:12Z",
"updated_at": "2026-06-02T09:58:12Z",
"data": { "deliverable_id": "dlv_4k2m", "state": "clicked" },
"payload": {
"id": "3f1c8a02-7d4e-4b9a-9c1e-2a6b5d8f0e11",
"type": "deliverable.updated",
"created_at": "2026-06-02T09:58:12Z",
"data": { "deliverable_id": "dlv_4k2m", "state": "clicked" },
"api_version": 1
},
"deliveries": { "total": 2, "delivered": 1, "failed": 0, "pending": 1 }
}
]

Kody statusu

KodKiedy
200Zwrócono zdarzenia (pusta tablica, jeśli żadne nie pasuje).
403Wywołujący nie jest członkiem account_id.
404account_id nie istnieje lub wywołujący nie jest członkiem.

Pobiera pojedyncze zdarzenie po id, w tym jego pełne data, dostarczony payload oraz liczby dostarczeń. Użyj tego, aby sprawdzić dokładnie, co zostało wysłane w przypadku jednego wystąpienia. Uwierzytelnianie: Bearer; rola: odczyt (dowolna rola — musisz być członkiem konta będącego właścicielem).

Parametry

NazwaGdzieTypWymaganeOpis
idpathstringtakId zdarzenia (z prefiksem lub surowa liczba całkowita).

Brak parametrów poza tokenem bearer i id w ścieżce.

Żądanie

Okno terminala
curl -H "Authorization: Bearer $TOKEN" \
https://platform.phishspot.com/api/v1/webhooks/events/9001

Odpowiedź 200 OK — jeden obiekt zdarzenia, o identycznym kształcie jak pojedynczy element tablicy indeksu powyżej.

{
"id": 9001,
"account_id": 11,
"subject_id": 305,
"subject_type": "Deliverable",
"event_type": "deliverable.updated",
"api_version": 1,
"uuid": "3f1c8a02-7d4e-4b9a-9c1e-2a6b5d8f0e11",
"created_at": "2026-06-02T09:58:12Z",
"updated_at": "2026-06-02T09:58:12Z",
"data": { "deliverable_id": "dlv_4k2m", "state": "clicked" },
"payload": {
"id": "3f1c8a02-7d4e-4b9a-9c1e-2a6b5d8f0e11",
"type": "deliverable.updated",
"created_at": "2026-06-02T09:58:12Z",
"data": { "deliverable_id": "dlv_4k2m", "state": "clicked" },
"api_version": 1
},
"deliveries": { "total": 2, "delivered": 1, "failed": 0, "pending": 1 }
}

Kody statusu

KodKiedy
200Zwrócono zdarzenie.
403Wywołujący nie jest członkiem konta będącego właścicielem zdarzenia.
404Brak zdarzenia o tym id.

Zwraca metadane bieżącego wydania dodatku Outlook. Nie wymaga uwierzytelniania. Buforowane na ~5 minut.

Parametry: brak.

Okno terminala
curl https://platform.phishspot.com/api/v1/outlook/version

Odpowiedź 200 OK

PoleTypOpis
lateststringNajnowsza wersja dodatku.
min_supportedstringNajstarsza wersja, która nadal może być uruchamiana.
bundle_filenamestringNazwa pliku pakietu sideload.
bundle_sha256stringSHA-256 pakietu.
{ "latest": "1.1.0", "min_supported": "1.0.0", "bundle_filename": "phishspot-outlook-sideload-v1.1.0.zip", "bundle_sha256": "" }

Przydatne dla narzędzi inwentaryzacyjnych weryfikujących, którą wersję dodatku powinny uruchamiać Twoje urządzenia. Zobacz Rozdział 20.

27.16 Pobieranie białej listy antyspamowej (osobny system tokenów)

Dział zatytułowany „27.16 Pobieranie białej listy antyspamowej (osobny system tokenów)”

Samoobsługowy URL dla administratora poczty z Rozdziału 22 korzysta z innego schematu — 64-znakowego tokenu osadzonego w ścieżce, bez nagłówka Authorization:

NazwaGdzieTypWymaganeOpis
tokenpathstring (64 hex)takToken białej listy z panelu Integracje.
formatpathenumnieJeden z txt (domyślny), json, csv, md, microsoft365, google-workspace, mimecast, proofpoint, postfix, spamassassin.

Posiadanie URL-a jest jedynym poświadczeniem — traktuj go jak hasło i rotuj z poziomu Ustawienia konta → Integracje → Biała lista filtra antyspamowego, jeśli wycieknie.

Throttling Rack::Attack obowiązuje per źródłowe IP dla punktów końcowych bez uwierzytelniania oraz per token dla tych uwierzytelnionych:

PowierzchniaLimit
Generowanie kodu parowania Outlook10 / minutę / IP
Odpytywanie kodu parowania Outlook60 / minutę / IP
Przyjmowanie zgłoszeń phishingowych (dodatek)30 / minutę / IP
Pobieranie białej listy antyspamowej60 / minutę / token

Przekroczenie limitu zwraca 429 Too Many Requests z nagłówkiem Retry-After. Ogólne uwierzytelnione API nie podlega innym limitom zapytań poza ochroną przed nadużyciami na poziomie infrastruktury; utrzymuj użycie poniżej kilkuset żądań/minutę/token lub skontaktuj się z nami, aby je zwiększyć.