Schnellstart
- Konto anlegen. Registrieren Sie sich mit Ihrer Handynummer. Neue Konten bekommen 10 Credits zum Ausprobieren.
- App anlegen. Ihr Name steht in der Nachricht, die Ihre Nutzer bekommen. Auf der Seite der App können Sie sofort eine Testverifizierung im Browser durchspielen.
- Testschlüssel erzeugen. Er beginnt mit
sk_test_, verschickt nichts und verbraucht keine Credits. - Code senden und prüfen, wie in den Beispielen. Im Testmodus ist der Code immer
000000. - Live gehen. Live-Schlüssel erzeugen, Guthaben kaufen, Hinweis ins Formular setzen. Fertig.
# 1. Code senden curl https://api.telify.de/v1/verifications \ -H "Authorization: Bearer sk_test_…" \ --json '{"phone": "+4915123456789"}' # → {"id": "ver_01JC8ZK4…", "status": "pending", "channel": "whatsapp"} # 2. Code prüfen curl https://api.telify.de/v1/verifications/ver_01JC8ZK4…/check \ -H "Authorization: Bearer sk_test_…" \ --json '{"code": "000000"}' # → {"status": "approved", "valid": true}
use Illuminate\Support\Facades\Http; $telify = Http::baseUrl('https://api.telify.de/v1') ->withToken(config('services.telify.key')); // 1. Code senden $verification = $telify->post('/verifications', [ 'phone' => '+4915123456789', ])->json(); // 2. Code prüfen $result = $telify->post("/verifications/{$verification['id']}/check", [ 'code' => $request->input('code'), ])->json(); if ($result['valid']) { /* Nummer bestätigt */ }
const telify = (path, body) => fetch(`https://api.telify.de/v1${path}`, { method: 'POST', headers: { Authorization: `Bearer ${process.env.TELIFY_KEY}`, 'Content-Type': 'application/json', }, body: JSON.stringify(body), }).then((res) => res.json()); // 1. Code senden const { id } = await telify('/verifications', { phone: '+4915123456789' }); // 2. Code prüfen const { valid } = await telify(`/verifications/${id}/check`, { code });
import os, requests api = requests.Session() api.headers["Authorization"] = f"Bearer {os.environ['TELIFY_KEY']}" base = "https://api.telify.de/v1" # 1. Code senden verification = api.post(f"{base}/verifications", json={"phone": "+4915123456789"}).json() # 2. Code prüfen result = api.post(f"{base}/verifications/{verification['id']}/check", json={"code": code}).json()
Die Basis-URL ist https://api.telify.de/v1. Jede Anfrage trägt den Schlüssel als Authorization: Bearer sk_… und schickt JSON.
Testmodus
Mit einem Testschlüssel läuft alles wie live, nur ohne Versand und ohne Kosten. Der Code ist immer 000000. Diese Nummern liefern feste Ergebnisse, jede andere deutsche Handynummer wird zugestellt:
| Nummer | Ergebnis |
|---|---|
+4915550000001 | wird zugestellt |
+4915550000002 | nicht zustellbar, Status undeliverable |
+4915550000003 | Limit erreicht, 429 rate_limited |
Hinweis im Formular
Ihre Nutzer sollten wissen, dass gleich eine Nachricht kommt. Für WhatsApp verlangt Meta das ausdrücklich. Setzen Sie diesen Satz neben das Feld für die Handynummer:
Wir schicken Ihnen einen Bestätigungscode per WhatsApp oder SMS. Absender ist Telify.
We will send you a verification code via WhatsApp or SMS. The sender is Telify.
Schicken Sie nur SMS, reicht „Wir schicken Ihnen einen Bestätigungscode per SMS.“
Ablauf und Status
Ein Code gilt zehn Minuten. Ihr Nutzer hat fünf Versuche, und Sie können den Code einmal erneut senden, frühestens nach 60 Sekunden. Telify versucht zuerst WhatsApp und schickt eine SMS, wenn WhatsApp nicht ankommt.
| Status | Bedeutung |
|---|---|
pending | Code ist unterwegs, die Eingabe steht aus. |
approved | Richtiger Code eingegeben. Kostet einen Credit. |
failed | Fünfmal falsch eingegeben. |
expired | Nach zehn Minuten ohne richtigen Code. |
canceled | Von Ihnen abgebrochen. |
undeliverable | Weder WhatsApp noch SMS kamen an. |
Abgerechnet wird nur approved: ein Credit zu 0,10 € netto. Beim Start wird ein Credit reserviert, damit viele gleichzeitige Vorgänge das Guthaben nicht überziehen. Endet die Verifizierung anders, wird die Reservierung frei.
Wiederholen ohne Doppelversand: Schicken Sie beim Start einen Header Idempotency-Key mit, etwa eine UUID. Ein wiederholter Aufruf mit demselben Schlüssel liefert 24 Stunden lang dieselbe Antwort, ohne zweiten Versand.
Limits und Schutz
Telify schützt Sie vor SMS-Pumping, bei dem Bots teure SMS auslösen. Wird ein Limit erreicht, antwortet die API mit 429 rate_limited und dem Header Retry-After.
| Limit | Wert |
|---|---|
| Je Nummer, über alle Apps | 3 pro Stunde, 10 pro Tag |
| Je App | 50 Verifizierungen pro Tag |
Je IP Ihres Nutzers (mit client_ip) | 10 pro Stunde |
| SMS je App | 100 pro Tag |
Das sind die Startwerte für neue Apps. Brauchen Sie mehr, schreiben Sie uns.
Erfolgsquote: Werden in einer Stunde bei mindestens 20 Verifizierungen weniger als die Hälfte bestätigt, pausiert Telify die App (503 app_paused) und informiert Sie per E-Mail. So viele unbestätigte Nummern sind fast immer Missbrauch.
API-Referenz
Die maschinenlesbare Beschreibung für Postman, Insomnia oder Codegeneratoren: openapi.yaml.
POST /verifications
Verifizierung starten. Schickt einen Code an die Nummer. Läuft für diese Nummer schon eine Verifizierung, kommt sie mit Status 200 zurück, und es geht kein zweiter Code raus. Eine neue antwortet mit 201.
| Feld | Bedeutung | |
|---|---|---|
phone | Pflicht | Handynummer, international (+4915123456789) oder national zusammen mit country. |
country | optional | Land für nationale Schreibweise, Standard DE. |
locale | optional | Sprache der Nachricht: de (Standard) oder en. |
channels | optional | Kanäle in der gewünschten Reihenfolge, etwa ["sms"]. Begrenzt auf die Einstellungen der App. |
client_ip | optional | IP-Adresse Ihres Nutzers. Damit greift das Limit je IP. |
GET /verifications/{id}
Verifizierung abrufen. Liefert den aktuellen Stand, zum Beispiel ob die Zeit abgelaufen ist.
POST /verifications/{id}/check
Code prüfen. Prüft den eingegebenen Code. Die Antwort enthält valid. Bei richtigem Code wird die Verifizierung approved, und genau dann kostet sie einen Credit. Nach fünf falschen Versuchen ist sie failed.
| Feld | Bedeutung | |
|---|---|---|
code | Pflicht | Der sechsstellige Code, den Ihr Nutzer eingegeben hat. |
POST /verifications/{id}/resend
Code erneut senden. Schickt denselben Code noch einmal, einmal pro Verifizierung und frühestens nach 60 Sekunden. Davor antwortet die API mit 429 und Retry-After.
| Feld | Bedeutung | |
|---|---|---|
channel | optional | whatsapp oder sms, etwa für „Code per SMS senden“. |
POST /verifications/{id}/cancel
Verifizierung abbrechen. Beendet eine offene Verifizierung, zum Beispiel wenn Ihr Nutzer eine andere Nummer eingeben will. Kostet nichts.
GET /balance
Guthaben abfragen. balance ist das Guthaben, reserved die Credits offener Live-Verifizierungen, available der Rest. Ein Start braucht mindestens einen freien Credit.
Alle Verifizierungen antworten im selben Format:
{
"id": "ver_01JC8ZK4QX6Y3M2N7P5R9T0VWA",
"status": "pending",
"phone": "+4915123456789",
"channel": "whatsapp",
"mode": "test",
"attempts_left": 5,
"expires_at": "2026-11-04T10:10:00Z",
"resend_available_at": "2026-11-04T10:01:00Z",
"approved_at": null,
"created_at": "2026-11-04T10:00:00Z"
}
Fehlercodes
Fehler kommen immer als {"error": {"code": "…", "message": "…"}}. Prüfen Sie den code, die message kann sich ändern.
| HTTP | code | Bedeutung |
|---|---|---|
| 400 | invalid_request | Pflichtfeld fehlt oder hat das falsche Format. |
| 400 | invalid_phone | Keine gültige Handynummer. |
| 401 | invalid_api_key | Schlüssel fehlt, ist falsch oder gesperrt. |
| 402 | insufficient_credits | Kein freies Guthaben. |
| 404 | verification_not_found | Unbekannte ID oder die einer anderen App. |
| 409 | verification_closed | Schon approved, failed, expired, canceled oder undeliverable. |
| 409 | idempotency_conflict | Idempotency-Key für eine andere Anfrage benutzt, oder die erste läuft noch. |
| 422 | country_not_allowed | Das Land ist für die App nicht freigeschaltet. Zum Start nur Deutschland. |
| 429 | rate_limited | Ein Limit ist erreicht. Retry-After nennt die Sekunden bis zum nächsten Versuch. |
| 503 | app_paused | Die App ist wegen einer auffälligen Erfolgsquote pausiert. |