← Blog

Integracja API SMS z CRM. Od zera do wysyłki w 30 minut

Zespół Przypominamy.com · 5 marca 2026 · 6 min czytania

Ręczne logowanie do panelu i wysyłanie SMS-ów z poziomu przeglądarki sprawdza się przy małych wolumenach. Ale gdy Twój CRM, system rezerwacji lub platforma e-commerce obsługuje tysiące kontaktów, potrzebujesz automatyzacji przez API. W tym artykule przeprowadzimy Cię przez pełną integrację z REST API Przypominamy.com. Od uzyskania klucza API, przez wysyłkę pierwszego SMS-a, konfigurację webhooków, aż po obsługę błędów i najlepsze praktyki produkcyjne.

Wymagania wstępne

Zanim zaczniesz, upewnij się, że masz:

Krok 1: Autoryzacja. Nagłówek API Key

API Przypominamy.com używa autoryzacji przez nagłówek HTTP. Każde żądanie musi zawierać nagłówek Authorization z tokenem Bearer:

Authorization: Bearer TWOJ_KLUCZ_API

Klucz API zaczyna się od pk_live_. Traktuj go jak hasło. Nie commituj do repozytorium, nie przesyłaj w URL-ach i nie udostępniaj osobom trzecim. Zalecamy przechowywanie klucza w zmiennych środowiskowych:

# Bash. Eksport zmiennej środowiskowej
export PRZYPOMINAMY_API_KEY="pk_live_abc123def456..."

# Python. Odczyt ze zmiennej środowiskowej
import os
api_key = os.environ["PRZYPOMINAMY_API_KEY"]

Klucz można w każdej chwili odwołać i wydać nowy (napisz na [email protected]). Po odwołaniu stary klucz natychmiast przestaje działać. Możesz mieć kilka kluczy naraz, np. osobne dla produkcji i testów.

Krok 2: Wysyłka pojedynczego SMS-a

Endpoint do wysyłki SMS-a to POST /v1/messages. Ten sam endpoint obsługuje jednego odbiorcę i wysyłkę masową. Przykład w curl:

curl -X POST 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",
    "from": "MojaFirma",
    "text": "Przypominamy o wizycie jutro o 10:00. Pozdrawiamy!",
    "reference": "wizyta-4521"
  }'

Ten sam request w Pythonie z biblioteką requests:

import os
import requests

API_URL = "https://api.przypominamy.com/v1/messages"
API_KEY = os.environ["PRZYPOMINAMY_API_KEY"]

response = requests.post(
    API_URL,
    headers={
        "Authorization": f"Bearer {API_KEY}",
        "Content-Type": "application/json",
        "Idempotency-Key": "wizyta-4521-przypomnienie",
    },
    json={
        "to": "+48600123456",
        "from": "MojaFirma",
        "text": "Przypominamy o wizycie jutro o 10:00. Pozdrawiamy!",
        "reference": "wizyta-4521",
    },
    timeout=10,
)

message = response.json()
print(f"Status HTTP: {response.status_code}")
print(f"Message ID: {message['id']}")
print(f"Koszt: {message['cost_grosze'] / 100:.2f} PLN")

Parametry żądania:

Parametr Typ Wymagany Opis
to string | string[] Tak Numer odbiorcy w formacie E.164 (np. +48600123456) albo tablica do 500 numerów
from string Nie Nadpis (nazwa nadawcy), max 11 znaków; musi być na liście GET /v1/senders. Domyślnie nadpis konta.
text string Tak Treść wiadomości, do 1000 znaków. Polskie znaki dozwolone (70 znaków na część zamiast 160).
reference string Nie Twój wewnętrzny identyfikator (np. id wizyty), zwracany w odpowiedzi, w webhookach i jako filtr w historii
send_at ISO 8601 Nie Zaplanuj wysyłkę na przyszłość, do 90 dni (np. 2026-09-20T10:00:00Z)

