Powrót do panelu

Dokumentacja

Dowiedz się, jak korzystać z Asyntai

Dokumentacja API

Twórz niestandardowe integracje za pomocą Asyntai REST API

Pobierz klucz API

Wymagany plan płatny: Dostęp do API jest dostępny w planach Starter, Standard i Pro. Zobacz cennik

Przegląd

The Asyntai API allows you to integrate AI-powered customer support into any application. Send messages and receive intelligent responses grounded in your website content and knowledge base.

Uwierzytelnianie

Wszystkie żądania API wymagają uwierzytelnienia za pomocą klucza API. Klucz API można uzyskać na stronie Ustawienia API.

Dołącz swój klucz API do żądań, korzystając z jednej z tych metod:

  • Nagłówek Authorization (zalecany): Authorization: Bearer YOUR_API_KEY
  • Nagłówek X-API-Key: X-API-Key: YOUR_API_KEY

Zachowaj swój klucz API w tajemnicy. Każdy, kto posiada Twój klucz, może uzyskać dostęp do Twojego konta za pośrednictwem API. Nigdy nie ujawniaj go w kodzie po stronie klienta.

Bazowy adres URL

https://asyntai.com/api/v1/

Endpointy

POST /chat/

Wyślij wiadomość i otrzymaj odpowiedź wygenerowaną przez AI.

Treść żądania

{
  "message": "What are your business hours?",
  "session_id": "user_123",      // optional
  "website_id": 1                 // optional
}
Parametr Typ Wymagany Opis
message string Tak Wiadomość użytkownika do wysłania do AI
session_id string Nie Unikalny identyfikator rozmowy. Użyj tego samego session_id, aby zachować historię rozmowy.
website_id integer Nie Identyfikator konkretnej strony. Jeśli nie zostanie podany, zostanie użyta Twoja główna strona.

Odpowiedź

{
  "success": true,
  "response": "Our business hours are Monday-Friday, 9 AM to 5 PM EST.",
  "session_id": "user_123"
}

Przykład (cURL)

curl -X POST https://asyntai.com/api/v1/chat/ \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"message": "What are your business hours?", "session_id": "user_123"}'

Przykład (Python)

import requests

response = requests.post(
    "https://asyntai.com/api/v1/chat/",
    headers={
        "Authorization": "Bearer YOUR_API_KEY",
        "Content-Type": "application/json"
    },
    json={
        "message": "What are your business hours?",
        "session_id": "user_123"
    }
)

data = response.json()
print(data["response"])

Przykład (JavaScript)

const response = await fetch("https://asyntai.com/api/v1/chat/", {
  method: "POST",
  headers: {
    "Authorization": "Bearer YOUR_API_KEY",
    "Content-Type": "application/json"
  },
  body: JSON.stringify({
    message: "What are your business hours?",
    session_id: "user_123"
  })
});

const data = await response.json();
console.log(data.response);

GET /websites/

Wyświetl wszystkie strony internetowe powiązane z Twoim kontem.

Odpowiedź

{
  "success": true,
  "websites": [
    {
      "id": 1,
      "name": "My Website",
      "domain": "example.com",
      "is_primary": true
    }
  ]
}

Przykład (cURL)

curl https://asyntai.com/api/v1/websites/ \
  -H "Authorization: Bearer YOUR_API_KEY"

POST /websites/

Create a new AI agent. This does the same thing as adding a website in your dashboard: it makes the agent, reads your site, and writes the first draft of the AI instructions.

Use this to set up customers from your own software. You get back the widget ID and the code to put on the website.

Treść żądania

Pole Typ Opis
domain string Required. The website address, for example example.com
name string Optional. A display name for the agent. Useful when one website has several agents.
crawl boolean Optional, true by default. Set it to false to create the agent without reading the website. Nothing is crawled and no instructions are written.
force boolean Optional, false by default. Set it to true to add a website you already have. The copy is stored with a number after it.

Odpowiedź

{
  "success": true,
  "website": {
    "id": 42,
    "domain": "example.com",
    "name": "Support agent",
    "widget_id": "asyntai_ab12cd34ef56",
    "is_primary": true,
    "crawl_started": true,
    "instructions_status": "generating",
    "job_id": "8f2c1e90-..."
  },
  "embed_code": "<script>...</script>"
}

