NetSendo

Dokumentacja REST API NetSendo

Wszystkie endpointy publicznego API wraz z uwierzytelnianiem, zakresami, limitami żądań, błędami i przykładami.

Napisane dla NetSendo 2.7.0 i sprawdzone z jego kodem źródłowym (trasy, kontrolery i model klucza API).

Przegląd

API jest częścią każdej instalacji NetSendo, zarówno SILVER, jak i GOLD. Działa na Twoim własnym serwerze pod adresem https://your-domain.com/api/v1, posługuje się formatem JSON i działa na koncie, do którego należy klucz API. Serwer MCP i node n8n korzystają z tych samych endpointów. Nieliczne wywołania obsługujące funkcje GOLD, na przykład testy A/B, bez aktywnej licencji GOLD zwracają 402.

W każdym żądaniu wysyłaj Authorization: Bearer ze swoim kluczem i Accept: application/json, żeby błędy walidacji wracały jako JSON, a w żądaniach z treścią także Content-Type: application/json.

Sprawdź swój klucz

GET /api/v1/account zwraca konto powiązane z kluczem i wersję NetSendo. Integracje używają go do testu połączenia.

curl https://your-domain.com/api/v1/account \
  -H "Authorization: Bearer ns_live_YOUR_KEY" \
  -H "Accept: application/json"

# 200 OK
{
  "data": {
    "id": 1,
    "name": "Anna Admin",
    "email": "admin@example.com",
    "version": "2.7.0"
  }
}

Uwierzytelnianie i klucze API

Klucze tworzysz w panelu NetSendo w sekcji Ustawienia → Klucze API. Nadaj każdemu kluczowi nazwę, wybierz jego zakresy i, jeśli chcesz, datę wygaśnięcia. Klucz jest pokazywany tylko raz, przy tworzeniu; NetSendo przechowuje wyłącznie jego skrót SHA-256 i zapisuje, kiedy był ostatnio użyty.

Klucz zaczyna się od ns_live_, po którym następują 32 losowe znaki. Przekazuj go w nagłówku Authorization jako token Bearer. Klucze w parametrach adresu URL nie są przyjmowane.

Authorization: Bearer ns_live_YOUR_KEY

Zaznacz przy kluczu opcję Klucz MCP, aby mógł go używać wbudowany test połączenia MCP. Podłączanie asystentów AI opisuje dokumentacja serwera MCP.

Gdy uwierzytelnianie się nie powiedzie

API odpowiada kodem 401 z jednym z tych komunikatów:

  • Missing or invalid Authorization header. Use: Bearer <api_key>
  • Invalid API key format. Key should start with ns_live_
  • Invalid API key
  • API key has expired

Zakresy

Każdy klucz ma zestaw zakresów. Endpoint, który wymaga zakresu, jakiego klucz nie ma, odpowiada 403 Forbidden.

ZakresNa co pozwala
subscribers:readOdczyt listy blokad, eksport członków listy wprost w odpowiedzi, odczyt historii aktywności subskrybenta
subscribers:writeTworzenie, edycja i usuwanie subskrybentów, tworzenie zbiorcze, zastępowanie tagów subskrybenta, dodawanie i zdejmowanie adresów z listy blokad
lists:readRaporty higieny list i weryfikacja adresów, podgląd importu, aktywność i zaangażowanie listy, harmonogram wysyłki, domyślne ustawienia list, formularze, wiadomości systemowe i strony systemowe
lists:writeTworzenie, zmiana i usuwanie list; import; czyszczenie i deduplikacja; zbiorcze zmiany członkostwa; tagi i pola własne; harmonogram wysyłki i domyślne ustawienia list; formularze; wiadomości i strony systemowe
tags:readMożna go wybrać; w wersji 2.7.0 nie wymaga go żaden endpoint (do odczytu tagów wystarczy ważny klucz)
notifications:writeTworzenie powiadomień w centrum powiadomień właściciela konta
webhooks:readMożna go wybrać; w wersji 2.7.0 nie wymaga go żaden endpoint (do odczytu webhooków wystarczy ważny klucz)
webhooks:writeTworzenie, zmiana, usuwanie i testowanie webhooków oraz generowanie nowego sekretu do podpisu
email:readStatus e-maili wysłanych przez API, lista skrzynek nadawczych
email:writeWysyłka pojedynczych i zbiorczych e-maili
sms:readStatus SMS-ów wysłanych przez API, lista dostawców SMS
sms:writeWysyłka pojedynczych i zbiorczych SMS-ów
messages:readPodgląd kampanii i liczba odbiorców, szablony e-mail, kategorie szablonów i zapisane bloki
messages:writeTworzenie, zmiana, usuwanie, planowanie, wysyłka, test i duplikowanie kampanii; testy A/B; szablony i zapisane bloki
funnels:readReguły automatyzacji, ich opcje i dzienniki
funnels:writeTworzenie, zmiana, usuwanie, aktywacja i wstrzymywanie lejków i ich kroków, dodawanie do nich subskrybentów; tworzenie i zmiana reguł automatyzacji
  • Zakres zapisu obejmuje zakres odczytu tego samego zasobu: klucz z lists:write może też wywoływać endpointy wymagające lists:read.
  • Klucz utworzony bez zaznaczenia żadnego zakresu otrzymuje wszystkie 16 zakresów.
  • Endpointy oznaczone w tabelach poniżej jako dowolny ważny klucz sprawdzają tylko, czy klucz jest ważny i nie wygasł. Należą do nich listowanie i odczyt subskrybentów, list, tagów, pól własnych, kampanii, lejków, testów A/B i webhooków. Każdy endpoint zwraca wyłącznie dane konta, do którego należy klucz.