Nagłówek Idempotency-Key jest opcjonalny, ale warto go podawać: jeśli Twój kod ponowi żądanie po timeoucie, API zwróci pierwotną odpowiedź zamiast wysłać SMS drugi raz.

Odpowiedź (HTTP 201):

{
  "id": "msg_7f3a2b1c9d4e",
  "status": "queued",
  "to": "+48600123456",
  "from": "MojaFirma",
  "text": "Przypominamy o wizycie jutro o 10:00. Pozdrawiamy!",
  "parts": 1,
  "cost_grosze": 15,
  "reference": "wizyta-4521",
  "send_at": null,
  "delivered_at": null,
  "error": null,
  "created_at": "2026-09-07T08:00:00.000Z",
  "updated_at": "2026-09-07T08:00:00.000Z"
}

Krok 3: Wysyłka masowa (batch)

Aby wysłać tę samą wiadomość do wielu odbiorców w jednym żądaniu, podaj w polu to tablicę numerów (do 500, duplikaty są usuwane):

curl -X POST https://api.przypominamy.com/v1/messages \
  -H "Authorization: Bearer $PRZYPOMINAMY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "from": "MojaKlinika",
    "to": ["+48600111222", "+48600333444", "+48600555666"],
    "text": "Przypominamy o wizycie 20.09",
    "reference": "kampania-2026-09-20"
  }'

Odpowiedź zbiorcza zawiera koszt łączny i osobny rekord dla każdego odbiorcy:

{
  "count": 3,
  "accepted": 3,
  "total_cost_grosze": 45,
  "messages": [
    { "id": "msg_a1…", "status": "queued", "to": "+48600111222", "cost_grosze": 15, ... },
    { "id": "msg_b2…", "status": "queued", "to": "+48600333444", "cost_grosze": 15, ... },
    { "id": "msg_c3…", "status": "queued", "to": "+48600555666", "cost_grosze": 15, ... }
  ]
}

Spersonalizowane treści (imię, godzina wizyty) wysyłasz jako osobne żądania. Limit 120 żądań na minutę wystarcza na kilka tysięcy przypomnień na godzinę; dla większych wolumenów użyj kolejki i wysyłaj z respektowaniem nagłówka Retry-After.

Krok 4: Webhooks. Odbieranie statusów doręczenia

Webhooks pozwalają Twojemu systemowi CRM otrzymywać powiadomienia o zdarzeniach w czasie rzeczywistym - doręczeniu wiadomości, błędzie dostarczenia, odpowiedzi odbiorcy. Konfigurację wykonujesz raz, jednym wywołaniem:

curl -X PUT https://api.przypominamy.com/v1/account/webhook \
  -H "Authorization: Bearer $PRZYPOMINAMY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://twoj-crm.pl/webhooks/sms"}'

{ "webhook_url": "https://twoj-crm.pl/webhooks/sms",
  "webhook_secret": "whsec_…",
  "signature_header": "X-Przypominamy-Signature" }

Zapisz webhook_secret. Każde wywołanie webhooka jest podpisane nagłówkiem X-Przypominamy-Signature: t=<unix>,v1=<hex>, gdzie v1 = HMAC-SHA256(webhook_secret, "<t>.<body>"). Weryfikuj podpis i odrzucaj wywołania starsze niż 5 minut.

Przykładowy payload zdarzenia message.delivered wysyłany na skonfigurowany webhook:

{
  "id": "evt_8sK2mQ…",
  "type": "message.delivered",
  "created_at": "2026-09-18T09:01:25.000Z",
  "data": {
    "message": {
      "id": "msg_7f3a2b1c9d4e",
      "status": "delivered",
      "to": "+48600123456",
      "reference": "wizyta-4521",
      "delivered_at": "2026-09-18T09:01:23.000Z",
      ...
    }
  }
}

