SDK · biblioteki · przykłady

SDK do API SMS: Node.js, Python, PHP, curl

Oficjalne paczki dla Node.js i Pythona, gotowa klasa dla PHP i przykład na czystym HTTP. Każda biblioteka opakowuje ten sam endpoint POST /v1/messages, więc możesz zacząć od curl-a i przejść na SDK bez zmiany logiki. Do tego konektory no-code i weryfikacja webhooków w trzech językach.

Licencja MITBez zależnościKlucz pk_test_… od razu po rejestracji

Cztery drogi do pierwszego SMS-a

Ustaw klucz API w zmiennej środowiskowej PRZYPOMINAMY_API_KEY (klucz testowy pk_test_… dostajesz od razu po rejestracji, produkcyjny pk_live_… po pierwszym doładowaniu) i wybierz język.

JS

Node.js, Deno, Bun, Cloudflare Workers

TypeScript, ESM i CommonJS, zero zależności. Działa wszędzie, gdzie jest globalny fetch: Node.js 18+, Deno, Bun, Workers, Vercel Edge.

Instalacjanpm
npm install przypominamy
Wysyłka SMSindex.mjs
import { Przypominamy } from 'przypominamy';

const sms = new Przypominamy(process.env.PRZYPOMINAMY_API_KEY);
const msg = await sms.send({
  to: '+48600123456',
  text: 'Przypominamy o wizycie jutro o 14:00.',
  reference: 'wizyta-4521',
});
console.log(msg.id, msg.status, msg.parts); // msg_… queued 1

Repozytorium na GitHubie · npm · Przewodnik: API SMS w Node.js

Py

Python 3.9+

Typowana paczka na PyPI, klient synchroniczny oparty o bibliotekę standardową. Wyjątek PrzypominamyError z kodem błędu, retry_after i request_id.

Instalacjapip
pip install przypominamy
Wysyłka SMSsend.py
import os
from przypominamy import Przypominamy

sms = Przypominamy(os.environ["PRZYPOMINAMY_API_KEY"])
msg = sms.send(
    "+48600123456",
    "Przypominamy o wizycie jutro o 14:00.",
    reference="wizyta-4521",
)
print(msg["id"], msg["status"], msg["parts"])

Repozytorium na GitHubie · PyPI · Przewodnik: API SMS w Pythonie

PHP

PHP 8.1+

Nie publikujemy paczki na Packagist — zamiast tego jedna klasa (~80 linii, curl, bez zależności) do wklejenia do projektu. Metody send, get, list, account, senders, setWebhook.

Instalacjaręcznie
Skopiuj klasę Przypominamy z artykułu /blog/api-sms-php do pliku Przypominamy.php
Wysyłka SMSsend.php
<?php
require __DIR__ . '/Przypominamy.php'; // klasa z /blog/api-sms-php

$sms = new Przypominamy(getenv('PRZYPOMINAMY_API_KEY'));
$msg = $sms->send('+48600123456', 'Przypominamy o wizycie jutro o 14:00.', [
    'reference'       => 'wizyta-4521',
    'idempotency_key' => 'wizyta-4521-przypomnienie',
]);
echo $msg['id'], ' ', $msg['status'], ' ', $msg['parts'], PHP_EOL;

Pełna klasa i przewodnik: API SMS w PHP (Laravel, WordPress, czysty PHP)

$

curl i dowolny klient HTTP

Bez biblioteki. Jedno żądanie POST z JSON-em i nagłówkiem Bearer. Do 500 odbiorców w polu to jako tablica; send_at planuje wysyłkę, from ustawia nadpis.

Wysyłka SMSbash
curl https://api.przypominamy.com/v1/messages \
  -H "Authorization: Bearer $PRZYPOMINAMY_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: wizyta-4521-przypomnienie" \
  -d '{
    "to": "+48600123456",
    "text": "Przypominamy o wizycie jutro o 14:00.",
    "reference": "wizyta-4521"
  }'

Pełna lista endpointów: GET /v1/messages, GET /v1/messages/{id}, GET /v1/account, PATCH /v1/account, GET /v1/senders, PUT /v1/account/webhook, GET /v1/reports — w dokumentacji Redoc i openapi.json.

Co dostajesz w odpowiedzi

Niezależnie od języka, POST /v1/messages zwraca HTTP 201 z obiektem wiadomości: identyfikator id (msg_…), status (na starcie queued), liczbę części parts, koszt, użyty nadpis oraz Twoje pole reference. Przy wysyłce do wielu odbiorców odpowiedź zawiera tablicę takich obiektów — po jednym na numer. Duplikaty numerów są usuwane, a nieprawidłowe numery zwracane z kodem błędu bez blokowania reszty.

Błędy mają jednolity kształt: { "error": { "code": "invalid_number", "message": "…", "param": "to" } } plus nagłówek X-Request-Id, który warto logować i podawać przy kontakcie ze wsparciem. SDK zamieniają go na wyjątek z tymi samymi polami. Nagłówek Idempotency-Key gwarantuje, że ponowienie tego samego żądania (np. po timeoucie) nie wyśle SMS-a drugi raz.

Konektory no-code

Nie każdy SMS wymaga kodu. Jeśli Twoje dane żyją w Google Sheets, sklepie, kalendarzu albo CRM, jeden moduł HTTP w narzędziu do automatyzacji wystarczy. Na każdej stronie integracji znajdziesz gotowy workflow do importu.

Konektory używają tego samego klucza API i tych samych stawek co SDK. Limit 120 żądań na minutę dotyczy konta, nie narzędzia.

