SMS per API senden: Beispiele für Python, Node.js, PHP, cURL
SMS per API senden in Python, Node.js, PHP und cURL: Einzel- und Massenversand, Unicode und Arabisch, Segmentzählung, Zustell-Webhooks und Fehlerbehandlung.
Von OmniChannels.ai Editorial Team · Geprüft von BroadNet Messaging Solutions Team
Integration
Kurze Antwort
Um mit der OmniChannels.ai-API eine SMS zu senden, richten Sie einen authentifizierten POST an https://api.broadnet.me/sms/sendSms mit einem JSON-Body aus senderId, destinationNumber, message und messageType. Verwenden Sie TEXT für GSM-7-Text und UNICODE für Arabisch oder Emojis. Eine 200-Antwort liefert die Nachrichten-ID als Klartext, und der endgültige Zustellstatus kommt später an Ihrem Webhook an.
Auf dieser Seite
- Wie sende ich eine SMS mit der API?
- Wie formatiere ich Rufnummern?
- Wie sende ich Arabisch, Emojis oder anderen Unicode-Text?
- Wie zähle ich Segmente vor dem Senden?
- Wie sende ich an viele Nummern?
- Wie erhalte ich den Zustellstatus?
- Wie behandle ich Fehler und vermeide Duplikate?
- Praxisbeispiel: Login-Codes für eine regionale App
- Welche typischen Fehler gibt es?
- So unterstützt OmniChannels.ai
Das Wichtigste
- POST /sms/sendSms benötigt vier Felder: senderId, destinationNumber, message und messageType; der Antwort-Body ist die Nachrichten-ID als Klartext, kein JSON.
- Setzen Sie messageType für Arabisch, Emojis oder jedes Zeichen außerhalb von GSM-7 auf UNICODE; ein einziges solches Zeichen macht die gesamte Nachricht zu Unicode und verkürzt jedes Segment.
- POST /sms/identify zählt Zeichen und Segmente vor dem Senden, sodass Sie vorhersagen können, wie viele Segmente eine Nachricht belegt.
- Die Zustellung ist asynchron: Ein 200 bedeutet angenommen, und DELIVERED, FAILED oder REJECTED kommt später an Ihrem Webhook an.
- Die API hat keinen Idempotency-Key, daher sollten Sie jeden Versand vor dem Aufruf protokollieren und nach einem Timeout den Status prüfen, statt erneut zu senden.
Dieser Leitfaden richtet sich an Entwickler, die aus einer Anwendung SMS senden müssen und funktionierenden Code in Python, Node.js, PHP oder cURL suchen. Er behandelt einen Einzelversand, Unicode und Arabisch, die Zählung von Segmenten, Massen-Upload, Webhooks für den Zustellstatus und die Fehlerbehandlung und nutzt dabei ausschließlich Endpunkte und Felder aus unserer SMS-API-Referenz und der OpenAPI-Spezifikation.
Wie sende ich eine SMS mit der API?
Richten Sie einen authentifizierten POST an /sms/sendSms mit einem JSON-Body. Die Antwort ist 200 OK mit der Nachrichten-ID als Klartext.
| Element | Wert |
|---|---|
| Basis-URL | https://api.broadnet.me (kein Präfix /v1) |
| Endpunkt | POST /sms/sendSms |
| Authentifizierung | Authorization: Bearer $BROADNET_TOKEN |
| Inhaltstyp | application/json |
| Pflichtfelder | senderId, destinationNumber, message, messageType |
Testzugangsdaten werden nach einer kurzen Zugangsanfrage ausgestellt, und Testsendungen gehen an Ihre eigenen verifizierten Nummern. Eine sofortige Self-Service-Anmeldung gibt es nicht. Siehe den Quickstart.
curl -X POST https://api.broadnet.me/sms/sendSms \
-H "Authorization: Bearer $BROADNET_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"senderId": "OmniDemo",
"destinationNumber": "447700900123",
"message": "Your OmniDemo code is 482913",
"messageType": "TEXT"
}'
// Node.js 18+ (integriertes fetch)
const res = await fetch("https://api.broadnet.me/sms/sendSms", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.BROADNET_TOKEN}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
senderId: "OmniDemo",
destinationNumber: "447700900123",
message: "Your OmniDemo code is 482913",
messageType: "TEXT",
}),
});
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
const messageId = await res.text(); // Nachrichten-ID als Klartext
import os
import requests
r = requests.post(
"https://api.broadnet.me/sms/sendSms",
headers={"Authorization": f"Bearer {os.environ['BROADNET_TOKEN']}"},
json={
"senderId": "OmniDemo",
"destinationNumber": "447700900123",
"message": "Your OmniDemo code is 482913",
"messageType": "TEXT",
},
timeout=15,
)
r.raise_for_status()
message_id = r.text # Nachrichten-ID als Klartext, kein JSON
<?php
$payload = json_encode([
"senderId" => "OmniDemo",
"destinationNumber" => "447700900123",
"message" => "Your OmniDemo code is 482913",
"messageType" => "TEXT",
]);
$ch = curl_init("https://api.broadnet.me/sms/sendSms");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 15,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("BROADNET_TOKEN"),
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => $payload,
]);
$messageId = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
curl_close($ch);
echo $status . " " . $messageId . PHP_EOL;
Ein erfolgreicher Antwort-Body sieht so aus:
2603121407537573731
Speichern Sie diese ID zusammen mit Ihrem eigenen Datensatz, etwa einer Bestellung oder einem Anmeldeversuch. Damit ordnen Sie später Zustellstatus zu.
Wie formatiere ich Rufnummern?
Verwenden Sie Ländervorwahl plus nationale Nummer, nur Ziffern. Das Format folgt dem internationalen Nummernplan nach ITU-T E.164, ohne das Pluszeichen.
| Eingabe | Gültig? | Grund |
|---|---|---|
447700900123 |
Ja | Ländervorwahl 44 plus nationale Nummer |
+44 7700 900123 |
Nein | Pluszeichen und Leerzeichen entfernen |
07700900123 |
Nein | Führende 0 durch die Ländervorwahl ersetzen |
Speichern Sie Nummern in Ihrer Datenbank im E.164-Format (+447700900123) und entfernen Sie beim Erstellen der Anfrage das +. Unser kostenloser Rufnummern-Formatierer hilft bei einer schnellen Prüfung.
Wie sende ich Arabisch, Emojis oder anderen Unicode-Text?
Setzen Sie messageType auf UNICODE. Jedes Zeichen außerhalb des GSM-7-Alphabets, etwa ein arabischer Buchstabe, ein Emoji, ein typografisches Anführungszeichen oder ein Geviertstrich, schaltet die gesamte Nachricht auf Unicode um.
r = requests.post(
"https://api.broadnet.me/sms/sendSms",
headers={"Authorization": f"Bearer {os.environ['BROADNET_TOKEN']}"},
json={
"senderId": "OmniDemo",
"destinationNumber": "971500000000",
"message": "رمز التحقق الخاص بك هو 482913",
"messageType": "UNICODE",
"campaignName": "login-otp",
},
timeout=15,
)
Verwenden Sie in PHP beim Aufruf von json_encode die Option JSON_UNESCAPED_UNICODE. Die Kodierung bestimmt die Segmentgröße, wie für SMS in 3GPP TS 23.040 definiert:
messageType |
Einzelne SMS | Pro Segment bei Aufteilung | Verwendung für |
|---|---|---|---|
TEXT |
160 Zeichen | 153 Zeichen | Text, der nur das GSM-7-Alphabet nutzt |
UNICODE |
70 Zeichen | 67 Zeichen | Arabisch, Kyrillisch, Chinesisch, Emojis |
Die meisten Netzbetreiber rechnen pro Segment ab, daher kostet eine lange arabische Nachricht mehr als dieselbe Länge in lateinischer Schrift. Lesen Sie unseren Leitfaden zu Unicode- und arabischen SMS und probieren Sie den SMS-Zeichenzähler aus.
Wie zähle ich Segmente vor dem Senden?
Rufen Sie POST /sms/identify mit der Nachricht auf. Der Aufruf liefert die erkannte Kodierung, die Zeichenzahl, die Segmentzahl und das Limit pro Segment.
curl -X POST https://api.broadnet.me/sms/identify \
-H "Authorization: Bearer $BROADNET_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "message": "Your OmniDemo code is 482913" }'
{
"message": "Your OmniDemo code is 482913",
"messageType": "TEXT",
"smscount": 1,
"charCount": 28,
"charLimit": 160
}
Sie können smsParts (aus smscount), charCount und charLimit in eine Sendeanfrage übernehmen. GSM-7-Text kann in der Antwort als GSM-7 bezeichnet sein; senden Sie ihn als TEXT.
Wie sende ich an viele Nummern?
Nutzen Sie POST /sms/sendbulk, eine multipart/form-data-Anfrage mit einer Empfängerdatei und einem JSON-String mit Einstellungen.
curl -X POST https://api.broadnet.me/sms/sendbulk \
-H "Authorization: Bearer $BROADNET_TOKEN" \
-F destinationNumberFile=@recipients.csv \
-F 'bulkRequest={"senderId":"OmniDemo","message":"Your statement is ready in the app.","messageType":"TEXT","campaignName":"oct-statements","allowDuplicate":false}'
import json
import os
import requests
bulk_request = {
"senderId": "OmniDemo",
"message": "Your statement is ready in the app.",
"messageType": "TEXT",
"campaignName": "oct-statements",
"allowDuplicate": False,
}
with open("recipients.csv", "rb") as f:
r = requests.post(
"https://api.broadnet.me/sms/sendbulk",
headers={"Authorization": f"Bearer {os.environ['BROADNET_TOKEN']}"},
files={"destinationNumberFile": ("recipients.csv", f, "text/csv")},
data={"bulkRequest": json.dumps(bulk_request)},
timeout=60,
)
print(r.json())
Die Antwort enthält bulkSessionId und ein Objekt bulkListInfo mit total, validCount, invalidCount und duplicate. Speichern Sie bulkSessionId bei der Kampagne. Aufträge können mit den Endpunkten der Referenz aufgelistet, pausiert, fortgesetzt und abgebrochen werden. Vor einem großen Versand können Sie Nummern außerdem mit POST /sms/lookup prüfen; siehe unseren HLR-Lookup-Leitfaden.
Wie erhalte ich den Zustellstatus?
Zustellstatus werden an die in Ihrem Account konfigurierte Webhook-URL gesendet. Eine Nachricht durchläuft SUBMITTED und SENT bis DELIVERED oder endet als FAILED oder REJECTED. Sie nennen unserem Team die öffentliche HTTPS-URL, und Reseller können einen Webhook pro Unterkonto haben.
Die Payload-Felder unterscheiden sich je Kanal, und die API-Spezifikation definiert kein einheitliches Webhook-Schema. Protokollieren Sie daher zuerst den Roh-Body und ordnen Sie Felder anhand eines echten Ereignisses Ihres Accounts zu. Ein minimaler Empfänger speichert das Ereignis und bestätigt schnell:
import express from "express";
const app = express();
app.post("/webhooks/omnichannels", express.json(), async (req, res) => {
await saveStatusEvent(req.body); // Ihr Speicher; asynchron verarbeiten
res.sendStatus(200); // schnell bestätigen
});
app.listen(3000);
Machen Sie die Verarbeitung idempotent, denn derselbe Status kann zweimal eintreffen, und lassen Sie ein verspätetes SENT nie ein gespeichertes DELIVERED überschreiben. War Ihr Endpunkt nicht erreichbar, sendet POST /sms/resendDlr die Berichte für einen Datumsbereich erneut:
curl -X POST https://api.broadnet.me/sms/resendDlr \
-H "Authorization: Bearer $BROADNET_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"startDate": "2026-10-09",
"endDate": "2026-10-10",
"senderId": "OmniDemo",
"messageStatus": "DELIVERED"
}'
Mehr dazu im Webhooks-Leitfaden und in der Erklärung der Nachrichten-Zustellstatus.
Wie behandle ich Fehler und vermeide Duplikate?
Behandeln Sie zuerst den HTTP-Status, dann den Fehler-Body. Wiederholen Sie nur bei Netzwerkfehlern, 429 und 5xx.
| Code | Bedeutung | Maßnahme |
|---|---|---|
200 |
Angenommen | ID speichern |
400 |
Validierungsfehler oder fehlendes Feld | Anfrage korrigieren |
401 / 403 |
Falsches Token oder Operation nicht erlaubt | Beheben; nicht wiederholen |
429 |
Ratenlimit überschritten | Auf Retry-After warten |
500, 503, 504 |
Server- oder Upstream-Problem | Mit Backoff und Jitter wiederholen |
Von der API ausgelöste Fehler nutzen einen JSON-Body mit fünf Feldern: status, error, message, errorCode und requestUri. Das dokumentierte Standardlimit der REST-API liegt bei dauerhaft 200 Anfragen pro Sekunde; die Limits Ihres Accounts werden mit Ihren Zugangsdaten bestätigt.
Die API akzeptiert keinen Idempotency-Key. Eine Anfrage kann gelingen, während ihre Antwort verloren geht, und eine blinde Wiederholung sendet dann doppelt. Schreiben Sie vor dem Aufruf eine ausstehende Zeile mit Ihrer eigenen Vorgangs-ID, speichern Sie die zurückgegebene Nachrichten-ID und prüfen Sie nach einem Timeout, ob ein Webhook-Status vorliegt, bevor Sie erneut senden. Setzen Sie bei Massenversand allowDuplicate auf false. Details stehen unter Fehler und Limits.
Praxisbeispiel: Login-Codes für eine regionale App
„Souq Rafiq“ (fiktiv), ein Händler in den VAE, sendet Login-Codes per SMS.
- Der Auth-Dienst erzeugt einen sechsstelligen Code, speichert einen Hash mit fünf Minuten Gültigkeit und schreibt eine
pending-Sendezeile. - Er ruft
/sms/sendSmsmitmessageType=UNICODEfür arabische Nutzer undTEXTfür englische Nutzer auf. - Bei
200speichert er die Nachrichten-ID. - Der Webhook-Handler markiert die Zeile als
DELIVERED,FAILEDoderREJECTED. - Ist der Status nach kurzer Wartezeit nicht
DELIVERED, bietet die App ein erneutes Senden und, falls konfiguriert, einen anderen Kanal an. Siehe Kanal-Fallback. - Ratenlimits für Code-Anfragen je Nummer und je IP schützen vor Missbrauch; siehe Prävention von SMS-Pumping.
Welche typischen Fehler gibt es?
r.json()auf die Sendeantwort aufrufen. Sie ist Klartext.- Falsche Feldnamen. Verwenden Sie
senderId,destinationNumberundmessage; Felder wieto,fromodertextgehören nicht zu diesem Endpunkt. - Pluszeichen und führende Nullen in Nummern.
UNICODEvergessen bei Arabisch, was den Text verstümmelt.- Nicht registrierte Sender IDs. Manche Länder blockieren oder ersetzen sie; prüfen Sie die Sender-ID-Regeln für Ihr Zielland und bitten Sie uns, die Registrierung zu übernehmen.
200als zugestellt werten.- Token in einer mobilen App oder im Browser, wo jeder es auslesen kann.
- Grenzen: Dieser Leitfaden zeigt die gängige Anfrage. Optionale Felder wie Planungsformate sollten Sie mit unserem Team bestätigen.
So unterstützt OmniChannels.ai
OmniChannels.ai sendet A2P-SMS über die direkte Netzanbindung von BroadNet, mit Zwei-Wege-SMS, Sender IDs, Unicode und Arabisch, HLR-Lookup und SMPP 3.4 für hohe Volumen. Die REST-API unter https://api.broadnet.me nutzt ein Bearer-Token und deckt auch WhatsApp, RCS und weitere Kanäle ab, wobei Zustellstatus in einem einheitlichen Webhook-Format normalisiert werden. Unser Team bereitet Sender-ID-Registrierungen gemeinsam mit Ihnen vor. Siehe die SMS-API-Referenz oder den SMS-Kanal.
Häufige Fragen
Wie sende ich eine SMS mit Python?
Verwenden Sie die requests-Bibliothek, um JSON per POST an https://api.broadnet.me/sms/sendSms zu senden, mit einem Authorization: Bearer-Header und den Feldern senderId, destinationNumber, message und messageType. Lesen Sie das Token aus einer Umgebungsvariable. Der Body einer 200-Antwort ist die Nachrichten-ID als Klartext, nutzen Sie daher r.text statt r.json().
Welches Rufnummernformat erwartet die SMS-API?
Ländervorwahl plus nationale Nummer, nur Ziffern, ohne Pluszeichen, ohne Präfix 00, ohne Leerzeichen und ohne führende Null. Zum Beispiel ist 447700900123 gültig, +44 7700 900123 und 07700900123 dagegen nicht. Speichern Sie Nummern in Ihrer eigenen Datenbank im E.164-Format und entfernen Sie beim Erstellen der Anfrage das Pluszeichen.
Wie sende ich arabische SMS über die API?
Setzen Sie messageType auf UNICODE und senden Sie den arabischen Text im Feld message als UTF-8. Unicode-Nachrichten fassen 70 Zeichen in einem einzelnen Segment und 67 pro Segment bei Aufteilung, gegenüber 160 und 153 bei GSM-7. Testen Sie auf echten Geräten und rufen Sie zuerst /sms/identify auf, um die Segmentzahl zu sehen.
Wie erhalte ich Zustellberichte?
Status werden an die in Ihrem Account konfigurierte Webhook-URL gesendet. Nachrichten durchlaufen SUBMITTED und SENT bis DELIVERED, FAILED oder REJECTED. Ihr Endpunkt sollte das Roh-Ereignis speichern, schnell mit 2xx antworten und asynchron verarbeiten. Wurden Ereignisse verpasst, kann POST /sms/resendDlr Zustellberichte für einen Datumsbereich erneut senden.
Wie sende ich SMS an viele Nummern auf einmal?
Nutzen Sie POST /sms/sendbulk, eine Multipart-Anfrage mit einer destinationNumberFile (CSV oder TXT) und einem bulkRequest-JSON-String mit senderId, message und messageType. Die Antwort meldet, wie viele Nummern gültig, ungültig oder doppelt waren, und liefert eine bulkSessionId, die Sie mit Ihrer Kampagne speichern können.
Muss ich eine Sender ID registrieren?
In vielen Ländern ja. Manche verlangen eine freigegebene alphanumerische Sender ID, andere Kennungen von Regulierungsbehörde oder Template, die die API in optionalen Feldern wie peId und templateId akzeptiert. Die Anforderungen sind länderspezifisch, prüfen Sie daher die Sender-ID-Seite für Ihr Zielland; unser Team kann die Registrierung gemeinsam mit Ihnen übernehmen.
Quellen
Weiterlesen
Weitere LeitfädenIntegration
WhatsApp-Nachricht per API senden: cURL, Node, Python, PHP
WhatsApp-Nachrichten per API senden: Beispiele in cURL, Node.js, Python und PHP für Vorlagen und Session-Nachrichten, plus Statusverfolgung und Fehler.
10 Min. Lesezeit
Integration
Messaging-API auswählen: die Checkliste für CTOs
So wählen Sie eine Messaging-API aus: CTO-Checkliste zu Kanälen, Routenqualität, Webhooks, Sicherheit, Rate Limits, Retries, SMPP, MCP, Compliance und Preisen.
13 Min. Lesezeit
SMS und OTP
Bulk-SMS-Anbieter wählen: Die 12-Punkte-Checkliste
Bulk-SMS-Anbieter auswählen: 12 Prüfpunkte zu Routen, Zustellberichten, Absenderkennungen, Preismodellen, Support und Compliance plus Testplan vor Vertragsabschluss.
10 Min. Lesezeit
