Interaktive Dokumentation · Entwicklerportal · OpenAPI-Spezifikation · EN · FR · DE · IT · PT · ES

Mailpro™ SMS API : Referenz

Basis-URL : https://api.mailpro.com/sms

Die Mailpro™ SMS-API ermöglicht Ihnen die programmatische Verwaltung von Telefonkontaktlisten, Rufnummern sowie den Versand von Massen- oder einzelnen SMS-Nachrichten.

Authentifizierung

Jeder Endpunkt akzeptiert drei Authentifizierungsmethoden. Wählen Sie diejenige, die zu Ihrem Technologie-Stack passt.

> Legacy-Bearer-JWT sowie id_client+api_key funktionieren unverändert weiter und unterliegen > keiner Scope-Einschränkung. Lediglich OAuth-2.0-Access-Token sind den > endpunktspezifischen Scope-Prüfungen unterworfen, die bei jeder Operation unten aufgeführt sind.

Methode 1 — OAuth 2.0 (empfohlen für Integrationen)

Mailpro betreibt einen einzigen OAuth-2.0-Autorisierungsserver für sämtliche APIs unter einer einheitlichen, versionsneutralen Adresse: https://api.mailpro.com/oauth/. Es gibt keinen versionsspezifischen OAuth-Endpunkt — Sie erhalten ein Token über /oauth/token, und dasselbe Token funktioniert auf dieser SMS-API, auf der CRM v3 und auf der Email v2. Welche Endpunkte es ansprechen darf, wird durch die Scopes des Tokens bestimmt, nicht durch die API-Basis-URL. Aussteller (iss-Claim): https://api.mailpro.com/oauth/.

EndpunktURL
AuthorizeGET https://api.mailpro.com/oauth/authorize
Token / RefreshPOST https://api.mailpro.com/oauth/token
JWKSGET https://api.mailpro.com/oauth/.well-known/jwks
DiscoveryGET https://api.mailpro.com/oauth/.well-known/openid-configuration

Grant-Typen: authorization_code + PKCE (S256, verpflichtend), client_credentials, refresh_token (Rotation). Lebensdauer des Access-Tokens 20 Min.; Refresh-Token 30 Tage (gleitend, Einmalverwendung); Authorization Code 60 Sek..

Schnellstart — Token abrufen und diese API aufrufen (Platzhalter ersetzen; ein echtes Secret niemals committen):

curl -X POST https://api.mailpro.com/oauth/token \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "grant_type=client_credentials" \
  -d "client_id=YOUR_CLIENT_ID" \
  -d "client_secret=YOUR_CLIENT_SECRET" \
  -d "scope=sms:send sms:read"

Rufen Sie diese API anschließend mit Authorization: Bearer ACCESS_TOKEN auf. Dasselbe Token funktioniert auf den APIs CRM v3 und Email v2. Ein Token, dem der für einen Endpunkt erforderliche Scope fehlt, erhält 403 insufficient_scope. Die vollständige Flow-Beschreibung und der Scope-Katalog sind in den CRM v3-API-Dokumenten unter "Authentifizierung" zu finden. Für die SMS-API relevante Scopes: sms:send, sms:read, sms:contacts:read, sms:contacts:write, account:read.

Methode 2 — Bearer JWT (Legacy)

Authorization: Bearer <access_token>

Token über POST /token abrufen (formularkodiert, OAuth2 Password Grant):

POST https://api.mailpro.com/sms/token
Content-Type: application/x-www-form-urlencoded

grant_type=password&username=YOUR_USERNAME&password=YOUR_API_KEY

Dasselbe Token ist auch auf der CRM-API v3 sowie auf der Email v2 API gültig — einmalige Authentifizierung, beliebiger API-Aufruf. Token sind standardmäßig 30 Tage gültig; verwenden Sie grant_type=refresh_token, um sie ohne erneute Authentifizierung zu verlängern. Ohne Scopes — für installierbare Integrationen wird OAuth 2.0 bevorzugt.

Methode 3 — id_client + api_key

Zwei Anmeldedaten:

ParameterTypBeschreibung
id_clientintegerIhre numerische Mailpro-Kunden-ID, zu finden unter Einstellungen → API-Zugang
api_keystringIhr API-Schlüssel (GUID-Format), zu finden unter Einstellungen → API-Zugang

Übermitteln Sie diese an einer der folgenden Stellen — wählen Sie eine:

Werden Anmeldedaten an mehr als einer Stelle übermittelt, gewinnt der Header.

OAuth-Scope-Durchsetzung pro Endpunkt (SMS)

Für OAuth-ausgestellte Token erfordert jede Endpunktgruppe einen Scope (Legacy-Authentifizierung ist davon ausgenommen). Jede Operation listet ihren Scope unter Authorization auf. Übersicht:

EndpunkteErforderlicher Scope
/send/* (Massenversand, Einzelversand, Planung)sms:send
/history/list, /credit/getsms:read
/phone/list, /list/listsms:contacts:read
/phone/{add,edit,del}, /list/{edit,del}, /import/uploadsms:contacts:write
/account/limitsaccount:read

> POST /list/add (Anlegen einer Liste) ist derzeit mit jedem gültigen Token erreichbar — > der Endpunkt wird noch nicht durch Scopes geschützt. Eine Scope-Ablehnung auf den geschützten > Endpunkten gibt 403 zurück mit > { "error": "insufficient_scope", "required_scope": "…" }.

Antwortformat

Alle Endpunkte unterstützen json (Standard) und xml. Geben Sie das Format in der URL an:

Feldnamen in Antworten sind PascalCase (TotalCredits, FirstName, …), während Anfrageparameter snake_case sind (id_client, address_book_id, …). Listen-Endpunkte verpacken ihre Zeilen in einem Items-Array.

Paginierung

Gleiche Regel für die drei Mailpro-APIs (Email v2, CRM v3, SMS): 5.000 Einträge pro Seite, standardmäßig und maximal.

Unbekannte Parameter werden ignoriert, nie abgelehnt. Enthält eine Anfrage einen Parameter, den die API nicht kennt, enthält die Antwort X-Ignored-Parameters (die Namen) und X-Documentation (einen Link zu dieser Seite), damit ein Tippfehler nicht unbemerkt bleibt.

SMS-Guthabenkosten

Eine SMS kostet Länder-Guthaben × Anzahl der Teile.

Länder-Guthaben — jedes Zielland hat einen Preis von 1, 2 oder 3 Guthaben, basierend auf der internationalen Vorwahl der Nummer. Der Versand an eine Nummer, deren Vorwahl wir nicht bepreisen, wird mit 400 abgelehnt.

Anzahl der Teile — eine Nachricht, die länger als eine SMS ist, wird vom Betreiber aufgeteilt und jeder Teil wird berechnet. Das Limit hängt von den verwendeten Zeichen ab:

AlphabetEinzelne NachrichtPro Teil bei Aufteilung
GSM-7 (Standard-Latein)160 Zeichen153 Zeichen
Unicode (Akzente außerhalb GSM-7, Kyrillisch, Emoji, …)70 Zeichen67 Zeichen

Ein einziges Zeichen außerhalb von GSM-7 stellt die gesamte Nachricht auf Unicode um; so kann ein Emoji eine 160-Zeichen-Nachricht von 1 auf 3 Teile bringen. Die Zeichen ^ { } [ ] ~ | \ und € zählen jeweils als zwei, obwohl sie GSM-7 sind.

*Beispiel:* eine 300-Zeichen-Nachricht in Standard-Latein = 2 Teile; an ein Land mit 2 Guthaben gesendet, kostet sie 2 × 2 = 4 Guthaben pro Empfänger.

Rufnummernformat

Rufnummern werden automatisch normalisiert. Sie können sie in vielen Formaten übermitteln — Leerzeichen, Bindestriche, Punkte, Schrägstriche, Klammern, Unterstriche und geschützte Leerzeichen werden vor der Validierung entfernt. Jedes andere Zeichen (Buchstaben, Apostrophe, =, ; usw.) macht die Nummer ungültig.

GültigUngültig
+41794849980 — E.164 international0612345678 — nationales Format (führende 0)
0041 79 484 99 80 — 00-Präfix + Leerzeichen41'794'849'80 — Apostrophe (werden nicht entfernt)
+33 6-12-34-56-78 — + mit Bindestrichentel=0041794849980 — überflüssige Zeichen
41794849980 — reine Ziffern1234567 — zu kurz (< 8 Ziffern)

Regeln:

Fehlercodes

HTTPCodeBedeutung
400103Fehlerhafte Eingabe — fehlender oder ungültiger erforderlicher Parameter
202202Unzureichende SMS-Guthaben
401Ungültige(r) id_client / api_key
500500Interner Fehler

Webhooks

Mailpro™ kann Ihren Server in Echtzeit benachrichtigen, sobald SMS-Ereignisse auf Ihrem Konto eintreten (eine SMS wurde zugestellt, eine SMS ist fehlgeschlagen, Ihr Guthaben ist niedrig usw.). Im Stripe-Stil — Ihre URL erhält einen mit HMAC-SHA256 signierten POST, sobald das Ereignis ausgelöst wird.

Jedes an Ihren Webhook gesendete Ereignis zählt als 1 Anfrage in Ihrem Kontingent an API-Anfragen.

Funktionsweise

> ⏱ Aktivierungsverzögerung — nach dem Erstellen, Aktualisieren oder Löschen eines Webhooks > dauert die Verbreitung der Änderung über die Mailpro-API-Server bis zu 10 Minuten. Während > dieses Zeitfensters stimmen Ereignisse unter Umständen noch nicht mit Ihrem neuen Abonnement > überein (oder treffen weiterhin auf ein gerade entferntes zu). Diese Zeit wird benötigt, um den > In-Memory-Cache der Abonnements auf jeder API-Instanz zu aktualisieren.

Payload-Hülle

Alle Ereignisse teilen sich eine gemeinsame Hülle:

{
  "id":         "evt_8f3a9b2c4d1e5f6789abcdef01234567",
  "type":       "sms.queued",
  "created":    1748194800,
  "apiVersion": "sms",
  "account":    { "id": 12345, "name": "ACME Corp" },
  "data":       {
    "messageId":   12345,
    "to":          "41791234567",
    "queuedAt":    "2026-05-27T14:32:12.0123456Z",
    "scheduledAt": "2026-05-27T14:32:12.0123456Z",
    "parts":       1
  }
}
FeldFormatBeschreibung
idevt_ + 32 HexzeichenEindeutige Ereignis-ID — nutzen Sie sie als Idempotenzschlüssel auf Ihrer Seite.
type<domain>.<verb>Kanonischer Ereignistyp.
createdUnix-Sekunden UTCIn die HMAC-Signatur einbezogen.
apiVersion"sms" für Ereignisse, die von POST /sms/send/add_single ausgelöst werden; "v3" für Ereignisse, die von POST /v3/Sms/SingleSMS ausgelöst werden; "watcher" für DLR-basierte Ereignisse, die vom Worker ausgelöst werden.Welche Mailpro-Komponente das Ereignis veröffentlicht hat.
account.idintIhre Mailpro-Kunden-ID (= id_client).
account.namestringIhr Kontoname (praktisch fürs clientseitige Debugging).
dataobjectEreignis-Payload — die Struktur hängt von type ab (siehe Katalog unten).

Ereigniskatalog

Es werden ausschließlich die unten aufgeführten Ereignisse tatsächlich ausgelöst. Die Strukturen entsprechen exakt dem JSON, das die Plattform sendet — verwenden Sie diese Feldnamen beim Parsen genau so.

EreignisAuslöserdata-Struktur
pingTest über POST /webhooks/{id}/test{ message }
sms.queuedPOST /sms/send/add_single oder POST /v3/Sms/SingleSMS in die Mailpro-Sendewarteschlange aufgenommen{ messageId: int, to: string, queuedAt: ISO-8601, scheduledAt: ISO-8601, parts: int }
sms.deliveredDLR mit Carrier-Code 004 oder 008 (Erfolgscodes){ messageId: int, phone: string, stateCode: string, dlrDate: datetime }
sms.failedDLR mit jedem anderen Carrier-Code (Timeout, nicht zugestellt, abgelehnt, gesperrt, …){ messageId: int, phone: string, stateCode: string, dlrDate: datetime }
credits.sms.lowSMS-Guthaben ist unter Ihre Warnschwelle gefallen (Worker CreditsLowWatcher){ remaining: int, threshold: int, alertedAt: ISO-8601 }

> Hinweis — es gibt kein sms.sent-Ereignis. Der Carrier-DLR ist die einzige Rückmeldung, die > die Plattform zwischen "queued" und "delivered/failed" erhält, sodass das nächste Ereignis nach > sms.queued entweder sms.delivered (Erfolg) oder sms.failed (Fehler) ist. Die meisten > Nachrichten erreichen den Carrier innerhalb von Sekunden und einen DLR innerhalb von Minuten; > die Bedingungen des Mobilfunknetzes können dies gelegentlich auf Stunden ausdehnen.

> Feldbenennung — sms.queued verwendet to (das Ziel, wie es vom API-Aufrufer übermittelt > wurde, nach Normalisierung). sms.delivered / sms.failed verwenden phone (das Ziel, wie es > vom Carrier im DLR zurückgegeben wird). In der Praxis sind die Ziffern identisch, die Namen > unterscheiden sich jedoch, da die Ereignisse aus unterschiedlichen Code-Pfaden stammen.

Abonnieren Sie alle Ereignisse dieser API, indem Sie ["*"] im events-Array übergeben.

HMAC-Signatur

Jeder POST trägt einen X-Mailpro-Signature-Header:

X-Mailpro-Signature: t=1748194800,v1=7f9ac2b6e4d1c8a3...
X-Mailpro-Event-Id:  evt_8f3a9b2c4d1e5f6789abcdef01234567
X-Mailpro-Event-Type: sms.delivered
X-Mailpro-Attempt:   1

So verifizieren Sie:

Node.js
const crypto = require('crypto');

function verifyMailproSignature(rawBody, header, secret) {
  const parts = Object.fromEntries(header.split(',').map(p => p.split('=')));
  if (Math.abs(Date.now() / 1000 - parseInt(parts.t)) > 300) return false;
  const expected = crypto
    .createHmac('sha256', secret)
    .update(parts.t + '.' + rawBody)
    .digest('hex');
  return crypto.timingSafeEqual(
    Buffer.from(parts.v1, 'hex'),
    Buffer.from(expected, 'hex'));
}
PHP
function verifyMailproSignature(string $rawBody, string $header, string $secret): bool {
    parse_str(str_replace(',', '&', $header), $p);
    if (abs(time() - (int)$p['t']) > 300) return false;
    $expected = hash_hmac('sha256', $p['t'] . '.' . $rawBody, $secret);
    return hash_equals($expected, $p['v1']);
}
Python
import hmac, hashlib, time

def verify_mailpro_signature(raw_body: bytes, header: str, secret: str) -> bool:
    parts = dict(p.split('=') for p in header.split(','))
    t = int(parts['t'])
    if abs(time.time() - t) > 300:
        return False
    expected = hmac.new(
        secret.encode(),
        f"{t}.".encode() + raw_body,
        hashlib.sha256
    ).hexdigest()
    return hmac.compare_digest(expected, parts['v1'])
C#
using System.Security.Cryptography;
using System.Text;

static bool VerifyMailproSignature(string rawBody, string header, string secret) {
    var parts = header.Split(',')
        .Select(p => p.Split('='))
        .ToDictionary(a => a[0], a => a[1]);
    var t = long.Parse(parts["t"]);
    if (Math.Abs(DateTimeOffset.UtcNow.ToUnixTimeSeconds() - t) > 300) return false;
    using var hmac = new HMACSHA256(Encoding.UTF8.GetBytes(secret));
    var hash = hmac.ComputeHash(Encoding.UTF8.GetBytes($"{t}.{rawBody}"));
    var expected = Convert.ToHexString(hash).ToLowerInvariant();
    return CryptographicOperations.FixedTimeEquals(
        Encoding.UTF8.GetBytes(expected),
        Encoding.UTF8.GetBytes(parts["v1"]));
}

Wiederholungsversuche und automatische Deaktivierung

VersuchWartezeit vor dem nächsten Versuch
1 → 210 Sekunden
2 → 31 Minute
3 → 45 Minuten
4 → 530 Minuten
5 → 62 Stunden
6 → 76 Stunden
7abgebrochen (Zustellung als failed markiert)

Nach 10 aufeinanderfolgenden Fehlversuchen auf demselben Webhook wird dieser automatisch deaktiviert (isActive: false) und Sie erhalten eine Benachrichtigungs-E-Mail. Reaktivieren Sie ihn mit PUT /webhooks/{id}, sobald Ihr Endpunkt korrigiert ist.

Erfolg = HTTP 2xx

Wir werten Ihren Webhook nur dann als erfolgreich, wenn Sie einen Statuscode im Bereich 200–299 zurückgeben. Jeder 3xx-/4xx-/5xx-Code oder ein Timeout (> 10 Sek.) zählt als Fehlschlag und löst Wiederholungsversuche aus. Wenn Ihr Endpunkt dauerhaft nicht erreichbar ist, geben Sie explizit 410 Gone zurück — Wiederholungsversuche finden dennoch statt, der Fehlergrund wird in Ihrem Zustellprotokoll jedoch deutlicher.

Limits

LimitWert
Webhooks pro Konto20
Abonnierte Ereignisse pro Webhook50
Maximale Payload-Größe256 KB
HTTP-Timeout pro Versuch10 Sekunden
Aufbewahrung des Zustellverlaufs30 Tage

Inhalt

Authentication

Beziehen Sie einen Bearer-JWT-Token zur Authentifizierung aller anderen API-Aufrufe. Der SMS- /token-Endpoint ist eine 307-Weiterleitung zum kanonischen /v3/token-Issuer — Ihr HTTP-Client folgt der Weiterleitung transparent (POST-Methode und Body werden beibehalten).

POST /token

Access-Token abrufen (307-Weiterleitung an /v3/token)

Bezieht einen Bearer-JWT-Token mit Mailpro-Client-Anmeldedaten. Übergeben Sie den zurückgegebenen access_token als Authorization: Bearer <token> in allen nachfolgenden Anfragen. Derselbe Token ist auch für die CRM API v3 und die Email v2 API gültig.

> ⚙ Implementierungsdetail — POST /sms/token ist eine 307 Temporary > Redirect an POST /v3/token (konfiguriert in der IIS-web.config- > Rewrite-Schicht). HTTP 307 bewahrt sowohl die Methode (POST) als > auch den Anfrage-Body, sodass jeder standardkonforme HTTP-Client > der Weiterleitung transparent folgt — Sie senden weiterhin Anfragen an > /sms/token und erhalten ein gültiges JWT zurück. Es gibt keine duplizierte > Token-Ausstellungslogik; die SMS API stellt selbst nie Tokens aus.

Unterstützte Grant-Typen
Grant-TypAnwendungsfall
passwordStandardintegration — Benutzername + API-Schlüssel
refresh_tokenErneuerung eines ablaufenden Access-Tokens ohne erneute Authentifizierung
client_credentialsServer-zu-Server nur mit Client-ID
Token-Lebensdauer

Verwenden Sie grant_type=refresh_token, um den Access-Token ohne erneute Authentifizierung zu erneuern. Speichern Sie Tokens serverseitig (Vault, Umgebungsvariablen); betten Sie sie niemals in Browser-JS oder mobile App-Binärdateien ein. Vollständige Sicherheitshinweise finden Sie in der CRM API v3 /token-Dokumentation.

Anfragetext (application/x-www-form-urlencoded)

NameTypErforderlichBeschreibung
grant_typestring: password, refresh_token, client_credentialsja
usernamestringIhr Mailpro-Benutzername (E-Mail). Erforderlich für password-Grant.
passwordstringIhr Mailpro-API-Schlüssel (GUID-Format). Erforderlich für password-Grant.
refresh_tokenstringVorheriger Refresh-Token. Erforderlich für refresh_token-Grant.
client_idstringIhre Mailpro-Client-ID (Ganzzahl). Erforderlich für client_credentials-Grant.

Antworten

CodeBeschreibung
200Token erfolgreich ausgestellt. Wird von POST /v3/token nach dem transparenten 307-Follow zurückgegeben — Ihr HTTP-Client sieht einen normalen 200 mit derselben Body-Struktur, die er direkt vom v3-Token-Endpoint erhalten würde.
307Temporary Redirect an POST /v3/token, ausgegeben durch die IIS-Rewrite- Regel in web.config. Standardkonforme HTTP-Clients folgen dieser automatisch und bewahren die ursprüngliche POST-Methode und den Form-Body. Nur für Clients sichtbar, die das Folgen von Weiterleitungen explizit deaktivieren (z. B. curl --max-redirs 0).
400Ungültige Anmeldedaten oder nicht unterstützter Grant-Typ

Beispiel 200

{
  "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "token_type": "bearer",
  "expires_in": 31535999,
  "userName": "12345",
  "refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "application": null
}

Beispiel 400

{
  "error": "invalid_grant",
  "error_description": "The username or password is incorrect."
}

Account

Überprüfen Sie Ihr SMS-Credit-Guthaben, Ihr monatliches API-Kontingent und den Kontostatus.

GET /account/limits.{format}

Monatliches API-Kontingent abrufen

Gibt das monatliche API-Anfragekontingent für den authentifizierten Client zurück.

Kontingentberechnung: Das Limit wird aus den E-Mail- Abonnement-Credits kalibriert (typischerweise subscription_credits × 5). Für einen 10.000-E-Mails/Monat-Plan ergibt dies ein monatliches Budget von 50.000 Anfragen. Zurückgesetzt am Jahrestag des Abonnements (nicht am

Was Credits verbraucht:

Was KOSTENLOS ist (verbraucht keine Credits):

Das Kontingent wird über alle 3 Mailpro-APIs hinweg geteilt (v2, v3, sms) — ein Client = ein monatliches Budget für die gesamte Plattform. SMS- Versand verbraucht zusätzlich das dedizierte SMS-Credit-Guthaben (GET /credit/get.{format}).

OAuth-Scope : account:read

Parameter

NameOrtTypErforderlichBeschreibung
formatpathstring: json, xmljaAntwortformat

Antworten

CodeBeschreibung
200Kontingent-Snapshot
401Ungültige Anmeldedaten
404Kein Kontingentdatensatz gefunden (neu erstelltes Konto; die Zeile wird bei der ersten authentifizierten Anfrage angelegt).

Beispiel 200

{
  "monthlyLimit": 50000,
  "remaining": 32847,
  "used": 17153,
  "isFree": false,
  "remainedSendsForFree": null
}

Send SMS

Versenden Sie SMS-Nachrichten — entweder eine einzelne transaktionale SMS an einen Empfänger oder eine Massenkampagne an eine ganze Kontaktliste.

POST /send/add.{format}

Massen-SMS an eine Kontaktliste senden

Sendet eine SMS-Nachricht an alle Telefonnummern in einer Kontaktliste. Unterstützt Terminierung: Setzen Sie scheduled_time auf ein zukünftiges Datum, um später zu senden, oder lassen Sie es weg, um sofort zu senden.

Credit-Verbrauch: Credits werden zum Versandzeitpunkt abgezogen. Lange Nachrichten (>160 GSM-7-Zeichen) werden in mehrere Teile aufgeteilt, von denen jeder zusätzliche Credits kostet.

Die Antwort gibt { "Error": "Insufficient Credit", "Code": 202 } zurück, wenn das Konto über unzureichende Credits verfügt.

OAuth-Scope : sms:send

Parameter

NameOrtTypErforderlichBeschreibung
formatpathstring: json, xmljaAntwortformat

Anfragetext (application/x-www-form-urlencoded)

NameTypErforderlichBeschreibung
id_clientintegerjaIhre Mailpro-Client-ID
api_keystringjaIhr API-Schlüssel (GUID)
messagestringjaSMS-Nachrichtentext. Bleiben Sie unter 160 Zeichen für eine einteilige SMS. Zeichen außerhalb des GSM-7-Alphabets (z. B. Chinesisch, Arabisch, Emoji) schalten die Kodierung auf Unicode um und reduzieren das Limit auf 70 Zeichen pro Teil.
tointegerjaID der Kontaktliste, an die gesendet werden soll (aus /list/list)
scheduled_timestring (date-time)Den Versand für ein zukünftiges Datum/eine zukünftige Uhrzeit (ISO 8601) terminieren. Weglassen oder leer lassen, um sofort zu senden.
shorten_urlsbooleanAuf true setzen, um jeden Link der Nachricht durch einen Kurzlink https://mailp.ro/m/... zu ersetzen: weniger Zeichen, daher manchmal weniger berechnete SMS-Teile. Ein Link, der nicht gekürzt werden kann, bleibt unverändert.

Antworten

CodeBeschreibung
200Massen-SMS-Versand erfolgreich erstellt
202Unzureichende SMS-Credits
400Pflichtfeld fehlt
401Ungültige Anmeldedaten

Beispiel 200

{
  "Id": 6001,
  "Message": "Flash sale today only — 30% off all orders. Shop now at mailpro.com/shop",
  "ScheduledTime": "2026-04-20T10:00:00",
  "To": [
    "42"
  ]
}

Beispiel 202

{
  "Error": "Insufficient Credit",
  "Code": 202
}

Beispiel 400

{
  "Error": "Malformed Input",
  "Code": 103
}

GET /send/add_single.{format}

Eine einzelne SMS senden (GET)

Sendet eine einzelne SMS an einen Empfänger über eine GET-Anfrage. Nützlich für einfache Integrationen, bei denen POST nicht verfügbar ist. Anmeldedaten und Nachricht werden als Query-Parameter übergeben.

Hinweis: Vermeiden Sie GET für sensible Nachrichten — Query-Parameter erscheinen in den Server-Logs. Bevorzugen Sie stattdessen POST /send/add_single.

OAuth-Scope : sms:send

Parameter

NameOrtTypErforderlichBeschreibung
formatpathstring: json, xmljaAntwortformat
toquerystringjaEmpfänger-Telefonnummer. Akzeptiert +41…, 0041… oder 41… mit oder ohne Trennzeichen. Siehe Phone number format in der API-Beschreibung.
messagequerystringjaSMS-Nachrichtentext (max. 160 Zeichen bei Standardkodierung)
scheduled_timequerystring (date-time)Den Versand terminieren (ISO 8601). Weglassen, um sofort zu senden.
shorten_urlsquerybooleanAuf true setzen, um jeden Link der Nachricht durch einen Kurzlink https://mailp.ro/m/... zu ersetzen: weniger Zeichen, daher manchmal weniger berechnete SMS-Teile. Ein Link, der nicht gekürzt werden kann, bleibt unverändert.

Antworten

CodeBeschreibung
200SMS erfolgreich gesendet (oder terminiert)
202Unzureichende SMS-Credits
400Erforderlicher Parameter fehlt
401Ungültige Anmeldedaten

Beispiel 200

{
  "Id": 5001,
  "Message": "Your appointment is confirmed for tomorrow at 10:00.",
  "ScheduledTime": "2026-04-15T09:00:00",
  "To": "0041791234567",
  "Charge": "1"
}

POST /send/add_single.{format}

Eine einzelne SMS senden

Sendet eine einzelne SMS-Nachricht an eine Empfänger-Telefonnummer. Unterstützt Terminierung über scheduled_time.

Credit-Verbrauch: Credits werden zum Versandzeitpunkt abgezogen. Das Feld Charge in der Antwort zeigt, wie viele Credits verbraucht wurden.

Die Antwort gibt { "Error": "Insufficient Credit", "Code": 202 } zurück, wenn das Konto über unzureichende Credits verfügt.

OAuth-Scope : sms:send

Parameter

NameOrtTypErforderlichBeschreibung
formatpathstring: json, xmljaAntwortformat

Anfragetext (application/x-www-form-urlencoded)

NameTypErforderlichBeschreibung
id_clientintegerjaIhre Mailpro-Client-ID
api_keystringjaIhr API-Schlüssel (GUID)
messagestringjaSMS-Nachrichtentext
tostringjaEmpfänger-Telefonnummer. Akzeptiert +41…, 0041… oder 41… mit oder ohne Trennzeichen. Siehe Phone number format in der API-Beschreibung.
scheduled_timestring (date-time)Den Versand für einen zukünftigen Zeitpunkt terminieren. Weglassen, um sofort zu senden.
shorten_urlsbooleanAuf true setzen, um jeden Link der Nachricht durch einen Kurzlink https://mailp.ro/m/... zu ersetzen: weniger Zeichen, daher manchmal weniger berechnete SMS-Teile. Ein Link, der nicht gekürzt werden kann, bleibt unverändert.

Antworten

CodeBeschreibung
200SMS erfolgreich gesendet (oder terminiert)
202Unzureichende SMS-Credits
400Pflichtfeld fehlt
401Ungültige Anmeldedaten

Beispiel 200

{
  "Id": 5001,
  "Message": "Your verification code is 8472. Valid for 10 minutes.",
  "ScheduledTime": "2026-04-15T14:30:00",
  "To": "0041791234567",
  "Charge": "1"
}

Beispiel 202

{
  "Error": "Insufficient Credit",
  "Code": 202
}

Beispiel 400

{
  "Error": "Malformed Input",
  "Code": 103
}

GET /send/list.{format}

SMS-Kampagnen auflisten

Gibt die Liste der SMS-Kampagnen (Massenversände) für das Konto zurück. Paginierung über die Header NumberOfRecords und PageNumber.

Verwenden Sie type_to, um nach Versandtyp zu filtern:

OAuth-Scope : sms:send

Parameter

NameOrtTypErforderlichBeschreibung
formatpathstring: json, xmljaAntwortformat
type_toqueryinteger: 0, 1Versandtyp-Filter: - 0 (Standard) — Massenversände an eine Kontaktliste - 1 — Einzelversände an eine einzelne Nummer

Antworten

CodeBeschreibung
200SMS-Kampagnenliste erfolgreich zurückgegeben
401Ungültige Anmeldedaten

Beispiel 200

[
  {
    "Id": 5001,
    "Message": "Your verification code is 8472",
    "ScheduledTime": "2026-04-15T09:00:00",
    "To": "41791234567"
  }
]

POST /send/del.{format}

Einen SMS-Versand stornieren oder löschen

Storniert einen anstehenden terminierten SMS-Versand oder löscht einen abgeschlossenen aus der Historie. Nur in der Zukunft terminierte Versände können storniert werden. Laufende Versände können nicht gestoppt werden.

OAuth-Scope : sms:send

Parameter

NameOrtTypErforderlichBeschreibung
formatpathstring: json, xmljaAntwortformat

Anfragetext (application/x-www-form-urlencoded)

NameTypErforderlichBeschreibung
id_clientintegerjaIhre Mailpro-Client-ID
api_keystringjaIhr API-Schlüssel (GUID)
id_sendintegerjaID des zu stornierenden oder zu löschenden SMS-Versands (aus /send/list)

Antworten

CodeBeschreibung
200SMS-Versand erfolgreich storniert oder gelöscht
400id_send fehlt
401Ungültige Anmeldedaten
500Löschen fehlgeschlagen (Versand nicht gefunden oder bereits verarbeitet)

Beispiel 200

{
  "Result": "OK"
}

Beispiel 500

{
  "Error": "Delete failed",
  "Code": 500
}

GET /send/scheduled.{format}

Meine terminierten SMS-Versände auflisten

Gibt die SMS-Versände (Einzel oder Kampagne) zurück, die für ein zukünftiges Datum terminiert sind und noch nicht versendet wurden. Nützlich vor dem Aufruf von /cancel oder /reschedule.

Datensätze sind aufsteigend nach scheduled_time sortiert.

OAuth-Scope : sms:send

Parameter

NameOrtTypErforderlichBeschreibung
formatpathstring: json, xmljaAntwortformat
id_clientqueryintegerja
api_keyquerystringja
NumberOfRecordsheaderintegerEinträge pro Seite — standardmäßig und maximal 5.000 (siehe Paginierung). HTTP-Header oder Query-Parameter.
PageNumberheaderinteger1-basierte Seitenzahl für paginierte Antworten. Wird als HTTP-Header gesendet.

Antworten

CodeBeschreibung
200Liste der terminierten SMS-Versände
401Ungültige Anmeldedaten

Beispiel 200

[
  {
    "Id": 9001,
    "Message": "Black Friday: 30% off until midnight.",
    "ScheduledTime": "2026-11-27T12:00:00",
    "To": "+33671234567"
  }
]

POST /send/{id_send}/cancel.{format}

Einen terminierten SMS-Versand stornieren

Storniert eine terminierte SMS, die noch nicht versendet wurde. Wenn der Versand bereits verarbeitet wurde (oder nicht existiert / einem anderen Client gehört), wird 409 Conflict zurückgegeben.

OAuth-Scope : sms:send

Parameter

NameOrtTypErforderlichBeschreibung
formatpathstring: json, xmljaAntwortformat
id_sendpathintegerja

Anfragetext (application/x-www-form-urlencoded)

NameTypErforderlichBeschreibung
id_clientintegerja
api_keystringja

Antworten

CodeBeschreibung
200Versand storniert
401Ungültige Anmeldedaten
409Bereits versendet oder nicht gefunden

Beispiel 200

{
  "Result": "OK",
  "Cancelled": 9001
}

Beispiel 409

{
  "error": "conflict",
  "message": "Send not found, not owned by client, or already dispatched."
}

PATCH /send/{id_send}/reschedule.{format}

Einen terminierten SMS-Versand umterminieren

Aktualisiert das geplante Datum einer terminierten SMS, die noch nicht versendet wurde. Das neue Datum muss in der Zukunft und innerhalb von 90 Tagen liegen.

Name des Datumsfelds: Die API akzeptiert scheduled_time (primär) sowie die Legacy-Aliase PlanDate, date_planned und DatePlanned. Geben Sie eines davon an — das erste Nicht-Null-Feld wird verwendet.

OAuth-Scope : sms:send

Parameter

NameOrtTypErforderlichBeschreibung
formatpathstring: json, xmljaAntwortformat
id_sendpathintegerja

Anfragetext (application/x-www-form-urlencoded)

NameTypErforderlichBeschreibung
id_clientintegerja
api_keystringja
scheduled_timestring (date-time)Primärer Feldname.
PlanDatestring (date-time)Legacy-Alias, aus Gründen der Abwärtskompatibilität akzeptiert.
date_plannedstring (date-time)Legacy-Alias, aus Gründen der Abwärtskompatibilität akzeptiert.
DatePlannedstring (date-time)Legacy-Alias, aus Gründen der Abwärtskompatibilität akzeptiert.

Antworten

CodeBeschreibung
200Versand umterminiert
400scheduled_time fehlt oder ist ungültig
401Ungültige Anmeldedaten
409Bereits versendet, nicht gefunden oder neues Datum außerhalb des Bereichs

Beispiel 200

{
  "Result": "OK",
  "Id": 9001,
  "NewScheduledTime": "2026-12-31T14:30:00"
}

Beispiel 409

{
  "error": "conflict",
  "message": "Reschedule failed — send not found, already dispatched, or new date out of range."
}

Lists

Verwalten Sie SMS-Kontaktlisten. Eine Kontaktliste gruppiert Telefonnummern für den Massenversand. Sie können bis zu 1.000 Listen pro Konto erstellen (gleiche Grenze für die drei Mailpro-APIs und in der App).

GET /list/list.{format}

Telefon-Kontaktlisten auflisten

Gibt alle SMS-Kontaktlisten für das Konto zurück. Verwenden Sie die zurückgegebenen Id-Werte beim Versenden von Massen-SMS-Kampagnen oder beim Hinzufügen von Telefonnummern.

OAuth-Scope : sms:contacts:read

Parameter

NameOrtTypErforderlichBeschreibung
formatpathstring: json, xmljaAntwortformat

Antworten

CodeBeschreibung
200Telefonlisten erfolgreich zurückgegeben
401Ungültige Anmeldedaten

Beispiel 200

{
  "Items": [
    {
      "AddressBookId": 42,
      "Name": "Newsletter subscribers",
      "TotalNumberPhones": 1547
    },
    {
      "AddressBookId": 43,
      "Name": "Loyalty program",
      "TotalNumberPhones": 823
    }
  ]
}

POST /list/add.{format}

Eine Kontaktliste erstellen

Erstellt eine neue SMS-Kontaktliste mit dem angegebenen Namen. Die Liste beginnt leer — fügen Sie Telefonnummern mit POST /phone/add hinzu. Maximal 1.000 Listen pro Konto (gleiche Grenze für die drei Mailpro-APIs und in der App). Gibt HTTP 422 zurück, wenn das Limit erreicht ist.

Parameter

NameOrtTypErforderlichBeschreibung
formatpathstring: json, xmljaAntwortformat

Anfragetext (application/x-www-form-urlencoded)

NameTypErforderlichBeschreibung
id_clientintegerjaIhre Mailpro-Client-ID
api_keystringjaIhr API-Schlüssel (GUID)
namestringjaAnzeigename für die neue Kontaktliste

Antworten

CodeBeschreibung
200Kontaktliste erfolgreich erstellt
400Pflichtfeld fehlt (name)
401Ungültige Anmeldedaten

Beispiel 200

{
  "Id": 44,
  "Name": "Spring campaign 2026",
  "NumberPhones": 0
}

Beispiel 400

{
  "Error": "Malformed Input",
  "Code": 103
}

POST /list/edit.{format}

Eine Kontaktliste umbenennen

Aktualisiert den Anzeigenamen einer bestehenden SMS-Kontaktliste. Die Telefonnummern in der Liste bleiben davon unberührt.

OAuth-Scope : sms:contacts:write

Parameter

NameOrtTypErforderlichBeschreibung
formatpathstring: json, xmljaAntwortformat

Anfragetext (application/x-www-form-urlencoded)

NameTypErforderlichBeschreibung
id_clientintegerjaIhre Mailpro-Client-ID
api_keystringjaIhr API-Schlüssel (GUID)
address_book_idintegerjaID der umzubenennenden Kontaktliste (aus /list/list)
namestringjaNeuer Anzeigename für die Kontaktliste

Antworten

CodeBeschreibung
200Kontaktliste erfolgreich umbenannt
400Pflichtfeld fehlt
401Ungültige Anmeldedaten

POST /list/del.{format}

Eine Kontaktliste löschen

Löscht eine SMS-Kontaktliste und alle darin enthaltenen Telefonnummern dauerhaft. Diese Aktion kann nicht rückgängig gemacht werden.

OAuth-Scope : sms:contacts:write

Parameter

NameOrtTypErforderlichBeschreibung
formatpathstring: json, xmljaAntwortformat

Anfragetext (application/x-www-form-urlencoded)

NameTypErforderlichBeschreibung
id_clientintegerjaIhre Mailpro-Client-ID
api_keystringjaIhr API-Schlüssel (GUID)
address_book_idintegerjaID der zu löschenden Kontaktliste

Antworten

CodeBeschreibung
200Kontaktliste erfolgreich gelöscht
400address_book_id fehlt
401Ungültige Anmeldedaten

Phone Numbers

Verwalten Sie einzelne Telefonnummern innerhalb einer Kontaktliste — Einträge hinzufügen, aktualisieren und entfernen.

GET /phone/list.{format}

Telefonnummern in einer Kontaktliste auflisten

Gibt eine paginierte Liste der Telefonnummern in einer bestimmten Kontaktliste zurück. Verwenden Sie address_book_id, um anzugeben, welche Liste abgerufen werden soll. Paginierung: NumberOfRecords und PageNumber (standardmäßig 5.000 pro Seite, Seite 1).

OAuth-Scope : sms:contacts:read

Parameter

NameOrtTypErforderlichBeschreibung
formatpathstring: json, xmljaAntwortformat
address_book_idqueryintegerjaID der Kontaktliste, aus der Telefonnummern abgerufen werden sollen
NumberOfRecordsheaderintegerEinträge pro Seite — standardmäßig und maximal 5.000 (siehe Paginierung). HTTP-Header oder Query-Parameter.
PageNumberheaderinteger1-basierte Seitenzahl für paginierte Antworten. Wird als HTTP-Header gesendet.
SortByNameheaderbooleanAuf true setzen, um Ergebnisse alphabetisch nach Namen zu sortieren.

Antworten

CodeBeschreibung
200Telefonnummern erfolgreich zurückgegeben
401Ungültige Anmeldedaten

Beispiel 200

{
  "Items": [
    {
      "Id": 1001,
      "Number": "41791234567",
      "FirstName": "Alice",
      "LastName": "Dupont"
    },
    {
      "Id": 1002,
      "Number": "33612345678",
      "FirstName": "Bob",
      "LastName": "Martin"
    }
  ]
}

POST /phone/add.{format}

Telefonnummer(n) zu einer Liste hinzufügen

Fügt einer Kontaktliste eine oder mehrere Telefonnummern hinzu.

Einzelne Nummer: verwenden Sie das Feld number.

Massenimport: verwenden Sie das Feld phone_list mit durch Semikola getrennten Nummern: +41791234567;+33612345678;0049301234567

Telefonnummern akzeptieren +, 00 oder das reine Format — siehe Phone number format in der API-Beschreibung für die vollständige Liste der akzeptierten / abgelehnten Eingaben. Doppelte Nummern werden stillschweigend übersprungen, sofern nicht force=1 gesetzt ist.

OAuth-Scope : sms:contacts:write

Parameter

NameOrtTypErforderlichBeschreibung
formatpathstring: json, xmljaAntwortformat

Anfragetext (application/x-www-form-urlencoded)

NameTypErforderlichBeschreibung
id_clientintegerjaIhre Mailpro-Client-ID
api_keystringjaIhr API-Schlüssel (GUID)
address_book_idintegerjaID der Kontaktliste, der die Nummer(n) hinzugefügt werden sollen
numberstringEinzelne Telefonnummer. Akzeptiert +41…, 0041… oder 41… mit oder ohne Trennzeichen (Leerzeichen, Bindestriche, Punkte, Schrägstriche, Klammern). Siehe Phone number format in der API-Beschreibung. Verwenden Sie dies ODER phone_list — nicht beides.
phone_liststringDurch Semikola getrennte Liste von Telefonnummern für den Massenimport. Verwenden Sie dies ODER number — nicht beides. Beispiel: 0041791234567;0033612345678
firstnamestringVorname des Kontakts (optional, nur bei einzelner Nummer)
lastnamestringNachname des Kontakts (optional, nur bei einzelner Nummer)
forceinteger: 0, 1Auf 1 setzen, um eine Nummer auch dann hinzuzufügen, wenn sie zuvor abgemeldet wurde oder bereits existiert. Standard: 0 (Duplikate werden übersprungen).

Antworten

CodeBeschreibung
200Telefonnummer(n) erfolgreich hinzugefügt
400Pflichtfeld fehlt
401Ungültige Anmeldedaten

Beispiel 200

{
  "Id": 1003,
  "Number": "0041791234567",
  "FirstName": "Alice",
  "LastName": "Dupont"
}

POST /phone/edit.{format}

Telefonnummerneintrag aktualisieren

Aktualisiert die Telefonnummer und/oder die Kontaktdaten eines bestehenden Eintrags. Verwenden Sie number_id (aus /phone/list), um den zu aktualisierenden Eintrag zu identifizieren. Nur die in der Anfrage angegebenen Felder werden aktualisiert.

OAuth-Scope : sms:contacts:write

Parameter

NameOrtTypErforderlichBeschreibung
formatpathstring: json, xmljaAntwortformat

Anfragetext (application/x-www-form-urlencoded)

NameTypErforderlichBeschreibung
id_clientintegerjaIhre Mailpro-Client-ID
api_keystringjaIhr API-Schlüssel (GUID)
number_idintegerjaID des zu aktualisierenden Telefonnummerneintrags (aus /phone/list)
numberstringNeue Telefonnummer. Akzeptiert +41…, 0041… oder 41… mit oder ohne Trennzeichen. Siehe Phone number format in der API-Beschreibung.
firstnamestringNeuer Vorname des Kontakts
lastnamestringNeuer Nachname des Kontakts

Antworten

CodeBeschreibung
200Telefonnummerneintrag erfolgreich aktualisiert
400number_id fehlt
401Ungültige Anmeldedaten

POST /phone/del.{format}

Eine Telefonnummer aus einer Liste entfernen

Entfernt einen bestimmten Telefonnummerneintrag dauerhaft aus seiner Kontaktliste. Verwenden Sie number_id (aus /phone/list), um den Eintrag zu identifizieren.

OAuth-Scope : sms:contacts:write

Parameter

NameOrtTypErforderlichBeschreibung
formatpathstring: json, xmljaAntwortformat

Anfragetext (application/x-www-form-urlencoded)

NameTypErforderlichBeschreibung
id_clientintegerjaIhre Mailpro-Client-ID
api_keystringjaIhr API-Schlüssel (GUID)
number_idintegerjaID des zu löschenden Telefonnummerneintrags (aus /phone/list)

Antworten

CodeBeschreibung
200Telefonnummer erfolgreich entfernt
400number_id fehlt
401Ungültige Anmeldedaten

Credit

Überprüfen Sie das verbleibende SMS-Credit-Guthaben für Ihr Konto (getrennt vom monatlichen API-Anfragekontingent — siehe /account/limits).

GET /credit/get.{format}

SMS-Credit-Guthaben abrufen

Gibt das aktuelle SMS-Credit-Guthaben für Ihr Konto zurück. SMS-Credits werden zum Versandzeitpunkt verbraucht. Eine Standard-SMS (≤160 GSM-7-Zeichen) kostet 1 Credit. Längere Nachrichten oder Nachrichten mit Sonderzeichen können mehr kosten.

> Hinweis: Dies gibt Ihr SMS-Versand-Credit-Guthaben zurück, nicht Ihr API-Anfragekontingent. > Für das API-Kontingent siehe GET /account/limits.{format}.

OAuth-Scope : sms:read

Parameter

NameOrtTypErforderlichBeschreibung
formatpathstring: json, xmljaAntwortformat

Antworten

CodeBeschreibung
200Credit-Guthaben erfolgreich zurückgegeben
401Ungültige Anmeldedaten

Beispiel 200

{
  "TotalCredits": 5000
}

History

Durchsuchen Sie das vollständige Protokoll vergangener SMS-Kampagnen.

GET /history/list.{format}

SMS-Versandhistorie auflisten

Gibt ein paginiertes Protokoll aller von diesem Konto versendeten SMS-Kampagnen zurück. Die Ergebnisse sind absteigend nach Datum sortiert (neueste zuerst). Paginierung: NumberOfRecords und PageNumber (Header oder Query, standardmäßig 5.000 pro Seite).

OAuth-Scope : sms:read

Parameter

NameOrtTypErforderlichBeschreibung
formatpathstring: json, xmljaAntwortformat

Antworten

CodeBeschreibung
200Historienliste erfolgreich zurückgegeben
401Ungültige Anmeldedaten

Beispiel 200

{
  "Items": [
    {
      "Id": 583294,
      "DateSent": "2026-07-17T18:56:39.813",
      "Message": "Your verification code is 8472",
      "Charge": 3,
      "Parts": 1
    }
  ]
}

Import

Laden Sie eine CSV- oder XLSX-Datei hoch, um Telefonnummern stapelweise in eine Kontaktliste zu importieren. Die Datei wird zur asynchronen Verarbeitung in die Warteschlange gestellt — verfolgen Sie den Abschluss über die zurückgegebene ImportJobId oder über den optionalen webhook_url-Callback.

POST /import/upload.{format}

Datei mit Telefonnummern (CSV / XLSX) für den Massenimport hochladen

Laden Sie eine CSV- oder XLSX-Datei hoch, um Telefonnummern in eine Kontaktliste zu importieren. Die Datei wird gespeichert und für die asynchrone Verarbeitung in die Warteschlange gestellt — der Endpoint gibt sofort eine ImportJobId zurück.

Anfragetyp: multipart/form-data

Erforderliche Formularfelder:

Optional:

Dateiformat:

OAuth-Scope : sms:contacts:write

Parameter

NameOrtTypErforderlichBeschreibung
formatpathstring: json, xmljaAntwortformat

Anfragetext (multipart/form-data)

NameTypErforderlichBeschreibung
id_listinteger (int64)jaID der Ziel-Kontaktliste
filestring (binary)jaCSV- oder XLSX-Datei (UTF-8, max. 50 MB)
webhook_urlstring (uri)Callback-URL, die nach Abschluss der Verarbeitung aufgerufen wird

Antworten

CodeBeschreibung
200Datei akzeptiert und in die Warteschlange gestellt
400Keine Datei hochgeladen oder id_list fehlt
401Ungültige Anmeldedaten
500Server- oder Speicherfehler

Beispiel 200

{
  "Result": "OK",
  "ImportJobId": 15,
  "InternalName": "230575-20260420142616-phones.csv"
}

Webhooks

Abonnieren Sie auf Ihrem Server Echtzeitbenachrichtigungen zu SMS-Ereignissen. Mailpro sendet einen HMAC-signierten JSON-Payload an Ihre URL, sobald das abonnierte Ereignis eintritt. Im Abschnitt „Webhooks" der Einleitung finden Sie den vollständigen Ereigniskatalog, das Payload-Envelope, Snippets zur Signaturverifizierung und die Retry-Richtlinie.

GET /webhooks

Webhooks auflisten

Gibt jeden auf dem authentifizierten Konto konfigurierten Webhook zurück.

Antworten

CodeBeschreibung
200Array von Webhooks
401Ungültige Anmeldedaten

Beispiel 200

{
  "items": [
    {
      "id": 14,
      "url": "https://example.com/hooks/mailpro",
      "description": "Slack-Integration",
      "is_active": true,
      "created_at": "2026-07-01T21:09:52.43",
      "updated_at": "2026-07-21T18:56:08.02",
      "last_delivery_at": "2026-07-21T18:56:07.653",
      "last_delivery_status": 200,
      "consecutive_failures": 0,
      "events": [
        "sms.delivered",
        "sms.failed"
      ]
    }
  ],
  "total": 1
}

POST /webhooks

Einen Webhook erstellen

Erstellt ein neues Webhook-Abonnement. Die Antwort enthält ein secret, das nur einmal angezeigt wird — speichern Sie es sofort serverseitig. Verwenden Sie es, um die HMAC-Signatur jedes eingehenden Payloads zu verifizieren.

Limits: max. 20 Webhooks pro Konto, max. 50 Ereignisse pro Webhook.

Anfragetext (application/json)

NameTypErforderlichBeschreibung
urlstring (uri)jaHTTPS-Endpoint (HTTP wird in der Produktion abgelehnt)
eventsarray of stringjaListe der Ereignistypen, die abonniert werden sollen (siehe Katalog oben). Verwenden Sie ["*"], um alle Ereignisse dieser API zu abonnieren.
descriptionstring

Beispiel

{
  "url": "https://example.com/hooks/mailpro",
  "events": [
    "sms.delivered",
    "sms.failed"
  ],
  "description": "Slack-Integration"
}

Antworten

CodeBeschreibung
201Webhook erstellt — secret wird nur hier zurückgegeben
400Ungültige URL, Ereignisliste oder Limit überschritten
401Ungültige Anmeldedaten

Beispiel 201

{
  "id": 42,
  "url": "https://example.com/hooks/mailpro",
  "events": [
    "sms.delivered",
    "sms.failed"
  ],
  "description": "Slack-Integration",
  "isActive": true,
  "consecutiveFailures": 0,
  "autoDisabledAt": null,
  "autoDisabledReason": null,
  "createdAt": "2026-05-25T10:00:00Z",
  "updatedAt": "2026-05-25T10:00:00Z",
  "secret": "whsec_AbcD1234EfgH5678IjkL9012MnoP3456QrsT"
}

GET /webhooks/{id}

Einen Webhook abrufen

Parameter

NameOrtTypErforderlichBeschreibung
idpathinteger (int64)ja

Antworten

CodeBeschreibung
200Der Webhook
404Webhook nicht gefunden

PUT /webhooks/{id}

Einen Webhook aktualisieren

Teilaktualisierung — nur die gesendeten Felder werden geändert.

Parameter

NameOrtTypErforderlichBeschreibung
idpathinteger (int64)ja

Anfragetext (application/json)

NameTypErforderlichBeschreibung
urlstring (uri)
eventsarray of string
descriptionstring
isActivebooleanAuf true setzen, um einen automatisch deaktivierten Webhook wieder zu aktivieren, sobald Ihr Endpoint repariert ist.

Antworten

CodeBeschreibung
200Aktualisierter Webhook
400Ungültiger Payload
404Webhook nicht gefunden

DELETE /webhooks/{id}

Einen Webhook löschen

Löscht den Webhook und seine vollständige Zustellhistorie dauerhaft.

Parameter

NameOrtTypErforderlichBeschreibung
idpathinteger (int64)ja

Antworten

CodeBeschreibung
204Gelöscht
404Webhook nicht gefunden

POST /webhooks/{id}/test

Ein Testereignis senden

Stellt ein sofortiges ping-Ereignis (oder einen anderen Ereignistyp über das eventType-Body-Feld) für Ihren Endpoint in die Warteschlange. Nützlich, um Erreichbarkeit und Signaturverifizierung zu überprüfen, bevor Sie sich auf echte Ereignisse verlassen.

Parameter

NameOrtTypErforderlichBeschreibung
idpathinteger (int64)ja

Anfragetext (application/json)

NameTypErforderlichBeschreibung
eventTypestring

Beispiel

{
  "eventType": "ping"
}

Antworten

CodeBeschreibung
202Ereignis zur Zustellung in die Warteschlange gestellt
404Webhook nicht gefunden

Beispiel 202

{
  "deliveryId": 1234,
  "eventId": "evt_8f3a9b2c4d1e5f6789abcdef01234567",
  "eventType": "ping"
}

POST /webhooks/{id}/rotate-secret

HMAC-Geheimnis rotieren

Generiert ein neues HMAC-Geheimnis und macht das alte sofort ungültig. Das neue Geheimnis wird einmal in der Antwort zurückgegeben — speichern Sie es. Jede Zustellung ab diesem Zeitpunkt wird mit dem neuen Geheimnis signiert.

Verwenden Sie dies, wenn Sie vermuten, dass Ihr Geheimnis kompromittiert wurde.

Parameter

NameOrtTypErforderlichBeschreibung
idpathinteger (int64)ja

Antworten

CodeBeschreibung
200Neues Geheimnis (einmal sichtbar)
404Webhook nicht gefunden

Beispiel 200

{
  "secret": "whsec_XyzA9876BcdE5432FghI1098JklM7654NopQ"
}

GET /webhooks/{id}/deliveries

Zustellversuche auflisten

Gibt die Historie der Zustellversuche für diesen Webhook zurück (30 Tage Aufbewahrung). Nützlich zum Debugging — welche Ereignisse wurden gesendet, welche Statuscodes wurden empfangen, Anzahl der Wiederholungen, Fehlermeldungen.

Parameter

NameOrtTypErforderlichBeschreibung
idpathinteger (int64)ja
limitqueryinteger
cursorqueryinteger (int64)Paginierungs-Cursor (= zuletzt gesehene Delivery-ID). Gibt Zustellungen mit id < cursor zurück.

Antworten

CodeBeschreibung
200Array von Zustellversuchen (neueste zuerst)
404Webhook nicht gefunden

POST /webhooks/{id}/deliveries/{deliveryId}/replay

Eine Zustellung erneut abspielen

Stellt einen neuen Zustellversuch mit demselben Payload wie dem Original in die Warteschlange. Nützlich, um eine fehlgeschlagene Zustellung erneut auszulösen, nachdem Sie Ihren Endpoint repariert haben. Eine NEUE Webhook_Delivery-Zeile wird erstellt (das Original wird zu Auditzwecken aufbewahrt). Der Replay durchläuft die Standard-Retry-Richtlinie (gleicher Backoff-Zeitplan, gleiche Auto-Deaktivierungsregel nach 10 Fehlschlägen).

Parameter

NameOrtTypErforderlichBeschreibung
idpathinteger (int64)ja
deliveryIdpathinteger (int64)ja

Antworten

CodeBeschreibung
202Replay in die Warteschlange gestellt
404Webhook oder Zustellung nicht gefunden