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_KEYZaznacz 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 keyAPI key has expired
Zakresy
Każdy klucz ma zestaw zakresów. Endpoint, który wymaga zakresu, jakiego klucz nie ma, odpowiada 403 Forbidden.
| Zakres | Na co pozwala |
|---|---|
| subscribers:read | Odczyt listy blokad, eksport członków listy wprost w odpowiedzi, odczyt historii aktywności subskrybenta |
| subscribers:write | Tworzenie, edycja i usuwanie subskrybentów, tworzenie zbiorcze, zastępowanie tagów subskrybenta, dodawanie i zdejmowanie adresów z listy blokad |
| lists:read | Raporty 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:write | Tworzenie, 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:read | Można go wybrać; w wersji 2.7.0 nie wymaga go żaden endpoint (do odczytu tagów wystarczy ważny klucz) |
| notifications:write | Tworzenie powiadomień w centrum powiadomień właściciela konta |
| webhooks:read | Można go wybrać; w wersji 2.7.0 nie wymaga go żaden endpoint (do odczytu webhooków wystarczy ważny klucz) |
| webhooks:write | Tworzenie, zmiana, usuwanie i testowanie webhooków oraz generowanie nowego sekretu do podpisu |
| email:read | Status e-maili wysłanych przez API, lista skrzynek nadawczych |
| email:write | Wysyłka pojedynczych i zbiorczych e-maili |
| sms:read | Status SMS-ów wysłanych przez API, lista dostawców SMS |
| sms:write | Wysyłka pojedynczych i zbiorczych SMS-ów |
| messages:read | Podgląd kampanii i liczba odbiorców, szablony e-mail, kategorie szablonów i zapisane bloki |
| messages:write | Tworzenie, zmiana, usuwanie, planowanie, wysyłka, test i duplikowanie kampanii; testy A/B; szablony i zapisane bloki |
| funnels:read | Reguły automatyzacji, ich opcje i dzienniki |
| funnels:write | Tworzenie, 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:writemoże też wywoływać endpointy wymagającelists: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"
}| Status | Znaczenie |
|---|---|
| 200 | Sukces |
| 201 | Utworzono |
| 202 | Przyjęto i dodano do kolejki (e-maile, SMS-y, eksport CSV) |
| 401 | Brak klucza API albo klucz w złym formacie, nieznany lub wygasły |
| 402 | Wywołanie korzysta z funkcji GOLD, a instalacja nie ma aktywnej licencji GOLD |
| 403 | Klucz nie ma zakresu wymaganego przez endpoint |
| 404 | Zasób nie istnieje na tym koncie |
| 409 | Konflikt, 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 |
| 422 | Walidacja nie powiodła się albo zasób nie jest gotowy (kampania bez list, skrzynki lub treści) |
| 429 | Przekroczono limit żądań |
| 500 | Błą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
- Subskrybenci
- Listy kontaktów
- Import i eksport
- Higiena listy
- Członkostwo na listach (zbiorczo)
- Aktywność i zaangażowanie
- Lista blokad
- Tagi i pola własne
- Wysyłka e-maili
- Wysyłka SMS-ów
- Kampanie (messages)
- Testy A/B
- Lejki
- Reguły automatyzacji
- Webhooki
- Szablony i zapisane bloki
- Wiadomości i strony systemowe
- Formularze zapisu
- Powiadomienia
- Endpointy pomocnicze dla integracji
- NetSendo Brain
- Endpointy zapisu na listę
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żka | Zakres |
|---|---|---|
| GET | /api/v1/account | dowolny ważny klucz |
| GET | /api/mcp/test | dowolny 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żka | Zakres |
|---|---|---|
| GET | /api/v1/subscribers | dowolny ważny klucz |
| POST | /api/v1/subscribers | subscribers:write |
| POST | /api/v1/subscribers/batch | subscribers: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}/tags | subscribers:write |
| GET | /api/v1/subscribers/{id}/activity | subscribers: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żka | Zakres |
|---|---|---|
| GET | /api/v1/lists | dowolny ważny klucz |
| POST | /api/v1/lists | lists: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}/stats | dowolny ważny klucz |
| GET | /api/v1/lists/{id}/subscribers | dowolny ważny klucz |
| GET | /api/v1/lists/{id}/cron-settings | lists:read |
| PUT | /api/v1/lists/{id}/cron-settings | lists:write |
| GET | /api/v1/settings/list-defaults | lists:read |
| PUT | /api/v1/settings/list-defaults | lists: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żka | Zakres |
|---|---|---|
| POST | /api/v1/lists/{id}/import/preview | lists:read |
| POST | /api/v1/lists/{id}/import | lists:write |
| GET | /api/v1/lists/{id}/export | subscribers:read |
| GET | /api/v1/lists/{id}/export/fields | dowolny ważny klucz |
| POST | /api/v1/lists/{id}/export | dowolny ważny klucz |
| GET | /api/v1/exports/download | brak (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żka | Zakres |
|---|---|---|
| GET | /api/v1/lists/hygiene-options | dowolny ważny klucz |
| GET | /api/v1/lists/{id}/hygiene | lists:read |
| POST | /api/v1/lists/{id}/hygiene/clean | lists:write |
| POST | /api/v1/lists/{id}/hygiene/dedupe | lists:write |
| POST | /api/v1/lists/{id}/hygiene/verify | lists: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żka | Zakres |
|---|---|---|
| POST | /api/v1/lists/{id}/members | lists:write |
| POST | /api/v1/lists/{id}/members/remove | lists:write |
| POST | /api/v1/lists/{id}/members/status | lists:write |
| POST | /api/v1/lists/{id}/members/move | lists:write |
| POST | /api/v1/lists/{id}/members/copy | lists:write |
| POST | /api/v1/lists/{id}/members/tags | lists: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żka | Zakres |
|---|---|---|
| GET | /api/v1/lists/{id}/activity | lists:read |
| GET | /api/v1/lists/{id}/engagement | lists: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żka | Zakres |
|---|---|---|
| GET | /api/v1/suppressions | subscribers:read |
| POST | /api/v1/suppressions | subscribers:write |
| DELETE | /api/v1/suppressions | subscribers: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żka | Zakres |
|---|---|---|
| POST | /api/v1/email/send | email:write |
| POST | /api/v1/email/batch | email:write |
| GET | /api/v1/email/status/{id} | email:read |
| GET | /api/v1/email/mailboxes | email: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żka | Zakres |
|---|---|---|
| POST | /api/v1/sms/send | sms:write |
| POST | /api/v1/sms/batch | sms:write |
| GET | /api/v1/sms/status/{id} | sms:read |
| GET | /api/v1/sms/providers | sms: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żka | Zakres |
|---|---|---|
| GET | /api/v1/messages | dowolny ważny klucz |
| POST | /api/v1/messages | messages: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}/lists | messages:write |
| POST | /api/v1/messages/{id}/exclusions | messages:write |
| POST | /api/v1/messages/{id}/schedule | messages:write |
| POST | /api/v1/messages/{id}/send | messages:write |
| POST | /api/v1/messages/{id}/test | messages:write |
| GET, POST | /api/v1/messages/{id}/preview | messages:read |
| GET | /api/v1/messages/{id}/stats | dowolny ważny klucz |
| GET | /api/v1/messages/{id}/recipients-count | messages:read |
| POST | /api/v1/messages/{id}/duplicate | messages:write |
| POST | /api/v1/messages/{id}/toggle-active | messages:write |
| POST | /api/v1/messages/{id}/resend-failed | messages:write |
| POST | /api/v1/messages/{id}/send-to-missed | messages: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żka | Zakres |
|---|---|---|
| GET | /api/v1/ab-tests | dowolny ważny klucz |
| POST | /api/v1/ab-tests | messages:writeGOLD |
| GET | /api/v1/ab-tests/{id} | dowolny ważny klucz |
| POST | /api/v1/ab-tests/{id}/variants | messages:writeGOLD |
| POST | /api/v1/ab-tests/{id}/start | messages:writeGOLD |
| POST | /api/v1/ab-tests/{id}/end | messages:write |
| GET | /api/v1/ab-tests/{id}/results | dowolny 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żka | Zakres |
|---|---|---|
| GET | /api/v1/funnels | dowolny ważny klucz |
| POST | /api/v1/funnels | funnels: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}/steps | funnels:write |
| PUT | /api/v1/funnels/{id}/steps/{step} | funnels:write |
| DELETE | /api/v1/funnels/{id}/steps/{step} | funnels:write |
| POST | /api/v1/funnels/{id}/subscribers | funnels:write |
| POST | /api/v1/funnels/{id}/activate | funnels:write |
| POST | /api/v1/funnels/{id}/pause | funnels:write |
| GET | /api/v1/funnels/{id}/stats | dowolny 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żka | Zakres |
|---|---|---|
| GET | /api/v1/automations/options | funnels:read |
| GET | /api/v1/automations | funnels:read |
| POST | /api/v1/automations | funnels: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}/toggle | funnels:write |
| POST | /api/v1/automations/{id}/duplicate | funnels:write |
| GET | /api/v1/automations/{id}/logs | funnels: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żka | Zakres |
|---|---|---|
| GET | /api/v1/webhooks/events | dowolny ważny klucz |
| GET | /api/v1/webhooks | dowolny ważny klucz |
| POST | /api/v1/webhooks | webhooks: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}/test | webhooks:write |
| POST | /api/v1/webhooks/{id}/regenerate-secret | webhooks:write |
Szablony i zapisane bloki
Szablony e-mail, ich kategorie i zapisane bloki kreatora e-maili. /templates/{id}/preview renderuje szablon.
| Metoda | Ścieżka | Zakres |
|---|---|---|
| GET | /api/v1/templates | messages:read |
| POST | /api/v1/templates | messages: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}/duplicate | messages:write |
| POST | /api/v1/templates/{id}/preview | messages:read |
| GET | /api/v1/template-categories | messages:read |
| GET | /api/v1/template-blocks/types | messages:read |
| GET | /api/v1/template-blocks | messages:read |
| POST | /api/v1/template-blocks | messages: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żka | Zakres |
|---|---|---|
| GET | /api/v1/system-emails | lists:read |
| GET | /api/v1/system-emails/{slug} | lists:read |
| PUT | /api/v1/system-emails/{slug} | lists:write |
| PUT | /api/v1/system-emails/{slug}/active | lists:write |
| DELETE | /api/v1/system-emails/{slug} | lists:write |
| GET | /api/v1/system-pages | lists: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żka | Zakres |
|---|---|---|
| GET | /api/v1/forms | lists:read |
| POST | /api/v1/forms | lists: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}/duplicate | lists: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żka | Zakres |
|---|---|---|
| GET | /api/v1/notifications | dowolny ważny klucz |
| POST | /api/v1/notifications | notifications: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żka | Zakres |
|---|---|---|
| GET | /api/v1/external-pages | dowolny ważny klucz |
| GET | /api/v1/plugin/check-version | dowolny ważny klucz |
| POST | /api/v1/plugin/heartbeat | dowolny ważny klucz |
| GET | /api/v1/plugin/connections | dowolny ważny klucz |
| DELETE | /api/v1/plugin/connections/{id} | dowolny ważny klucz |
| POST | /api/v1/plugin/connections/{id}/disconnect | dowolny ważny klucz |
| POST | /api/webhooks/purchase | dowolny 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żka | Zakres |
|---|---|---|
| POST | /api/v1/brain/chat | dowolny ważny klucz |
| GET | /api/v1/brain/conversations | dowolny ważny klucz |
| GET | /api/v1/brain/conversations/{id} | dowolny ważny klucz |
| GET | /api/v1/brain/knowledge | dowolny ważny klucz |
| POST | /api/v1/brain/knowledge | dowolny 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/plans | dowolny ważny klucz |
| GET | /api/v1/brain/plans/{id} | dowolny ważny klucz |
| POST | /api/v1/brain/plans/{id}/approve | dowolny ważny klucz |
| GET | /api/v1/brain/settings | dowolny ważny klucz |
| PUT | /api/v1/brain/settings | dowolny ważny klucz |
| POST | /api/v1/brain/telegram/link-code | dowolny ważny kluczGOLD |
| POST | /api/v1/brain/telegram/disconnect | dowolny ważny klucz |
| POST | /api/v1/brain/telegram/test | dowolny ważny kluczGOLD |
| POST | /api/v1/brain/telegram/set-webhook | dowolny 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żka | Zakres |
|---|---|---|
| POST | /api/v1/lists/{id}/subscribe | własny klucz API listy |
| POST | /api/v1/lists/{id}/unsubscribe | własny klucz API listy |
Przykłady
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",
...
}
}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"
}# 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" }'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))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.

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.