Limity żądań

API przyjmuje 3000 żądań na minutę na klucz API. Trasy bez klucza (endpointy zapisu na listę i pobieranie eksportu przez podpisany link) są liczone według adresu IP z tym samym limitem.

Odpowiedzi zawierają nagłówki X-RateLimit-Limit i X-RateLimit-Remaining. Po przekroczeniu limitu API odpowiada 429 Too Many Requests z nagłówkiem Retry-After podającym czas w sekundach.

Przy dużych zadaniach używaj endpointów zbiorczych zamiast wielu pojedynczych wywołań: do 1000 subskrybentów na jedno wywołanie POST /subscribers/batch, 5000 wierszy na import i 5000 kontaktów na operację na członkostwie.

Błędy

Błędy to obiekty JSON z krótką etykietą error i czytelnym komunikatem message:

{
  "error": "Forbidden",
  "message": "API key does not have subscribers:write permission"
}

Błędy walidacji mają standardowy format Laravela: message oraz obiekt errors z tablicą komunikatów dla każdego pola. Wysyłaj Accept: application/json; bez tego nagłówka nieudana walidacja może zwrócić przekierowanie zamiast JSON-a.

{
  "message": "The email field must be a valid email address.",
  "errors": {
    "email": ["The email field must be a valid email address."]
  }
}

Od NetSendo 2.4.0 wywołania obsługujące funkcje GOLD bez aktywnej licencji GOLD (brak klucza, SILVER albo GOLD po terminie) zwracają 402 Payment Required. Odpowiedź mówi, której funkcji odmówiono; message jest w domyślnym języku instancji (APP_LOCALE):

{
  "error": "Payment Required",
  "code": "gold_required",
  "message": "“A/B tests” requires the GOLD licence. Upgrade on the Licence page to use it.",
  "feature": "ab_tests",
  "required_plan": "GOLD",
  "upgrade_url": "https://your-domain.com/license"
}
StatusZnaczenie
200Sukces
201Utworzono
202Przyjęto i dodano do kolejki (e-maile, SMS-y, eksport CSV)
401Brak klucza API albo klucz w złym formacie, nieznany lub wygasły
402Wywołanie korzysta z funkcji GOLD, a instalacja nie ma aktywnej licencji GOLD
403Klucz nie ma zakresu wymaganego przez endpoint
404Zasób nie istnieje na tym koncie
409Konflikt, na przykład usuwanie listy, która wciąż ma członków, bez confirm=1 albo uruchamianie lejka lub testu A/B w niewłaściwym stanie
422Walidacja nie powiodła się albo zasób nie jest gotowy (kampania bez list, skrzynki lub treści)
429Przekroczono limit żądań
500Błąd serwera; szczegóły są w logu instancji

Paginacja

Endpointy zwracające zbiory elementów domyślnie dzielą je na strony po 25 (tagi: po 50). Rozmiar strony zmienisz parametrem per_page, a stronę wybierzesz parametrem page. Odpowiedź zawiera elementy w data, linki do stron w links i liczniki, takie jak current_page, per_page i total, w meta. Eksport listy zwracany wprost w odpowiedzi stronicuje za to kursorem: przekaż limit (maksymalnie 5000) i, dopóki has_more ma wartość true, zwrócony next_cursor.

Endpointy

Wszystkie ścieżki poniżej są względne wobec Twojej instancji, na przykład https://your-domain.com/api/v1/subscribers. Części w nawiasach klamrowych zastąp identyfikatorami ze swojego konta. Wiersze oznaczone GOLD wymagają aktywnej licencji GOLD i bez niej zwracają 402; opisy grup wymieniają wywołania, które wymagają GOLD tylko dla niektórych wartości.