Przykład (cURL)

curl -X POST https://asyntai.com/api/v1/websites/ \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"domain": "example.com", "name": "Support agent"}'

Reading a website takes a few minutes, so this call answers straight away. Check when the agent is ready with the next endpoint.

Errors

Code Meaning
403 You have reached the number of websites your plan allows. The answer tells you the limit.
409 Your account already has this website. Send force as true to add it again.

GET /websites/{id}/

Get one website and see whether it is ready. Use this after you create an agent, to wait until the website has been read and the AI instructions are written.

Odpowiedź

{
  "success": true,
  "website": {
    "id": 42,
    "domain": "example.com",
    "name": "Support agent",
    "widget_id": "asyntai_ab12cd34ef56",
    "is_primary": true,
    "created_at": "2026-08-11T09:12:00+00:00",
    "ready": true,
    "instructions": {
      "status": "completed",
      "has_instructions": true,
      "characters": 3421
    },
    "crawl": {
      "job_id": "8f2c1e90-...",
      "status": "completed",
      "pages_crawled": 47,
      "pages_found": 50,
      "max_pages": 50,
      "completed_at": "2026-08-11T09:15:31+00:00",
      "error": ""
    },
    "knowledge_items": 47
  },
  "embed_code": "<script>...</script>"
}

The ready field is true when nothing is still running. A crawl that failed also counts as ready, because it has finished. Look at the crawl status to see what happened.

Przykład (cURL)

curl https://asyntai.com/api/v1/websites/42/ \
  -H "Authorization: Bearer YOUR_API_KEY"

GET PATCH /websites/{id}/settings/

Read or change the chat widget settings for one website. These are the same settings you see on the Customize page: colours, the name of the assistant, the first message, lead capture, and everything else.

Reading the settings

A GET request returns every setting with its current value, plus a locked list. Locked shows the settings your plan cannot change, and which plans they need.

{
  "success": true,
  "settings": {
    "ai_support_name": "AI Assistant",
    "widget_color": "#6366f1",
    "initial_message": "Hi, how can I help you?",
    "hide_branding": false,
    "...": "..."
  },
  "locked": {
    "hide_branding": ["pro", "enterprise"],
    "widget_style": ["pro", "enterprise"]
  }
}

Changing the settings

A PATCH request changes only the settings you send. Everything you leave out stays as it is.

curl -X PATCH https://asyntai.com/api/v1/websites/42/settings/ \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"ai_support_name": "Ava", "widget_color": "#0f172a", "use_emoji": true}'
{
  "success": true,
  "updated": ["ai_support_name", "use_emoji", "widget_color"],
  "settings": { "...": "..." },
  "locked": { "...": "..." }
}

Plans

Each setting needs its own plan, the same as in the dashboard. For example, hiding the Asyntai branding needs the Pro plan, and voice input needs Standard.

Plan needed Ustawienia Examples
Any paid plan 25 widget_color, ai_support_name, initial_message
Starter i wyżej 22 profile_picture, conversation_starters_enabled
Standard i wyżej 25 speech_to_text_enabled, image_vision_enabled, escalation_enabled
Pro 6 hide_branding, widget_style

If you send a setting your plan does not allow, the whole request is refused with code 403 and nothing is saved. The same happens if any value is wrong, for example a colour that is not a hex code. Your settings never end up half changed.

GET PUT /websites/{id}/instructions/

Read or replace the AI instructions for one website. These are the rules that tell the assistant who it is, what it may say, and what it must not say. They are the same instructions you edit in the dashboard.

Reading

{
  "success": true,
  "instructions": "You are the support agent for Acme Tools...",
  "characters": 1979,
  "version": 7,
  "mode": "instructions",
  "ask_questions": true,
  "generation_status": "completed",
  "being_edited_by": null
}

Replacing

A PUT request replaces the whole text, the same as saving in the dashboard. There is no append mode. To add a paragraph, read the instructions, add your text, then write it back.

curl -X PUT https://asyntai.com/api/v1/websites/42/instructions/ \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"instructions": "You are the support agent for Acme Tools...", "version": 7}'

Treść żądania