Typy zdarzeń: message.sent, message.delivered, message.undelivered, message.failed, message.expired. Pole data.message.reference to wartość, którą podałeś przy wysyłce - po niej odnajdziesz wizytę w CRM. Zalecamy, aby Twój endpoint odpowiadał kodem HTTP 2xx w ciągu kilku sekund; przy innym kodzie platforma ponawia dostarczenie (łącznie 3 próby). Dłuższe przetwarzanie wykonuj asynchronicznie.

Krok 5: Obsługa błędów i retry

API zwraca standardowe kody HTTP. Oto najważniejsze scenariusze błędów i sposoby ich obsługi:

Kod HTTP Znaczenie Co robić
400 / 422 Błąd walidacji (np. nieprawidłowy numer, nieaktywny nadpis); pole w error.param Sprawdź format danych, nie powtarzaj żądania
401 Nieprawidłowy, brakujący lub odwołany klucz API Sprawdź zmienną środowiskową; w razie potrzeby poproś o nowy klucz
402 Brak środków na koncie (komunikat podaje koszt i dostępne saldo) Doładuj konto, sprawdzaj saldo przez GET /v1/account
429 Przekroczony limit żądań (rate limit) Odczekaj czas z nagłówka Retry-After
502 / 504 Błąd lub brak odpowiedzi dostawcy SMS Powtórz żądanie z exponential backoff i tym samym Idempotency-Key

Implementacja strategii retry w Pythonie z wykładniczym cofaniem (exponential backoff):

import time
import requests

def send_sms_with_retry(payload, idempotency_key, max_retries=3):
    """Wysyła SMS z automatycznym ponowieniem przy błędach serwera.
    Ten sam Idempotency-Key przy każdej próbie = brak podwójnej wysyłki."""
    for attempt in range(max_retries):
        response = requests.post(
            "https://api.przypominamy.com/v1/messages",
            headers={
                "Authorization": f"Bearer {API_KEY}",
                "Content-Type": "application/json",
                "Idempotency-Key": idempotency_key,
            },
            json=payload,
            timeout=10,
        )

        if response.status_code == 201:
            return response.json()

        if response.status_code == 429:
            wait = int(response.headers.get("Retry-After", 5))
            time.sleep(wait)
            continue

        if response.status_code >= 500:
            wait = 2 ** attempt  # 1s, 2s, 4s
            time.sleep(wait)
            continue

        # Błędy 4xx (oprócz 429). Nie ponawiaj
        response.raise_for_status()

    raise Exception("Nie udało się wysłać SMS po 3 próbach")

Rate limits i najlepsze praktyki

API Przypominamy.com stosuje limity żądań (rate limits):

Oto praktyczne wskazówki dla stabilnej integracji produkcyjnej:

Integracja z popularnymi CRM-ami

Jeśli korzystasz z gotowego systemu CRM, integracja może być jeszcze prostsza dzięki natywnym wtyczkom i connectorom:

Szczegółowe instrukcje instalacji dla każdego CRM znajdziesz w dokumentacji API.

Podsumowanie

Integracja API SMS z CRM to inwestycja jednego dnia pracy developera, która automatyzuje komunikację z klientami na lata. Kluczowe wnioski:

  1. Autoryzacja przez Bearer token: prosty i bezpieczny mechanizm.
  2. Jeden endpoint POST /v1/messages do pojedynczych wiadomości i wysyłek masowych (tablica to).
  3. Webhooks dają Ci informacje o doręczeniu i odpowiedziach w czasie rzeczywistym.
  4. Implementuj retry z exponential backoff dla błędów 429 i 5xx.
  5. Używaj osobnego klucza do testów, nagłówka Idempotency-Key przy retry i monitoruj saldo programowo.

Cała dokumentacja API z interaktywnym exploratorem jest dostępna pod adresem przypominamy.com/api/docs. Jeśli potrzebujesz wsparcia przy integracji, napisz na [email protected], nasz zespół techniczny odpowiada w ciągu 2 godzin w dni robocze.

Zacznij integrację już teraz

Załóż konto i wygeneruj klucz API. Pierwszy SMS wyślesz w 5 minut.

Załóż konto i uzyskaj API Key
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