REST API · SMS

API SMS dla polskich firm - REST, JSON, Bearer token

Wyślij SMS przez POST /v1/messages: jeden numer, tablica do 500 albo grupa kontaktów. Saldo prepaid, stawka od 0,10 zł za część po doładowaniu od 500 zł, webhook DLR z HMAC. Odbiór odpowiedzi (2-way) włączamy na życzenie; na alfanumeryczny nadpis nie da się odpisać.

Klucz testowy od razu Polskie wsparcie OpenAPI 3.1 30+ krajów

Co chcesz osiągnąć?

Pierwszy SMS: konto i curl

Rejestracja na app.przypominamy.com daje od razu pk_test_… i 25 SMS na dwa zweryfikowane numery. Poniżej demo bez konta albo trzy kroki z własnym kluczem.

Wyślij testowego SMS-a na swój numer. Bez konta.

Wpisz polski numer komórkowy. Za chwilę dostaniesz SMS, a poniżej zobaczysz dokładnie to żądanie i odpowiedź, które wykonałby Twój kod. Jeden test na numer dziennie.

Żądanie, które wysłałby Twój kodHTTP
Odpowiedź API201 Created

Tyle. Załóż konto, a dostaniesz klucz i 25 SMS-ów gratis na własne numery.

1

Załóż konto

Rejestracja na /register trwa minutę. Konto testowe z 25 SMS-ami i klucz pk_test_… działają od razu, bez ręcznej weryfikacji konta. Wysyłka testowa wymaga potwierdzenia własnego numeru kodem.

2

Odbierz klucz

W panelu (Klucze) generujesz pk_test_… od razu; pk_live_… po pierwszym doładowaniu. Klucz widzisz tylko raz: zapisz go w menedżerze sekretów.

3

Wyślij SMS

Wykonaj jeden POST na /v1/messages z numerem i treścią.

POSThttps://api.przypominamy.com/v1/messages
curl
curl -X POST https://api.przypominamy.com/v1/messages \
  -H "Authorization: Bearer $PRZYPOMINAMY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "to": "+48600123456",
    "text": "Cześć! Przypominamy o wizycie jutro o 14:00.",
    "from": "FIRMA",
    "reference": "wizyta-4711"
  }'

# 201 Created
{
  "id": "msg_qY08hZ2mmDXAazdRTytS",
  "status": "queued",
  "to": "+48600123456",
  "from": "FIRMA",
  "parts": 1,
  "cost_grosze": 10,
  "reference": "wizyta-4711",
  ...
}

Jeden endpoint do wysyłki. Reszta to konto i historia.

Bez SOAP-u, bez tysiąca opcji konfiguracyjnych. Pełna specyfikacja w Redoc i openapi.json.

POST/v1/messages

Wyślij SMS