Konto i test połączenia

Sprawdź, do jakiego konta należy klucz. /api/mcp/test to test połączenia używany przez klientów MCP.

MetodaŚcieżkaZakres
GET/api/v1/accountdowolny ważny klucz
GET/api/mcp/testdowolny ważny klucz

Subskrybenci

Twórz, odczytuj, aktualizuj i usuwaj kontakty. POST /subscribers wymaga contact_list_id oraz email dla listy e-mail lub phone dla listy SMS; pola opcjonalne to first_name, last_name, status, source, tags (ID tagów), custom_fields, ip_address, user_agent i device. Jeśli adres już istnieje, zostaje dodany do listy lub ponownie aktywowany, a nie zduplikowany. GET /subscribers filtrujesz parametrami contact_list_id, status, email (dopasowanie częściowe), tag_id, sort_by i sort_order. POST /subscribers/{id}/tags zastępuje wszystkie tagi subskrybenta. Usuwanie jest miękkie (soft delete).

MetodaŚcieżkaZakres
GET/api/v1/subscribersdowolny ważny klucz
POST/api/v1/subscriberssubscribers:write
POST/api/v1/subscribers/batchsubscribers:write
GET/api/v1/subscribers/{id}dowolny ważny klucz
GET/api/v1/subscribers/by-email/{email}dowolny ważny klucz
PUT, PATCH/api/v1/subscribers/{id}subscribers:write
DELETE/api/v1/subscribers/{id}subscribers:write
POST/api/v1/subscribers/{id}/tagssubscribers:write
GET/api/v1/subscribers/{id}/activitysubscribers:read

Listy kontaktów

Zarządzaj listami e-mail i SMS. PUT scala ustawienia: pola, których nie przekażesz, pozostają bez zmian. Ustawienia obejmują double_opt_in, default_mailbox_id, default_sms_provider_id, max_subscribers, resubscription_behavior, signups_blocked, webhook_url i webhook_events. Usunięcie listy, która ma członków, zwraca 409, dopóki nie przekażesz confirm=1; sami subskrybenci zostają na koncie. /stats zwraca członków według statusu, zaangażowanie, przyrost z 30 dni i ustawienia wpływające na wysyłkę.

MetodaŚcieżkaZakres
GET/api/v1/listsdowolny ważny klucz
POST/api/v1/listslists:write
GET/api/v1/lists/{id}dowolny ważny klucz
PUT, PATCH/api/v1/lists/{id}lists:write
DELETE/api/v1/lists/{id}lists:write
GET/api/v1/lists/{id}/statsdowolny ważny klucz
GET/api/v1/lists/{id}/subscribersdowolny ważny klucz
GET/api/v1/lists/{id}/cron-settingslists:read
PUT/api/v1/lists/{id}/cron-settingslists:write
GET/api/v1/settings/list-defaultslists:read
PUT/api/v1/settings/list-defaultslists:write

Import i eksport

Importuj CSV, TSV, JSON lub zwykłą listę adresów (do 5000 wierszy na żądanie) z mapowaniem kolumn i opcjami bezpieczeństwa, takimi jak pomijanie adresów błędnych, jednorazowych, funkcyjnych lub z listy blokad i poprawianie literówek w domenach. Najpierw sprawdź podgląd przez /import/preview. GET /export zwraca członków od razu jako JSON, CSV lub NDJSON ze stronicowaniem kursorem; POST /export zleca pełny eksport CSV i wysyła właścicielowi konta link do pobrania.

MetodaŚcieżkaZakres
POST/api/v1/lists/{id}/import/previewlists:read
POST/api/v1/lists/{id}/importlists:write
GET/api/v1/lists/{id}/exportsubscribers:read
GET/api/v1/lists/{id}/export/fieldsdowolny ważny klucz
POST/api/v1/lists/{id}/exportdowolny ważny klucz
GET/api/v1/exports/downloadbrak (podpisany URL)

Higiena listy

GET /hygiene ocenia listę w skali od 0 do 100 i liczy kategorie problemów, takie jak błędna składnia, literówki w domenach, domeny jednorazowe, adresy funkcyjne, duplikaty, twarde odbicia, kontakty nigdy nieaktywne i uśpione. clean wypisuje, odłącza od listy, taguje, usuwa lub dodaje do listy blokad wybrane kategorie; dedupe scala kontakty prowadzące do tej samej skrzynki; verify sprawdza składnię i rekordy MX. clean i dedupe domyślnie działają z dry_run=true, a akcje destrukcyjne wymagają confirm=true.