Pole Typ Opis
instructions string Required. The complete new text. It replaces everything that was there.
version number Optional but recommended. The version you read. If somebody changed the instructions since then, your write is refused instead of overwriting their work.
mode string Optional. Either instructions or general.
ask_questions boolean Optional. Whether the assistant asks a follow-up question at the end of its answers.
force boolean Optional, false by default. Needed only when your new text is less than half the length of the current text.

How your instructions are protected

Instructions can take hours to write, so a write can be refused to protect them:

Code Meaning
400 Your new text is less than half the length of the current text. This catches a script that sends empty or cut-off text over instructions somebody spent hours on. Send force as true if you meant it.
409 The instructions changed after you read them. Read them again, apply your change, then write.
423 Somebody is editing the instructions in the dashboard right now. The answer tells you who. Try again in a couple of minutes.

Every change also saves a copy of the previous text, so an earlier version can always be restored from the dashboard.

GET /conversations/

Pobierz historię rozmowy dla konkretnej sesji.

Parametry zapytania

Parametr Typ Wymagany Opis
session_id string Tak Identyfikator sesji, dla której ma zostać pobrana historia
limit integer Nie Maksymalna liczba wiadomości do zwrócenia (domyślnie: 50, maks.: 100)

Odpowiedź

{
  "success": true,
  "session_id": "user_123",
  "messages": [
    {
      "role": "user",
      "content": "What are your business hours?",
      "timestamp": "2024-01-15T10:30:00Z"
    },
    {
      "role": "assistant",
      "content": "Our business hours are Monday-Friday, 9 AM to 5 PM EST.",
      "timestamp": "2024-01-15T10:30:01Z",
      "sender_type": "ai",
      "agent_name": null,
      "response_time_ms": 1840.5
    }
  ]
}

Pytanie i jego odpowiedź są zapisywane w jednym rekordzie, więc oba mają ten sam timestamp. Nie odejmuj jednego od drugiego, aby zmierzyć szybkość odpowiedzi, ponieważ wynik zawsze wyniesie zero. Użyj response_time_ms, czyli rzeczywistego czasu odpowiedzi w milisekundach.

sender_type ma wartość ai, gdy odpowiedział chatbot, i human, gdy rozmowę przejął jeden z Twoich agentów. agent_name zawiera nazwę wyświetlaną tego agenta.

Przykład (cURL)

curl "https://asyntai.com/api/v1/conversations/?session_id=user_123&limit=20" \
  -H "Authorization: Bearer YOUR_API_KEY"

GET /sessions/

Wyświetl ostatnie sesje czatów. Użyj tego, aby poznać identyfikatory sesji, które następnie można przekazać do /conversations/ w celu pobrania pełnej historii wiadomości.

Parametry zapytania

Parametr Typ Wymagany Opis
limit integer Nie Liczba ostatnich sesji do zwrócenia (domyślnie: 20, maks.: 100)
website_id string Nie Filtruj sesje według identyfikatora strony internetowej
source string Nie Filtruj według źródła sesji: widget, api, whatsapp, instagram, messenger, gorgias, freshchat, zapier

Odpowiedź

{
  "success": true,
  "sessions": [
    {
      "session_id": "session_abc123def",
      "source": "widget",
      "message_count": 5,
      "first_message": "What are your business hours?",
      "first_message_at": "2024-01-15T10:30:00Z",
      "last_message_at": "2024-01-15T10:35:00Z",
      "first_response_time_ms": 1840.5,
      "first_human_response_at": null,
      "started_at": "2024-01-15T10:29:58Z",
      "ended_at": "2024-01-15T10:41:12Z",
      "taken_over_at": null,
      "website_domain": "example.com"
    }
  ]
}

Pola znaczników czasu do raportowania

Pole Opis
started_at Kiedy odwiedzający otworzył czat. Dostępne tylko dla sesji widżetu, ponieważ sesje utworzone przez API nigdy nie otwierają widżetu.
first_message_at Kiedy zapisano pierwszą wiadomość rozmowy.
first_response_time_ms Jak długo trwała pierwsza odpowiedź, w milisekundach. Użyj tego do czasu pierwszej odpowiedzi.
first_human_response_at Kiedy jeden z Twoich agentów wysłał pierwszą odpowiedź. Wartość to null, gdy chatbot obsłużył całą rozmowę.
taken_over_at Kiedy agent przejął czat od chatbota.
last_message_at Kiedy zapisano ostatnią wiadomość rozmowy.
ended_at Kiedy odwiedzający opuścił czat. Czat nie ma stanu rozwiązany ani zamknięty, ponieważ odwiedzający zawsze może wrócić i zadać kolejne pytanie.