Webhooki: weryfikacja podpisu

Adres ustawiasz przez PUT /v1/account/webhook; w odpowiedzi dostajesz webhook_secret. Przy każdej zmianie statusu wysyłamy POST z JSON-em o zdarzeniu message.sent, message.delivered, message.undelivered, message.failed lub message.expired. Nagłówek X-Przypominamy-Signature: t=<unix>,v1=<hex>, gdzie v1 = HMAC-SHA256(webhook_secret, "<t>.<surowe body>"). Odrzucaj, gdy podpis się nie zgadza lub t jest starsze niż 5 minut. Zawsze licz HMAC na surowym body, nie na sparsowanym JSON-ie.

Weryfikacja podpisuverify.mjs
import { createHmac, timingSafeEqual } from 'node:crypto';

export function verify(rawBody, header, secret) {
  const m = /t=(\d+),v1=([0-9a-f]{64})/.exec(header ?? '');
  if (!m) return false;
  const [, t, sig] = m;
  if (Math.abs(Date.now() / 1000 - Number(t)) > 300) return false;
  const expected = createHmac('sha256', secret).update(`${t}.${rawBody}`).digest('hex');
  return timingSafeEqual(Buffer.from(sig, 'hex'), Buffer.from(expected, 'hex'));
}
// lub: import { verifyWebhook } from 'przypominamy';
Weryfikacja podpisuverify.py
import hmac, hashlib, re, time

def verify(raw_body: bytes, header: str, secret: str) -> bool:
    m = re.match(r"t=(\d+),v1=([0-9a-f]{64})", header or "")
    if not m:
        return False
    t, sig = m.groups()
    if abs(time.time() - int(t)) > 300:
        return False
    expected = hmac.new(secret.encode(), f"{t}.".encode() + raw_body, hashlib.sha256).hexdigest()
    return hmac.compare_digest(sig, expected)
# lub: from przypominamy import verify_webhook
Weryfikacja podpisuverify.php
<?php
function verify(string $rawBody, ?string $header, string $secret): bool {
    if (!preg_match('/t=(\d+),v1=([0-9a-f]{64})/', $header ?? '', $m)) return false;
    [, $t, $sig] = $m;
    if (abs(time() - (int)$t) > 300) return false;
    $expected = hash_hmac('sha256', "$t.$rawBody", $secret);
    return hash_equals($expected, $sig);
}
$ok = verify(file_get_contents('php://input'), $_SERVER['HTTP_X_PRZYPOMINAMY_SIGNATURE'] ?? null, getenv('PRZYPOMINAMY_WEBHOOK_SECRET'));

Odpowiadaj 200 od razu i przetwarzaj zdarzenie w tle. Jeśli endpoint nie odpowie w kilka sekund lub zwróci błąd, ponawiamy dostarczenie z rosnącym odstępem; obsłuż więc duplikaty po id wiadomości i wartości statusu.

Częste pytania o SDK

Czy SDK są darmowe i otwarte?

Tak. Paczki przypominamy dla Node.js (npm) i Pythona (PyPI) są na licencji MIT, bez zależności zewnętrznych, z kodem źródłowym na GitHubie (pawelmamcarz/przypominamy-node i pawelmamcarz/przypominamy-python). Klasa PHP z naszego bloga również jest do swobodnego użycia. Płacisz wyłącznie za wysłane części SMS.

Czy muszę używać SDK, żeby korzystać z API?

Nie. API to zwykły REST z JSON-em i nagłówkiem Authorization: Bearer — każdy klient HTTP wystarczy (curl, fetch, requests, Guzzle). SDK dodaje typy, obsługę błędów jako wyjątki, automatyczne ponawianie przy HTTP 429 i weryfikację podpisu webhooków, ale nie robi nic, czego nie zrobisz ręcznie w kilkunastu linijkach.

Jak testować bez wysyłania prawdziwych SMS-ów?

Po rejestracji dostajesz klucz pk_test_… i 25 darmowych SMS-ów na maksymalnie 2 własne, zweryfikowane numery. To prawdziwe wiadomości dostarczane na Twój telefon, więc sprawdzisz nadpis, kodowanie polskich znaków i webhooki. Osobnego sandboxa z fikcyjnymi numerami nie ma — konto testowe jest tym sandboxem.

Co się stanie, gdy przekroczę limit 120 żądań na minutę?

API odpowie kodem HTTP 429 z nagłówkiem Retry-After (w sekundach). SDK dla Node.js i Pythona zgłaszają wtedy błąd o kodzie rate_limited z polem retryAfter, więc możesz odczekać i ponowić z tym samym Idempotency-Key. Do wysyłki masowej użyj tablicy odbiorców — do 500 numerów w jednym żądaniu liczy się jako jedno żądanie.

Czy przez SDK mogę wysłać MMS albo wiadomość głosową?

Nie. API v2 i SDK obsługują SMS. MMS z grafiką oraz wiadomości głosowe IVR/TTS zlecasz z panelu klienta na app.przypominamy.com. Jeśli MMS lub głos w API jest dla Ciebie warunkiem koniecznym, napisz na [email protected] — zbieramy takie zgłoszenia przy planowaniu kolejnych wersji.

Klucz testowy w minutę

Rejestracja daje od razu pk_test_… i 25 darmowych SMS-ów na dwa własne numery. Bez karty. Doładowanie od 50 zł aktywuje klucz produkcyjny.

Załóż konto

Brakuje SDK dla Twojego języka? Napisz na [email protected].

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