MetodaŚcieżkaZakres
GET/api/v1/lists/hygiene-optionsdowolny ważny klucz
GET/api/v1/lists/{id}/hygienelists:read
POST/api/v1/lists/{id}/hygiene/cleanlists:write
POST/api/v1/lists/{id}/hygiene/dedupelists:write
POST/api/v1/lists/{id}/hygiene/verifylists:read

Członkostwo na listach (zbiorczo)

Dodawaj istniejące kontakty do listy, odłączaj je, zmieniaj ich status, przenoś lub kopiuj na inną listę albo dodawaj i usuwaj tagi, do 5000 kontaktów na wywołanie. Kontakty wybierasz przez subscriber_ids, emails lub filter (status, tagi, zaangażowanie, data zapisu). Przenoszenie i kopiowanie obejmuje tylko kontakty aktywne na liście źródłowej i wymaga list tego samego kanału. Przekaż trigger_automations: false, aby przenieść osoby bez ponownego uruchamiania sekwencji powitalnych.

MetodaŚcieżkaZakres
POST/api/v1/lists/{id}/memberslists:write
POST/api/v1/lists/{id}/members/removelists:write
POST/api/v1/lists/{id}/members/statuslists:write
POST/api/v1/lists/{id}/members/movelists:write
POST/api/v1/lists/{id}/members/copylists:write
POST/api/v1/lists/{id}/members/tagslists:write

Aktywność i zaangażowanie

/activity łączy zapisy, potwierdzenia, wypisy, otwarcia, kliknięcia i wyniki wysyłek listy w jeden strumień, który filtrujesz parametrami days, limit i types[]. /engagement zwraca strukturę odbiorców, przyrost i odpływ z serią dzienną, wskaźniki otwarć i kliknięć, najlepsze wiadomości i linki oraz wielkość nieaktywnej części listy.

MetodaŚcieżkaZakres
GET/api/v1/lists/{id}/activitylists:read
GET/api/v1/lists/{id}/engagementlists:read

Lista blokad

Lista adresów dla całego konta, na które nie wolno wysyłać; respektuje ją każdy import. POST przyjmuje emails[], opcjonalny reason i unsubscribe_existing (domyślnie true, wypisuje adres ze wszystkich list). DELETE zdejmuje blokadę, ale nikogo ponownie nie zapisuje.

MetodaŚcieżkaZakres
GET/api/v1/suppressionssubscribers:read
POST/api/v1/suppressionssubscribers:write
DELETE/api/v1/suppressionssubscribers:write

Tagi i pola własne

Tagi i pola własne odczytasz dowolnym ważnym kluczem; do ich tworzenia, zmiany i usuwania potrzebny jest lists:write. /custom-fields/placeholders zwraca wszystkie wstawki, których możesz użyć w treści e-maili i SMS-ów, np. [[fname]], [[unsubscribe]] i po jednej dla każdego pola własnego. Usunięcie pola własnego, które jest wciąż używane, zwraca 409.

MetodaŚcieżkaZakres
GET/api/v1/tagsdowolny ważny klucz
GET/api/v1/tags/{id}dowolny ważny klucz
POST/api/v1/tagslists:write
PUT, PATCH/api/v1/tags/{id}lists:write
DELETE/api/v1/tags/{id}lists:write
GET/api/v1/custom-fieldsdowolny ważny klucz
GET/api/v1/custom-fields/placeholdersdowolny ważny klucz
GET/api/v1/custom-fields/{id}dowolny ważny klucz
POST/api/v1/custom-fieldslists:write
PUT, PATCH/api/v1/custom-fields/{id}lists:write
DELETE/api/v1/custom-fields/{id}lists:write

Wysyłka e-maili

POST /email/send dodaje do kolejki jeden e-mail: wymagane są email, subject i content (HTML); opcjonalne są preheader, plain_text, mailbox_id, subscriber_id, schedule_at, tracking_enabled i dodatkowe headers. POST /email/batch wysyła jedną wiadomość do listy (list_id lub contact_list_ids), do tag_ids lub do subscriber_ids, z opcjonalnym excluded_list_ids. Oba zwracają 202 z ID, które możesz przekazać do /email/status/{id}.

MetodaŚcieżkaZakres
POST/api/v1/email/sendemail:write
POST/api/v1/email/batchemail:write
GET/api/v1/email/status/{id}email:read
GET/api/v1/email/mailboxesemail:read

Wysyłka SMS-ów