Wszystkie znaczniki czasu są w UTC i używają formatu ISO 8601. Nie można zmienić strefy czasowej. Przelicz wartości we własnym narzędziu raportowym.

Przykład (cURL)

curl "https://asyntai.com/api/v1/sessions/?limit=10" \
  -H "Authorization: Bearer YOUR_API_KEY"

GET /leads/

Pobierz zebrane leady — adresy e-mail i numery telefonów przesłane przez odwiedzających podczas rozmów na czacie.

Parametry zapytania

Parametr Typ Wymagany Opis
limit integer Nie Liczba leadów do zwrócenia (domyślnie: 50, maks: 100)
website_id string Nie Filtruj leady według określonego ID strony internetowej

Odpowiedź

{
  "success": true,
  "leads": [
    {
      "session_id": "session_abc123def",
      "email": "[email protected]",
      "phone": "+1234567890",
      "page_url": "https://example.com/pricing",
      "started_at": "2024-01-15T10:30:00Z"
    }
  ]
}
Pole Typ Opis
session_id string ID sesji czatu. Przekaż go do /conversations/, aby zobaczyć pełną historię czatu.
email ciąg znaków lub null Adres e-mail podany przez odwiedzającego, lub null jeśli nie został zebrany
phone ciąg znaków lub null Numer telefonu podany przez odwiedzającego, lub null jeśli nie został zebrany
page_url ciąg znaków lub null URL strony, na której odwiedzający rozmawiał
started_at string Znacznik czasu ISO 8601 rozpoczęcia sesji czatu

Przykład (cURL)

curl "https://asyntai.com/api/v1/leads/?limit=20" \
  -H "Authorization: Bearer YOUR_API_KEY"

Przykład (Python)

import requests

response = requests.get(
    "https://asyntai.com/api/v1/leads/",
    headers={"Authorization": "Bearer YOUR_API_KEY"},
    params={"limit": 20}
)

leads = response.json()["leads"]
for lead in leads:
    print(f"{lead['email'] or ''} | {lead['phone'] or ''}")

GET /account/

Pobierz informacje o koncie i statystyki użytkowania.

Odpowiedź

{
  "success": true,
  "account": {
    "email": "[email protected]",
    "plan": "starter",
    "messages_used": 150,
    "messages_limit": 2500
  }
}

Przykład (cURL)

curl https://asyntai.com/api/v1/account/ \
  -H "Authorization: Bearer YOUR_API_KEY"

Wiele stron internetowych? Endpointy bazy wiedzy domyślnie odnoszą się do Twojej strony głównej. Jeśli posiadasz wiele stron internetowych, przekaż website_id aby wybrać konkretną. Identyfikatory swoich stron znajdziesz za pomocą GET /websites/.

Dzienne limity przesyłania: Przesyłanie do bazy wiedzy (tekst, URL, arkusz kalkulacyjny) podlega dziennemu limitowi znaków w zależności od planu. Dotyczy to łącznej treści przesłanej przez wszystkie endpointy bazy wiedzy w ciągu dnia.

Plan Znaki/dzień
Starter300 000
Standard1 500 000
Pro6 000 000

GET /knowledge/

Wyświetl wpisy w bazie wiedzy. Są to źródła treści, z których korzysta Twój chatbot AI do odpowiadania na pytania.

Parametry zapytania

Parametr Typ Wymagany Opis
limit integer Nie Liczba wpisów do zwrócenia (domyślnie: 50, maks.: 100)
website_id string Nie Filtruj według identyfikatora strony (domyślnie Twoja strona główna)

Odpowiedź