Jeden numer, tablica do 500 numerów lub grupa kontaktów (group:VIP) z personalizacją {{imie}}. Nadpis, wysyłka odroczona do 90 dni, okno godzin send_window, ważność expires_at, link wypisu {{opt_out}}, śledzony link {{link:https://…}}, Idempotency-Key. Treść z szablonu (template_id + params) i SMS priorytetowy (priority: true, osobna kolejka, 2× stawka).

DELETE/v1/messages/{id}

Anuluj zaplanowaną wysyłkę

Do 30 s przed terminem. Status cancelled, koszt wraca na saldo.

GET/v1/messages

Historia wiadomości

Paginacja kursorem, filtry po statusie, numerze i reference. Do 200 na stronę.

GET/v1/messages/{id}

Status wiadomości

Pełny rekord: status doręczenia, liczba części, koszt, czas doręczenia, powód odrzucenia.

GET/v1/account

Saldo i cennik

Saldo w groszach, cena za część SMS i za HLR, limit kredytowy, model rozliczenia (billing_mode), aktualny nadpis, okno godzin wysyłki i zakresy klucza (scopes).

GET/v1/senders

Nadpisy

Lista aktywnych nazw nadawcy. Domyślną ustawisz przez PATCH /v1/account.

PUT/v1/account/webhook

Webhook

Ustaw adres https i odbierz sekret HMAC. Zdarzenia przy każdej zmianie statusu, 3 próby dostarczenia.

GET/v1/blacklist

Czarna lista i opt-out

Numery, na które nie wysyłasz: dodane przez API albo przez osobisty link {{opt_out}} z SMS-a. Wysyłka na taki numer = status rejected, koszt 0.

GET/v1/contacts

Kontakty i grupy

Książka odbiorców z polami własnymi, import tablicą do 500, grupy (/v1/groups). Wysyłka na grupę z {{imie}}, {{nazwisko}}, {{pole}}.

GET/v1/templates

Szablony

Te same szablony co w panelu, z placeholderami {{klucz}}. Tworzysz przez POST, wysyłasz podając template_id i params zamiast treści.

GET/v1/numbers/{msisdn}/lookup

Sprawdź numer (HLR)

Czy numer jest aktywny i w jakiej sieci - bez wysyłania SMS-a. Status active / inactive, operator, przeniesienie. 0,05 zł, ten sam numer w ciągu 24 h bez opłaty.

GET/v1/links

Śledzone linki i kliknięcia

Wstaw {{link:https://…}} w treści - każdy odbiorca dostaje własny krótki link api.przypominamy.com/l/…. Kto kliknął, ile razy i kiedy: tu, w links[] wiadomości i webhookiem link.clicked. Bez dopłaty.

GET/v1/inbound

Odpowiedzi odbiorców (2-way)

SMS-y przychodzące na numer odbiorczy: po Twoim słowie kluczowym (inbound_prefix) albo jako odpowiedź na Twoją wysyłkę (reply_to). STOP trafia na czarną listę. Uruchamiamy na życzenie - po włączeniu numeru odbiorczego dla konta.

Autoryzacja: Bearer token

Każde żądanie wymaga nagłówka Authorization: Bearer <klucz>. Klucz generujesz sam w panelu, od razu po rejestracji.

Nagłówek HTTP curl
curl https://api.przypominamy.com/v1/account \
  -H "Authorization: Bearer pk_live_a1b2c3d4..."

{ "balance_grosze": 4982, "price_per_part_grosze": 9,
  "sender_name": "FIRMA", "status": "active", ... }
  • Klucz pk_test_… generujesz w panelu od razu po rejestracji; pk_live_… po pierwszym doładowaniu od 50 zł. Pokazujemy go raz. Zakresy: send, read, manage.
  • Przechowujemy tylko skrót klucza. Jeśli wycieknie, napisz do nas - odwołamy go natychmiast i wydamy nowy.
  • Nie wspieramy Basic Auth ani klucza w query string. Tylko Bearer.
  • Kluczy nie ograniczamy per-IP - używaj tej samej wartości z dowolnego środowiska.

Webhooki: statusy, odpowiedzi i kliknięcia z podpisem HMAC

Ustaw adres przez PUT /v1/account/webhook, a przy każdej zmianie statusu, odpowiedzi odbiorcy i pierwszym kliknięciu śledzonego linku dostaniesz POST application/json. Odpowiedz 2xx - inaczej ponawiamy (3 próby).

📥 Zdarzenia

Statusy: message.sent, message.delivered, message.undelivered, message.failed, message.expired - w data.message pełny rekord wiadomości razem z Twoim reference. Odpowiedź odbiorcy: message.received (data.inbound z from, text, reply_to; data.opt_out: true, gdy STOP dopisało numer do czarnej listy). Pierwsze kliknięcie śledzonego linku: link.clicked (data.link z to, url, clicks i data.clicked_at).

POST → Twój webhook URL application/json
{
  "id": "evt_8sK2mQ…",
  "type": "message.delivered",
  "created_at": "2026-09-07T07:12:40.000Z",
  "data": {
    "message": {
      "id": "msg_qY08hZ2mmDXAazdRTytS",
      "status": "delivered",
      "to": "+48600123456",
      "reference": "wizyta-4711",
      "delivered_at": "2026-09-07T07:12:38.000Z",
      ...
    }
  }
}

🔏 Weryfikacja podpisu

Nagłówek X-Przypominamy-Signature: t=<unix>,v1=<hex>, gdzie v1 = HMAC-SHA256(webhook_secret, "<t>.<body>"). Odrzucaj, gdy podpis się nie zgadza albo t jest starsze niż 5 minut.

Node.js weryfikacja
const crypto = require('crypto');
const h = req.headers['x-przypominamy-signature'];
const t   = h.match(/t=(\d+)/)[1];
const sig = h.match(/v1=([0-9a-f]+)/)[1];
const expected = crypto
  .createHmac('sha256', WEBHOOK_SECRET)
  .update(`${t}.${rawBody}`)
  .digest('hex');
const ok = crypto.timingSafeEqual(
  Buffer.from(sig), Buffer.from(expected));
if (!ok || Math.abs(Date.now()/1000 - t) > 300)
  return res.status(403).end();

Limity i kody błędów

API używa standardowych kodów HTTP. Wszystkie błędy zwracają JSON: {"error":{"code":"insufficient_funds","message":"…","param":"to"},"request_id":"req_…"}. Każda odpowiedź ma nagłówek X-Request-Id.

Rate limit

120/min

Limit per konto. Do kampanii użyj tablicy to (do 500 numerów w jednym żądaniu). Po przekroczeniu HTTP 429 z nagłówkiem Retry-After.

Wyższe limity dostępne - napisz na [email protected].

KodZnaczenie
400invalid_request - błąd walidacji, pole w param
401unauthorized - brak, nieprawidłowy lub odwołany klucz
402insufficient_funds - niewystarczające środki
403forbidden - konto zawieszone lub zamknięte
409idempotency_conflict - ten sam Idempotency-Key, inna treść
422invalid_request - odrzucone przez dostawcę (numer, nadpis)
429rate_limited - przekroczono limit, patrz Retry-After
502 / 504provider_error - błąd lub timeout dostawcy SMS

Cennik API: pay-as-you-go

API dostępne w każdym progu. Kwota doładowania ustala stawkę za część SMS i zostaje na stałe - każde większe doładowanie obniża ją. Minimalne doładowanie 50 zł. Ceny netto za jedną część SMS do Polski, prepaid, bez abonamentu. Te same stawki obowiązują na całej platformie.

Start
0,15 zł/część SMS
Doładowanie: 50 zł · ok. 333 SMS-y
  • Stawka na stałe, nigdy nie rośnie
  • Wszystkie endpointy API, SDK, MCP
  • Webhooki statusów (HMAC)
  • Śledzone linki bez dopłaty
  • Rate limit 120 req/min
Plus
0,14 zł/część SMS
Doładowanie: 100 zł · ok. 714 SMS-ów
  • Stawka na stałe, nigdy nie rośnie
  • Wszystkie endpointy API, SDK, MCP
  • Webhooki statusów (HMAC)
  • Śledzone linki bez dopłaty
  • Rate limit 120 req/min
Max
0,10 zł/część SMS
Doładowanie: 500 zł i więcej · 5000 SMS-ów za 500 zł
  • Stawka na stałe, nigdy nie rośnie
  • Wszystkie endpointy API, SDK, MCP
  • Webhooki statusów (HMAC)
  • Śledzone linki bez dopłaty
  • Rate limit 120 req/min

Enterprise - powyżej 50 tys. SMS/mies.: stawka indywidualna od 0,10 zł, faktura miesięczna i limit kredytowy (postpaid na życzenie, po weryfikacji), dedykowane numery także odbiorcze (2-way), SLA, custom rate limits, dedykowany opiekun. Zapytaj o ofertę.

Ceny dotyczą SMS-ów wysyłanych do Polski. SMS priorytetowy (priority: true) to 2× stawka za część; sprawdzenie numeru HLR 0,05 zł. MMS i wiadomości głosowe wycenione osobno - pełen cennik na życzenie. SMS zagraniczny: 2× krajowa stawka konta za część netto. Kraje UE są aktywne; pozostałe kierunki po potwierdzeniu dostępności. Konto testowe: 25 SMS-ów gratis. Pełny cennik i kalkulator: /cennik.

Konto testowe od razu, weryfikacja przed produkcją

Klucz pk_test_ i 25 darmowych SMS-ów na własne, zweryfikowane numery dostajesz natychmiast po rejestracji. Wysyłka do dowolnych numerów rusza po pierwszym doładowaniu, a przy nietypowym ruchu sprawdzamy konto ręcznie. To celowy wybór, nie ograniczenie techniczne.

🛡️

Antyfraud

Konto testowe wysyła tylko na numery potwierdzone kodem SMS, a wysyłki produkcyjne wymagają doładowania i danych firmy. To odcina phishing i spam, zanim trafią do sieci operatorów.

📡

Reputacja nadawcy

Operatorzy filtrują numery, z których wychodzi spam. Konto testowe i pierwsze doładowanie ograniczają nadużycia, więc legalny ruch transakcyjny nie miesza się z masowym phishingiem na tej samej trasie.

👤

Ludzkie wsparcie

Na [email protected] i pod telefonem odpowiadają osoby, które piszą gateway i panel. Przy nietypowej wysyłce lub migracji z innej bramki podpowiemy nadpis, treść i częstotliwość.

Najczęstsze pytania o API

Jak zdobyć klucz API?

Załóż konto na /register - działa od razu, bez ręcznej weryfikacji. W panelu (Klucze) generujesz klucz pk_test_… natychmiast, z 25 SMS-ami gratis na 2 własne numery; po pierwszym doładowaniu od 50 zł wydajesz klucz pk_live_…. Klucz jest pokazywany raz i może mieć zakresy send/read/manage. Webhook ustawiasz sam w panelu albo przez PUT /v1/account/webhook.

Czy macie sandbox lub środowisko testowe?

Tak, w innej formie niż anonimowy sandbox: po rejestracji dostajesz od razu klucz pk_test_ i 25 darmowych SMS-ów na maksymalnie 2 własne numery potwierdzone kodem. Ten sam kod, te same endpointy i statusy co na produkcji. Wysyłkę do dowolnych numerów odblokowuje pierwsze doładowanie (od 50 zł); nietypowy ruch sprawdzamy ręcznie.

Jaki jest limit zapytań?

120 żądań na minutę per konto. Po przekroczeniu API zwraca HTTP 429 z nagłówkiem Retry-After. Do wysyłki masowej użyj tablicy to - do 500 numerów w jednym żądaniu liczy się jako jedno wywołanie.

Jak działa rozliczenie?

Prepaid. Każda wysyłka obciąża saldo w groszach według ceny za część SMS ustalonej dla Twojego konta (price_per_part_grosze w GET /v1/account). Części liczymy jak operatorzy: 160 znaków bez polskich znaków, 70 z polskimi; SMS priorytetowy liczy się podwójnie, sprawdzenie numeru HLR kosztuje 0,05 zł. Przy braku środków dostajesz 402 i nic nie jest wysyłane. Prepaid to domyślny i zalecany model; firmom po weryfikacji włączamy na życzenie rozliczenie miesięczne (postpaid: limit kredytowy, zestawienie 1. dnia miesiąca, 14 dni na przelew - pole billing_mode w GET /v1/account).

Czym różnicicie się od innych dostawców API SMS?

Jesteśmy nastawieni na małe i średnie firmy: pay-as-you-go od 50 zł, bez abonamentu i minimalnych zobowiązań. Konto testowe z 25 SMS-ami i klucz API od razu po rejestracji, bez czekania na weryfikację. Serwer MCP dla asystentów AI, natywny node n8n, SDK npm i PyPI. Polskie wsparcie. Dokumentacja po polsku. Jeden endpoint do wysyłki zamiast SOAP-u czy SDK z 30 metodami. Szczegółowe zestawienie: porównanie bramek SMS.

Czy API obsługuje MMS i wiadomości głosowe?

API v2 obsługuje SMS. MMS i wiadomości głosowe IVR/TTS realizujemy z poziomu platformy - napisz na [email protected], jeśli potrzebujesz ich przez API.

Jak skonfigurować webhook dla statusów doręczenia?

Wywołaj PUT /v1/account/webhook z adresem https. W odpowiedzi dostaniesz webhook_secret. Przy każdej zmianie statusu wysyłamy POST application/json ze zdarzeniem (message.delivered, message.failed…) i pełnym obiektem wiadomości - a także message.received (odpowiedź odbiorcy) i link.clicked (pierwsze kliknięcie śledzonego linku) - podpisany nagłówkiem X-Przypominamy-Signature. Odpowiedz 2xx; przy błędzie ponawiamy do 3 razy.

Czy mogę mierzyć kliknięcia w linki z SMS-a?

Tak. Wstaw {{link:https://…}} w treści (do 2 różnych adresów). Każdy odbiorca dostaje własny krótki link api.przypominamy.com/l/<token>, więc wiesz, kto kliknął, ile razy i kiedy: GET /v1/messages/{id} zwraca links[], GET /v1/links?message_id=… zestawienie z totals, a przy pierwszym kliknięciu przychodzi webhook link.clicked. Bez dopłaty, na każdym koncie. Linki, {{opt_out}} i pola z kontaktów dzielą wspólny budżet 4 placeholderów na wiadomość.

Czy odbiorca może odpowiedzieć na SMS?

Tak - odbiór odpowiedzi (2-way) uruchamiamy na życzenie, po włączeniu numeru odbiorczego dla Twojego konta (napisz na [email protected]). Odpowiedź trafia do Ciebie, gdy zaczyna się od Twojego słowa kluczowego (inbound_prefix, ustawiane przez PATCH /v1/account) albo gdy to Ty ostatni pisałeś na ten numer w ciągu 30 dni (reply_to = id wysyłki). Czytasz je przez GET /v1/inbound, webhookiem message.received albo w panelu; STOP automatycznie trafia na czarną listę. Dostępność numeru i warunki odbioru potwierdza obsługa przed uruchomieniem. Endpointy działają już dziś; do uruchomienia inbound_number w GET /v1/account jest null.

Czy mogę używać własnej nazwy nadawcy (nadpisu)?

Tak. Nadpis (do 11 znaków) rejestrujemy na życzenie; po weryfikacji u operatora (zwykle 1–2 dni robocze) widzisz go w GET /v1/senders. Ustaw go jako domyślny przez PATCH /v1/account albo podaj per wiadomość w polu from. Bez własnego nadpisu SMS-y wychodzą jako PRZYPOMINAM.

Jak uniknąć podwójnej wysyłki przy retry?

Dodaj nagłówek Idempotency-Key (np. id wizyty). Powtórzenie żądania z tym samym kluczem i tą samą treścią w ciągu 24h zwraca pierwotną odpowiedź bez ponownej wysyłki i obciążenia. Ten sam klucz z inną treścią dostaje 409.

Czy są SDK dla Pythona, Node.js lub innych języków?

Tak: npm install przypominamy (Node.js, Deno, Bun, Cloudflare Workers) i pip install przypominamy (Python 3.9+). Obie paczki są bez zależności, MIT, z typowanym błędem i weryfikacją podpisu webhooków. Możesz też użyć dowolnego klienta HTTP - przykłady curl, Python, Node.js i PHP znajdziesz w dokumentacji Redoc i na blogu.

Następny krok: klucz testowy

Załóż konto, wygeneruj pk_test_… i wyślij pierwszy POST /v1/messages. Specyfikacja: /api/docs, ceny: /cennik.

Załóż konto →

Masz pytania? Napisz na [email protected].

Uruchomienie produkcyjne

Po doładowaniu utwórz nowy klucz pk_live_ w panelu i podmień go w integracji. Stary pk_test_ nie uruchamia płatnych wysyłek. Zagraniczne kierunki wymagają indywidualnej stawki i aktywacji.

Przy ponowieniu zachowaj Idempotency-Key (MCP: idempotency_key). Zakończony wynik jest odtwarzany przez 24 h. HTTP 409 może oznaczać operację w toku lub nierozstrzygniętą - sprawdź historię, nie używaj nowego klucza po timeoutcie.

Nowości i praktyczne zastosowania

Co nowego w platformie · SMS w gastronomii: zamówienia i opóźnienia

Przypominamy.com – logo platformy SMS, MMS i IVR
Asystent Przypominamy ● Online. Odpowiada od razu
Cześć! 👋 Jestem asystentem platformy Przypominamy.com.

Pomogę Ci dobrać plan, wyjaśnię jak działa API lub odpowiem na pytania o SMS, MMS i IVR. Jak mogę pomóc?
teraz