POST /sms/send dodaje do kolejki jeden SMS: wymagane są phone i message (do 1600 znaków); opcjonalne są provider_id, subscriber_id i schedule_at. POST /sms/batch wysyła do list_id, tag_ids lub subscriber_ids. Wstawki, takie jak [[fname]], są uzupełniane osobno dla każdego odbiorcy.

MetodaŚcieżkaZakres
POST/api/v1/sms/sendsms:write
POST/api/v1/sms/batchsms:write
GET/api/v1/sms/status/{id}sms:read
GET/api/v1/sms/providerssms:read

Kampanie (messages)

W API kampanie nazywają się messages, a każda ścieżka /messages działa też pod /campaigns. Utwórz kampanię z subject, channel (email lub sms) i type (broadcast lub autoresponder), potem ustaw listy odbiorców i wykluczenia, a na koniec wyślij ją lub zaplanuj. Wysyłka i planowanie zwracają 422, dopóki kampania nie ma listy, skrzynki nadawczej (e-mail) lub treści. schedule przyjmuje scheduled_at i opcjonalną timezone. Listę kampanii filtrujesz parametrami channel, type, status i search. Zapisanie kampanii z włączonym ab_test_config o co najmniej dwóch wariantach wymaga GOLD; bez licencji API zwraca 402, zanim cokolwiek zapisze.

MetodaŚcieżkaZakres
GET/api/v1/messagesdowolny ważny klucz
POST/api/v1/messagesmessages:write
GET/api/v1/messages/{id}dowolny ważny klucz
PUT, PATCH/api/v1/messages/{id}messages:write
DELETE/api/v1/messages/{id}messages:write
POST/api/v1/messages/{id}/listsmessages:write
POST/api/v1/messages/{id}/exclusionsmessages:write
POST/api/v1/messages/{id}/schedulemessages:write
POST/api/v1/messages/{id}/sendmessages:write
POST/api/v1/messages/{id}/testmessages:write
GET, POST/api/v1/messages/{id}/previewmessages:read
GET/api/v1/messages/{id}/statsdowolny ważny klucz
GET/api/v1/messages/{id}/recipients-countmessages:read
POST/api/v1/messages/{id}/duplicatemessages:write
POST/api/v1/messages/{id}/toggle-activemessages:write
POST/api/v1/messages/{id}/resend-failedmessages:write
POST/api/v1/messages/{id}/send-to-missedmessages:write

Testy A/B

Utwórz test dla kampanii, dodaj warianty, uruchom go i zakończ, a potem odczytaj wyniki. Utworzenie testu, dodanie wariantów i uruchomienie wymagają GOLD; zakończenie testu, odczyt wyników i usunięcie działają w każdym planie, więc test, który już trwał, dobiegnie końca także po wygaśnięciu licencji GOLD.

MetodaŚcieżkaZakres
GET/api/v1/ab-testsdowolny ważny klucz
POST/api/v1/ab-testsmessages:writeGOLD
GET/api/v1/ab-tests/{id}dowolny ważny klucz
POST/api/v1/ab-tests/{id}/variantsmessages:writeGOLD
POST/api/v1/ab-tests/{id}/startmessages:writeGOLD
POST/api/v1/ab-tests/{id}/endmessages:write
GET/api/v1/ab-tests/{id}/resultsdowolny ważny klucz
DELETE/api/v1/ab-tests/{id}messages:write

Lejki

Sekwencje automatyzacji złożone z kroków. Lejek startuje od list_signup, tag_added, form_submit lub manual. Dodawaj, zmieniaj i usuwaj kroki, aktywuj lub wstrzymuj lejek, ręcznie dodawaj do niego subskrybenta (lejek musi być aktywny, inaczej 409) i odczytuj jego statystyki. Lejki należą do SILVER; dodanie kroku typu split (podział A/B) albo zamiana kroku na taki krok wymaga GOLD, a kroki podziału, które lejek już ma, można dalej edytować.

MetodaŚcieżkaZakres
GET/api/v1/funnelsdowolny ważny klucz
POST/api/v1/funnelsfunnels:write
GET/api/v1/funnels/{id}dowolny ważny klucz
PUT, PATCH/api/v1/funnels/{id}funnels:write
DELETE/api/v1/funnels/{id}funnels:write
POST/api/v1/funnels/{id}/stepsfunnels:write
PUT/api/v1/funnels/{id}/steps/{step}funnels:write
DELETE/api/v1/funnels/{id}/steps/{step}funnels:write
POST/api/v1/funnels/{id}/subscribersfunnels:write
POST/api/v1/funnels/{id}/activatefunnels:write
POST/api/v1/funnels/{id}/pausefunnels:write
GET/api/v1/funnels/{id}/statsdowolny ważny klucz