{
  "success": true,
  "entries": [
    {
      "id": "abc-123-def",
      "type": "text",
      "title": "Business Hours",
      "description": "Manual text content (150 words)",
      "created_at": "2024-01-15T10:30:00Z"
    },
    {
      "id": "ghi-456-jkl",
      "type": "url",
      "title": "About Us - Example",
      "description": "Content from https://example.com/about",
      "created_at": "2024-01-14T09:00:00Z"
    }
  ]
}

Przykład (cURL)

curl "https://asyntai.com/api/v1/knowledge/?limit=10" \
  -H "Authorization: Bearer YOUR_API_KEY"

POST /knowledge/text/

Dodaj niestandardową treść tekstową do bazy wiedzy. AI wykorzysta ją do odpowiadania na pytania odwiedzających.

Treść żądania

{
  "title": "Return Policy",
  "content": "We offer a 30-day return policy on all items. Items must be unused and in original packaging. Refunds are processed within 5-7 business days.",
  "website_id": "123"
}
Parametr Typ Wymagany Opis
title string Tak Tytuł tego wpisu w bazie wiedzy
content string Tak Treść tekstowa (min. 10 znaków)
website_id string Nie Docelowa strona internetowa (domyślnie Twoja strona główna)

Odpowiedź

{
  "success": true,
  "id": "abc-123-def",
  "title": "Return Policy",
  "chunks_created": 1
}

Przykład (cURL)

curl -X POST "https://asyntai.com/api/v1/knowledge/text/" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"title": "Return Policy", "content": "We offer a 30-day return policy..."}'

POST /knowledge/url/

Dodaj stronę internetową do bazy wiedzy. Treść zostanie pobrana i wyodrębniona automatycznie.

Treść żądania

{
  "url": "https://example.com/faq",
  "website_id": "123"
}
Parametr Typ Wymagany Opis
url string Tak Adres URL, z którego ma zostać pobrana treść
website_id string Nie Docelowa strona internetowa (domyślnie Twoja strona główna)

Odpowiedź

{
  "success": true,
  "id": "abc-123-def",
  "title": "FAQ - Example",
  "url": "https://example.com/faq",
  "chunks_created": 5
}

Przykład (cURL)

curl -X POST "https://asyntai.com/api/v1/knowledge/url/" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://example.com/faq"}'

POST /knowledge/spreadsheet/

Prześlij arkusz kalkulacyjny CSV lub Excel (.xlsx) do bazy wiedzy. Każdy wiersz staje się osobnym wpisem w bazie wiedzy — idealne rozwiązanie dla katalogów produktów, list FAQ, cenników i katalogów.

Żądanie

Wyślij jako multipart/form-data (przesyłanie pliku), nie JSON.

Parametr Typ Wymagany Opis
file plik Tak Plik .csv lub .xlsx. Pierwszy wiersz musi zawierać nagłówki kolumn. Maks. wierszy na przesłanie: Starter 500, Standard 2000, Pro 10 000. Nadmiarowe wiersze są obcinane.
website_id string Nie Docelowa strona internetowa (domyślnie Twoja strona główna)

Odpowiedź

{
  "success": true,
  "id": "abc-123-def",
  "title": "products.csv",
  "rows_processed": 15,
  "chunks_created": 15
}

Przykład (cURL)

curl -X POST "https://asyntai.com/api/v1/knowledge/spreadsheet/" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -F "[email protected]"

GET /knowledge/{id}/

Odczytaj jeden wpis bazy wiedzy wraz z zapisanym dla niego tekstem. Wartość id pochodzi z odpowiedzi GET /knowledge/.

Treść jest zwracana dla wpisów, które dodałeś samodzielnie: tekstu, plików, arkuszy, pojedynczych adresów URL i filmów. Przeszukiwanie witryny jest widoczne na liście, ale jej strony nie są zwracane, ponieważ źródłem jest Twoja własna publiczna witryna. W takim przypadku content ma wartość null, a pole reason wyjaśnia powód.

Odpowiedź

{
  "success": true,
  "id": "abc-123-def",
  "type": "text",
  "title": "Business Hours",
  "description": "Manual text content (150 words)",
  "created_at": "2024-01-15T10:30:00Z",
  "chunks_count": 3,
  "content": "We are open Monday to Friday, 9am to 5pm...",
  "content_available": true,
  "char_count": 43
}

Przykład (cURL)

