← Zpět na blog
19. května 2026·4 min čtení·Tým TopSMS

SMS API za 5 minut: quickstart pro vývojáře

Od registrace k první odeslané SMS přes REST API za 5 minut. Příklady v PHP, Node.js, Python a curl. Bez SDK, jen HTTP.

TL;DR: Registrace, vystavení API klíče a první odeslaná SMS přes REST API — celkem 5 minut. V tomto quickstartu najdete kód v 4 jazycích (curl, PHP, Node.js, Python) a vysvětlení autentizace, formátů a typických chyb. Bez nutnosti SDK — stačí HTTP klient.

Tento návod je pro vývojáře, kteří chtějí poslat první SMS přes TopSMS API co nejrychleji. Předpokládá základní znalost HTTP a JSON.

1. Registrace + API klíč (2 minuty)

  1. Vytvořte si účet na topsms.cz/sms-zdarma — dostanete 10 SMS zdarma na test
  2. Ověřte telefon přes OTP kód v SMS
  3. V dashboardu jděte na /dashboard/api → "Vytvořit klíč"
  4. Vyplňte:
    • Název: dev-test (jen pro vás)
    • Scopes: zaškrtnout send (odesílání) a read (čtení statusu)
    • IP whitelist: pro produkci vyplnit, pro test můžete přeskočit
  5. Klikněte "Vytvořit" — uvidíte clientId a secret (secret se ukáže jen jednou, uložte si)

Autentizace probíhá Bearer tokenem ve formátu clientId:secret.

2. První SMS přes curl (30 sekund)

curl -X POST https://www.topsms.cz/api/sms/send \
  -H "Authorization: Bearer YOUR_CLIENT_ID:YOUR_SECRET" \
  -H "Content-Type: application/json" \
  -d '{
    "to": "+420608030884",
    "from": "TopSMS",
    "text": "Ahoj z API!"
  }'

Odpověď:

{
  "ok": true,
  "messageId": "cmp...",
  "externalId": "abc-123",
  "status": "queued",
  "cost": 0.93
}

Latence end-to-end (vaše terminál → telefon příjemce) je typicky 2-4 sekundy.

3. PHP (3 řádky)

$ch = curl_init('https://www.topsms.cz/api/sms/send');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST => true,
    CURLOPT_HTTPHEADER => [
        'Authorization: Bearer ' . getenv('TOPSMS_CLIENT_ID') . ':' . getenv('TOPSMS_SECRET'),
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'to' => '+420608030884',
        'from' => 'TopSMS',
        'text' => 'Ahoj z PHP!',
    ]),
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);

if ($response['ok'] ?? false) {
    echo "SMS odeslána, ID: {$response['messageId']}";
}

Pro produkci doporučujeme Guzzle HTTP client — lepší error handling.

4. Node.js (s native fetch)

const response = await fetch('https://www.topsms.cz/api/sms/send', {
  method: 'POST',
  headers: {
    'Authorization': `Bearer ${process.env.TOPSMS_CLIENT_ID}:${process.env.TOPSMS_SECRET}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    to: '+420608030884',
    from: 'TopSMS',
    text: 'Ahoj z Node.js!',
  }),
})

const data = await response.json()
if (data.ok) {
  console.log('SMS odeslána, ID:', data.messageId)
} else {
  console.error('Chyba:', data.error)
}

Node.js 18+ má fetch nativně. Pro starší verze použijte node-fetch nebo axios.

5. Python (requests)

import os
import requests

response = requests.post(
    'https://www.topsms.cz/api/sms/send',
    headers={
        'Authorization': f'Bearer {os.environ["TOPSMS_CLIENT_ID"]}:{os.environ["TOPSMS_SECRET"]}',
        'Content-Type': 'application/json',
    },
    json={
        'to': '+420608030884',
        'from': 'TopSMS',
        'text': 'Ahoj z Pythonu!',
    },
)

data = response.json()
if data.get('ok'):
    print(f"SMS odeslána, ID: {data['messageId']}")
else:
    print(f"Chyba: {data.get('error')}")

6. Formát telefonního čísla

Vždy E.164 formát s prefixem +:

  • +420608030884 (CZ)
  • +421900123456 (SK)
  • +49301234567 (DE)
  • 608030884 (bez prefixu — odmítnuto)
  • 00420608030884 (00 místo + — odmítnuto)
  • 608 030 884 (mezery — odmítnuto)

Pokud máte databázi s nestandardním formátem, použijte naši validator endpoint pro normalizaci před odesláním.

7. Sender ID (from parametr)

  • Bez vlastního sender ID: pošlete TopSMS (náš default) — funguje pro test
  • S vlastním sender ID: pošlete schválené jméno (např. Eshop123) — viz Sender ID schválení
  • Max 11 znaků, jen písmena/čísla/pomlčka/podtržítko

8. Čtení statusu zprávy

Po odeslání máte messageId. Status zjistíte:

curl -H "Authorization: Bearer YOUR_CLIENT_ID:YOUR_SECRET" \
  https://www.topsms.cz/api/sms/status/MESSAGE_ID

Odpověď:

{
  "id": "cmp...",
  "status": "delivered",
  "deliveredAt": "2026-05-19T10:23:45Z",
  "operatorCost": 0.028,
  "carrier": "230.2"
}

Možné stavy: queued, sent, delivered, failed, expired, rejected.

Alternativně si nastavte webhook URL v API klíči — pak vám delivery report přijde POSTem v reálném čase. Viz Webhooky v SMS API.

9. Typické chyby (HTTP status)

StatusDůvodŘešení
401Špatný tokenZkontrolovat Authorization header
400Neplatný telefonE.164 formát s + prefix
400Neplatné fromSender ID musí být schválené nebo TopSMS
402Nedostatek kredituDobít kredit v dashboardu
403Scope send chybíEditovat API klíč, zaškrtnout send
429Rate limit (default 60 SMS/min)Slow down nebo požádat o vyšší limit
500Server errorRetry s exponential backoff, kontaktovat support

10. Doporučená architektura pro produkci

[Vaše aplikace]
      ↓ POST /api/sms/send
[TopSMS API]
      ↓ async
[T-Mobile / O2 / Vodafone]
      ↓
[Telefon příjemce]
      ↓ delivery report
[TopSMS API]
      ↓ POST webhook
[Vaše aplikace]
      ↓ update DB

Klíčové principy:

  1. Idempotence: před retry zkontrolujte status, abyste neodeslali 2× stejnou zprávu
  2. Webhook signature: validujte HMAC podpis (nastavitelný per API key)
  3. Rate limit budget: rozdělte denní objem do peaků s rezervou 30 %
  4. Fallback: pokud kredit padne pod threshold, použijte záložní cestu (jiný kanál)

11. Bezpečnost — co NEdělat

Nikdy nevkládejte API key do frontendu (JavaScript v prohlížeči) — kdokoli ho ukradne. Volání API jen ze serveru.

Nikdy commit do gitu — používejte .env soubor + .gitignore.

Nesdílejte secret — ne v Discord, Slack, screenshotech. Pokud došlo k úniku, hned vystavte nový a starý revoke.

Nezneužívejte testovací data — neposílejte SMS na náhodná čísla. Posílá-li někdo na +420608030884 (test číslo z dokumentace), zaplatí to.

12. Co dál

Po prvním úspěšném messageId máte funkční integraci. Další kroky:

Pro vyšší objemy (50k+ SMS/den) zvažte SMPP protokol — REST vs SMPP.

Související články

apiquickstartdeveloper
Otestujte TopSMS zdarma

10 SMS na start, bez závazku, registrace minuta.

Registrovat zdarma →