Reguły automatyzacji

Reguły w postaci: gdy zajdzie wyzwalacz i warunki są spełnione, wykonaj akcje. /automations/options zwraca dostępne wyzwalacze, warunki i akcje. Reguły można włączać i wyłączać, duplikować oraz odczytywać ich dzienniki wykonań.

MetodaŚcieżkaZakres
GET/api/v1/automations/optionsfunnels:read
GET/api/v1/automationsfunnels:read
POST/api/v1/automationsfunnels:write
GET/api/v1/automations/{id}funnels:read
PUT, PATCH/api/v1/automations/{id}funnels:write
DELETE/api/v1/automations/{id}funnels:write
POST/api/v1/automations/{id}/togglefunnels:write
POST/api/v1/automations/{id}/duplicatefunnels:write
GET/api/v1/automations/{id}/logsfunnels:read

Webhooki

Rejestruj adresy URL, które otrzymują podpisane powiadomienia o zdarzeniach. Sekret do podpisu jest zwracany tylko przy tworzeniu webhooka lub generowaniu nowego sekretu. /webhooks/events zwraca nazwy zdarzeń, a /test wysyła testowe zdarzenie. Dokumentacja webhooków opisuje każde zdarzenie, jego payload i sposób weryfikacji podpisów.

MetodaŚcieżkaZakres
GET/api/v1/webhooks/eventsdowolny ważny klucz
GET/api/v1/webhooksdowolny ważny klucz
POST/api/v1/webhookswebhooks:write
GET/api/v1/webhooks/{id}dowolny ważny klucz
PUT, PATCH/api/v1/webhooks/{id}webhooks:write
DELETE/api/v1/webhooks/{id}webhooks:write
POST/api/v1/webhooks/{id}/testwebhooks:write
POST/api/v1/webhooks/{id}/regenerate-secretwebhooks:write

Szablony i zapisane bloki

Szablony e-mail, ich kategorie i zapisane bloki kreatora e-maili. /templates/{id}/preview renderuje szablon.

MetodaŚcieżkaZakres
GET/api/v1/templatesmessages:read
POST/api/v1/templatesmessages:write
GET/api/v1/templates/{id}messages:read
PUT, PATCH/api/v1/templates/{id}messages:write
DELETE/api/v1/templates/{id}messages:write
POST/api/v1/templates/{id}/duplicatemessages:write
POST/api/v1/templates/{id}/previewmessages:read
GET/api/v1/template-categoriesmessages:read
GET/api/v1/template-blocks/typesmessages:read
GET/api/v1/template-blocksmessages:read
POST/api/v1/template-blocksmessages:write
PUT, PATCH/api/v1/template-blocks/{id}messages:write
DELETE/api/v1/template-blocks/{id}messages:write

Wiadomości i strony systemowe

Wiadomości, które NetSendo wysyła, i strony, które pokazuje przy zapisie, potwierdzeniu i wypisie, wskazywane przez slug. Bez list_id pracujesz na globalnej wersji domyślnej; z list_id pierwsza zmiana tworzy wersję dla tej listy, a DELETE ją usuwa, więc lista wraca do wersji domyślnej. Globalnych wersji domyślnych nie można usunąć.

MetodaŚcieżkaZakres
GET/api/v1/system-emailslists:read
GET/api/v1/system-emails/{slug}lists:read
PUT/api/v1/system-emails/{slug}lists:write
PUT/api/v1/system-emails/{slug}/activelists:write
DELETE/api/v1/system-emails/{slug}lists:write
GET/api/v1/system-pageslists:read
GET/api/v1/system-pages/{slug}lists:read
PUT/api/v1/system-pages/{slug}lists:write
DELETE/api/v1/system-pages/{slug}lists:write

Formularze zapisu

Twórz, zmieniaj, duplikuj i usuwaj formularze zapisu do swoich list.

MetodaŚcieżkaZakres
GET/api/v1/formslists:read
POST/api/v1/formslists:write
GET/api/v1/forms/{id}lists:read
PUT, PATCH/api/v1/forms/{id}lists:write
DELETE/api/v1/forms/{id}lists:write
POST/api/v1/forms/{id}/duplicatelists:write

Powiadomienia

Twórz powiadomienia w centrum powiadomień właściciela konta: title (wymagany), message, type (info, success, warning lub error), list_id lub action_url oraz dowolne data. Do subskrybentów nic nie jest wysyłane.

MetodaŚcieżkaZakres
GET/api/v1/notificationsdowolny ważny klucz
POST/api/v1/notificationsnotifications:write

Endpointy pomocnicze dla integracji