curl "https://asyntai.com/api/v1/knowledge/abc-123-def/" \
  -H "Authorization: Bearer YOUR_API_KEY"

DELETE /knowledge/{id}/

Usuń wpis z bazy wiedzy. Wartość id można znaleźć w odpowiedzi GET /knowledge/.

Odpowiedź

{
  "success": true,
  "message": "Knowledge base entry deleted"
}

Przykład (cURL)

curl -X DELETE "https://asyntai.com/api/v1/knowledge/abc-123-def/" \
  -H "Authorization: Bearer YOUR_API_KEY"

Wskazówka: Webhookami można również zarządzać z poziomu Ustawienia API strony, bez pisania kodu.

GET /webhooks/

Wyświetl zarejestrowane webhooki.

Odpowiedź

{
  "success": true,
  "webhooks": [
    {
      "id": "abc-123-def",
      "url": "https://example.com/webhook",
      "events": ["message.received", "escalation.requested"],
      "is_active": true,
      "created_at": "2024-01-15T10:30:00Z"
    }
  ]
}

Przykład (cURL)

curl "https://asyntai.com/api/v1/webhooks/" \
  -H "Authorization: Bearer YOUR_API_KEY"

POST /webhooks/

Zarejestruj nowy webhook, aby otrzymywać powiadomienia o zdarzeniach w czasie rzeczywistym.

Dostępne zdarzenia

Zdarzenie Opis
message.received Odwiedzający wysłał wiadomość i otrzymał odpowiedź
conversation.started Rozpoczęto nową sesję czatu
escalation.requested AI zainicjowało eskalację do agenta
takeover.started Agent przejął sesję czatu

Treść żądania

{
  "url": "https://example.com/webhook",
  "events": ["message.received", "escalation.requested"],
  "website_id": "123"
}
Parametr Typ Wymagany Opis
url string Tak Adres URL HTTPS do odbierania żądań POST webhooka
events array Tak Lista zdarzeń do subskrypcji (patrz tabela powyżej)
website_id string Nie Docelowa strona internetowa (domyślnie Twoja strona główna)

Odpowiedź

{
  "success": true,
  "webhook": {
    "id": "abc-123-def",
    "url": "https://example.com/webhook",
    "events": ["message.received", "escalation.requested"],
    "secret": "whsec_abc123...",
    "created_at": "2024-01-15T10:30:00Z"
  }
}

Weryfikacja webhooków: Każdy webhook zawiera secret (wyświetlany tylko przy tworzeniu). Każde żądanie POST do Twojego URL zawiera X-Webhook-Signature nagłówek — HMAC-SHA256 treści żądania podpisany Twoim kluczem tajnym.

Przykład (cURL)

curl -X POST "https://asyntai.com/api/v1/webhooks/" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://example.com/webhook", "events": ["message.received"]}'

DELETE /webhooks/{id}/

Usuń webhook. Wartość id można znaleźć w odpowiedzi GET /webhooks/.

Odpowiedź

{
  "success": true,
  "message": "Webhook deleted"
}

Przykład (cURL)

curl -X DELETE "https://asyntai.com/api/v1/webhooks/abc-123-def/" \
  -H "Authorization: Bearer YOUR_API_KEY"

Odpowiedzi błędów

Wszystkie odpowiedzi błędów mają następujący format:

{
  "success": false,
  "error": "Error message describing what went wrong"
}
Kod statusu Opis
400 Błędne żądanie - Nieprawidłowe parametry lub brakujące wymagane pola
401 Nieautoryzowany — nieprawidłowy lub brakujący klucz API
429 Zbyt wiele żądań — osiągnięto limit wiadomości dla Twojego planu
503 Usługa niedostępna — usługa AI tymczasowo niedostępna

Limity żądań

Korzystanie z API jest ograniczone przez Twój plan subskrypcji:

  • Free: 100 wiadomości/miesiąc
  • Starter (39 $/mies.): 2500 wiadomości/miesiąc
  • Standard (139 $/mies.): 15 000 wiadomości/miesiąc
  • Pro (449 $/mies.): 50 000 wiadomości/miesiąc

Potrzebujesz pomocy?

Jeśli masz pytania lub napotkasz problemy, skontaktuj się z nami pod adresem [email protected].