Endpointy używane przez wtyczki do WordPressa, WooCommerce i inne: strony zewnętrzne, sprawdzanie wersji wtyczek i połączenia. /api/webhooks/purchase przyjmuje zakupy z integracji e-commerce i wymaga ważnego klucza API.

MetodaŚcieżkaZakres
GET/api/v1/external-pagesdowolny ważny klucz
GET/api/v1/plugin/check-versiondowolny ważny klucz
POST/api/v1/plugin/heartbeatdowolny ważny klucz
GET/api/v1/plugin/connectionsdowolny ważny klucz
DELETE/api/v1/plugin/connections/{id}dowolny ważny klucz
POST/api/v1/plugin/connections/{id}/disconnectdowolny ważny klucz
POST/api/webhooks/purchasedowolny ważny klucz

NetSendo Brain

Asystent AI wbudowany w NetSendo: czat, rozmowy, baza wiedzy, plany działań i ich zatwierdzanie, ustawienia i połączenie z Telegramem. POST /brain/chat przyjmuje message o długości do 5000 znaków i opcjonalne conversation_id. Czat w trybie ręcznym należy do SILVER. Samodzielna praca Brain wymaga GOLD: PUT /brain/settings zwraca 402 dla work_mode semi_auto lub autonomous, agent_modes innych niż ręczny, telegram_bot_token i kluczy do wyszukiwania w sieci (perplexity_api_key, serpapi_api_key). Wpis w bazie wiedzy mieści do 10 000 znaków, a z GOLD do 100 000; z GOLD GET /brain/knowledge?search= znajduje też wpisy po znaczeniu (wyszukiwanie semantyczne, od 2.7.0).

MetodaŚcieżkaZakres
POST/api/v1/brain/chatdowolny ważny klucz
GET/api/v1/brain/conversationsdowolny ważny klucz
GET/api/v1/brain/conversations/{id}dowolny ważny klucz
GET/api/v1/brain/knowledgedowolny ważny klucz
POST/api/v1/brain/knowledgedowolny ważny klucz
PUT/api/v1/brain/knowledge/{id}dowolny ważny klucz
DELETE/api/v1/brain/knowledge/{id}dowolny ważny klucz
GET/api/v1/brain/plansdowolny ważny klucz
GET/api/v1/brain/plans/{id}dowolny ważny klucz
POST/api/v1/brain/plans/{id}/approvedowolny ważny klucz
GET/api/v1/brain/settingsdowolny ważny klucz
PUT/api/v1/brain/settingsdowolny ważny klucz
POST/api/v1/brain/telegram/link-codedowolny ważny kluczGOLD
POST/api/v1/brain/telegram/disconnectdowolny ważny klucz
POST/api/v1/brain/telegram/testdowolny ważny kluczGOLD
POST/api/v1/brain/telegram/set-webhookdowolny ważny kluczGOLD

Endpointy zapisu na listę

Dla formularzy na stronach i prostych integracji, które mają trafiać tylko do jednej listy. Te endpointy nie przyjmują klucza API konta: uwierzytelniasz się własnym kluczem listy, wygenerowanym w ustawieniach listy w sekcji Integracja → Klucz API listy. subscribe przyjmuje email (lub phone dla listy SMS), first_name i last_name; unsubscribe przyjmuje email. Lista, która nie przyjmuje zapisów, zwraca 403. Błędy mają tu postać success: false z error lub errors.

MetodaŚcieżkaZakres
POST/api/v1/lists/{id}/subscribewłasny klucz API listy
POST/api/v1/lists/{id}/unsubscribewłasny klucz API listy

Przykłady

Dodaj subskrybenta do listy
curl -X POST https://your-domain.com/api/v1/subscribers \
  -H "Authorization: Bearer ns_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '{
    "email": "anna@example.com",
    "contact_list_id": 5,
    "first_name": "Anna",
    "tags": [1, 3],
    "custom_fields": { "city": "Berlin" }
  }'

# 201 Created (200 when the address already existed)
{
  "data": {
    "id": 456,
    "email": "anna@example.com",
    "first_name": "Anna",
    "status": "active",
    "contact_list_id": 5,
    "contact_list_ids": [5],
    "source": "api",
    "tags": [{ "id": 1, "name": "VIP", ... }, { "id": 3, "name": "Newsletter", ... }],
    "custom_fields": { "email": "anna@example.com", "fname": "Anna", ..., "city": "Berlin" },
    "subscribed_at": "2026-11-07T10:30:00.000000Z",
    "created_at": "2026-11-07T10:30:00.000000Z",
    ...
  }
}
Wyślij e-mail transakcyjny
curl -X POST https://your-domain.com/api/v1/email/send \
  -H "Authorization: Bearer ns_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '{
    "email": "anna@example.com",
    "subject": "Your order is on its way",
    "content": "<p>Hi [[fname]], your order has shipped.</p>",
    "subscriber_id": 456,
    "mailbox_id": 1
  }'

# 202 Accepted
{
  "data": {
    "id": 123,
    "email": "anna@example.com",
    "subject": "Your order is on its way",
    "status": "queued",
    "mailbox": "Main mailbox",
    "scheduled_at": null
  },
  "message": "Email queued successfully"
}
Utwórz i wyślij kampanię
# 1. Create a draft email campaign for list 5
curl -X POST https://your-domain.com/api/v1/messages \
  -H "Authorization: Bearer ns_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '{
    "subject": "November news",
    "channel": "email",
    "type": "broadcast",
    "content": "<h1>Hello [[fname]]</h1>",
    "contact_list_ids": [5],
    "mailbox_id": 1
  }'

# 2a. Send it now (42 = the id returned in step 1)
curl -X POST https://your-domain.com/api/v1/messages/42/send \
  -H "Authorization: Bearer ns_live_YOUR_KEY" \
  -H "Accept: application/json"

# 2b. Or schedule it in a given time zone
curl -X POST https://your-domain.com/api/v1/messages/42/schedule \
  -H "Authorization: Bearer ns_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '{ "scheduled_at": "2026-11-20 09:00", "timezone": "Europe/Warsaw" }'
JavaScript (fetch)
const res = await fetch(
  "https://your-domain.com/api/v1/subscribers?status=active&per_page=50",
  {
    headers: {
      Authorization: `Bearer ${process.env.NETSENDO_API_KEY}`,
      Accept: "application/json",
    },
  }
)

if (res.status === 429) {
  const wait = Number(res.headers.get("Retry-After") ?? 60)
  // try again after `wait` seconds
}

const { data, meta } = await res.json()
console.log(meta.total, data.map((s) => s.email))
Zapis z formularza na stronie kluczem listy
curl -X POST https://your-domain.com/api/v1/lists/5/subscribe \
  -H "Authorization: Bearer YOUR_LIST_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '{ "email": "anna@example.com", "first_name": "Anna" }'

# 201 Created
{
  "success": true,
  "message": "Successfully subscribed",
  "subscriber_id": 456,
  "status": "new"
}

Specyfikacja OpenAPI w Twojej instancji

Każda instalacja NetSendo generuje też opis swojego API w formacie OpenAPI. Zaloguj się do panelu i otwórz https://your-domain.com/docs/api, aby zobaczyć interaktywną dokumentację, lub /docs/api.json, aby pobrać surową specyfikację. Oba adresy widzą tylko zalogowani użytkownicy.

Interaktywna dokumentacja API w instalacji NetSendo

Najczęściej zadawane pytania

Jak uwierzytelnić się w API NetSendo?

Utwórz klucz API w panelu NetSendo w sekcji Ustawienia → Klucze API i wysyłaj go w nagłówku Authorization jako token Bearer: Authorization: Bearer ns_live_… Klucz jest pokazywany tylko raz, przy tworzeniu.

Jaki jest limit żądań do API NetSendo?

3000 żądań na minutę na klucz API. Po przekroczeniu limitu API odpowiada 429 Too Many Requests z nagłówkiem Retry-After. Endpointy zbiorcze przyjmują do 1000 subskrybentów w jednym żądaniu.

Jakiego zakresu potrzebuje klucz, aby dodawać subskrybentów?

subscribers:write dla POST /api/v1/subscribers i POST /api/v1/subscribers/batch. Import i zbiorcze zmiany członkostwa na liście wymagają lists:write. Zakres zapisu daje też odpowiadający mu zakres odczytu.

Czy API NetSendo ma specyfikację OpenAPI?

Tak. Generuje ją każda instalacja: zaloguj się do panelu i otwórz /docs/api, aby zobaczyć interaktywną dokumentację, lub /docs/api.json, aby pobrać specyfikację.

Jak formularz na stronie może dodawać subskrybentów bez klucza API konta?

Wygeneruj klucz dla listy w jej ustawieniach w sekcji Integracja → Klucz API listy, a potem wyślij dane formularza metodą POST na /api/v1/lists/{id}/subscribe z tym kluczem jako tokenem Bearer. Klucz działa tylko dla tej listy.

Czym różni się /messages od /campaigns?

Niczym. /campaigns to alias /messages: obie ścieżki prowadzą do tych samych endpointów kampanii z tymi samymi zakresami.