Interaktive Dokumentation · Entwicklerportal · OpenAPI-Spezifikation · EN · FR · DE · IT · PT · ES
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.
Jeder Endpunkt akzeptiert drei Authentifizierungsmethoden. Wählen Sie diejenige, die zu Ihrem Technologie-Stack passt.
POST /token, ohne Scopes.> 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.
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/.
| Endpunkt | URL |
|---|---|
| Authorize | GET https://api.mailpro.com/oauth/authorize |
| Token / Refresh | POST https://api.mailpro.com/oauth/token |
| JWKS | GET https://api.mailpro.com/oauth/.well-known/jwks |
| Discovery | GET 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.
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.
Zwei Anmeldedaten:
| Parameter | Typ | Beschreibung |
|---|---|---|
id_client | integer | Ihre numerische Mailpro-Kunden-ID, zu finden unter Einstellungen → API-Zugang |
api_key | string | Ihr API-Schlüssel (GUID-Format), zu finden unter Einstellungen → API-Zugang |
Übermitteln Sie diese an einer der folgenden Stellen — wählen Sie eine:
id_client: 12345 und api_key: a1b2c3d4-…. URLs werden von Webservern, CDNs und Proxys protokolliert, sodass ein Schlüssel in der Query-Zeichenkette in Zugriffsprotokolle gelangen kann. Header werden nicht protokolliert.?id_client=12345&api_key=…. Zur Abwärtskompatibilität mit bestehenden Integrationen erhalten. Wechseln Sie so bald wie möglich zu Headern.Werden Anmeldedaten an mehr als einer Stelle übermittelt, gewinnt der Header.
Für OAuth-ausgestellte Token erfordert jede Endpunktgruppe einen Scope (Legacy-Authentifizierung ist davon ausgenommen). Jede Operation listet ihren Scope unter Authorization auf. Übersicht:
| Endpunkte | Erforderlicher Scope |
|---|---|
/send/* (Massenversand, Einzelversand, Planung) | sms:send |
/history/list, /credit/get | sms:read |
/phone/list, /list/list | sms:contacts:read |
/phone/{add,edit,del}, /list/{edit,del}, /import/upload | sms:contacts:write |
/account/limits | account: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": "…" }.
Alle Endpunkte unterstützen json (Standard) und xml. Geben Sie das Format in der URL an:
/credit/get.json/credit/get.xmlFeldnamen 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.
Gleiche Regel für die drei Mailpro-APIs (Email v2, CRM v3, SMS): 5.000 Einträge pro Seite, standardmäßig und maximal.
NumberOfRecords — Einträge pro Seite. Fehlend, 0 oder über 5.000 = 5.000.PageNumber — Seitennummer ab 1 (Standard 1).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.
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:
| Alphabet | Einzelne Nachricht | Pro Teil bei Aufteilung |
|---|---|---|
| GSM-7 (Standard-Latein) | 160 Zeichen | 153 Zeichen |
| Unicode (Akzente außerhalb GSM-7, Kyrillisch, Emoji, …) | 70 Zeichen | 67 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.
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ültig | Ungültig |
|---|---|
+41794849980 — E.164 international | 0612345678 — nationales Format (führende 0) |
0041 79 484 99 80 — 00-Präfix + Leerzeichen | 41'794'849'80 — Apostrophe (werden nicht entfernt) |
+33 6-12-34-56-78 — + mit Bindestrichen | tel=0041794849980 — überflüssige Zeichen |
41794849980 — reine Ziffern | 1234567 — zu kurz (< 8 Ziffern) |
Regeln:
+, 00 oder kein Präfix0)-, Punkt ., Schrägstrich /, Klammern ( ), Unterstrich _, geschütztes Leerzeichen=, ;, + innerhalb der Nummer usw.) → wird abgelehnt41794849980)| HTTP | Code | Bedeutung |
|---|---|---|
| 400 | 103 | Fehlerhafte Eingabe — fehlender oder ungültiger erforderlicher Parameter |
| 202 | 202 | Unzureichende SMS-Guthaben |
| 401 | Ungültige(r) id_client / api_key | |
| 500 | 500 | Interner Fehler |
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.
POST /webhooks. Die Antwort enthält ein secret, das nur einmal angezeigt wird (Stil von Stripe / GitHub) — speichern Sie es.secret (Codebeispiele unten).> ⏱ 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.
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
}
}
| Feld | Format | Beschreibung |
|---|---|---|
id | evt_ + 32 Hexzeichen | Eindeutige Ereignis-ID — nutzen Sie sie als Idempotenzschlüssel auf Ihrer Seite. |
type | <domain>.<verb> | Kanonischer Ereignistyp. |
created | Unix-Sekunden UTC | In 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.id | int | Ihre Mailpro-Kunden-ID (= id_client). |
account.name | string | Ihr Kontoname (praktisch fürs clientseitige Debugging). |
data | object | Ereignis-Payload — die Struktur hängt von type ab (siehe Katalog unten). |
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.
| Ereignis | Auslöser | data-Struktur |
|---|---|---|
ping | Test über POST /webhooks/{id}/test | { message } |
sms.queued | POST /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.delivered | DLR mit Carrier-Code 004 oder 008 (Erfolgscodes) | { messageId: int, phone: string, stateCode: string, dlrDate: datetime } |
sms.failed | DLR mit jedem anderen Carrier-Code (Timeout, nicht zugestellt, abgelehnt, gesperrt, …) | { messageId: int, phone: string, stateCode: string, dlrDate: datetime } |
credits.sms.low | SMS-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.
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:
t und v1 aus dem Header.|now - t| > 300 (5-Minuten-Replay-Schutzfenster).expected = hex(HMAC_SHA256(secret, t + "." + raw_body)).v1 mit expected (crypto.timingSafeEqual, hash_equals, CryptographicOperations.FixedTimeEquals) — niemals ==.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'));
}
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']);
}
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'])
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"]));
}
| Versuch | Wartezeit vor dem nächsten Versuch |
|---|---|
| 1 → 2 | 10 Sekunden |
| 2 → 3 | 1 Minute |
| 3 → 4 | 5 Minuten |
| 4 → 5 | 30 Minuten |
| 5 → 6 | 2 Stunden |
| 6 → 7 | 6 Stunden |
| 7 | abgebrochen (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.
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.
| Limit | Wert |
|---|---|
| Webhooks pro Konto | 20 |
| Abonnierte Ereignisse pro Webhook | 50 |
| Maximale Payload-Größe | 256 KB |
| HTTP-Timeout pro Versuch | 10 Sekunden |
| Aufbewahrung des Zustellverlaufs | 30 Tage |
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).
/tokenAccess-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.
| Grant-Typ | Anwendungsfall |
|---|---|
password | Standardintegration — Benutzername + API-Schlüssel |
refresh_token | Erneuerung eines ablaufenden Access-Tokens ohne erneute Authentifizierung |
client_credentials | Server-zu-Server nur mit Client-ID |
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)
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
grant_type | string: password, refresh_token, client_credentials | ja | |
username | string | Ihr Mailpro-Benutzername (E-Mail). Erforderlich für password-Grant. | |
password | string | Ihr Mailpro-API-Schlüssel (GUID-Format). Erforderlich für password-Grant. | |
refresh_token | string | Vorheriger Refresh-Token. Erforderlich für refresh_token-Grant. | |
client_id | string | Ihre Mailpro-Client-ID (Ganzzahl). Erforderlich für client_credentials-Grant. |
Antworten
| Code | Beschreibung |
|---|---|
200 | Token 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.
|
307 | Temporary 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).
|
400 | Ungü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."
}
Überprüfen Sie Ihr SMS-Credit-Guthaben, Ihr monatliches API-Kontingent und den Kontostatus.
/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:
v2-, v3- oder sms-Endpoints.Was KOSTENLOS ist (verbraucht keine Credits):
/health-Endpoints.401, 403 oder 429 fehlschlagen.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
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
Antworten
| Code | Beschreibung |
|---|---|
200 | Kontingent-Snapshot |
401 | Ungültige Anmeldedaten |
404 | Kein 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
}
Versenden Sie SMS-Nachrichten — entweder eine einzelne transaktionale SMS an einen Empfänger oder eine Massenkampagne an eine ganze Kontaktliste.
/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
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
Anfragetext (application/x-www-form-urlencoded)
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
id_client | integer | ja | Ihre Mailpro-Client-ID |
api_key | string | ja | Ihr API-Schlüssel (GUID) |
message | string | ja | SMS-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. |
to | integer | ja | ID der Kontaktliste, an die gesendet werden soll (aus /list/list) |
scheduled_time | string (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_urls | boolean | Auf 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
| Code | Beschreibung |
|---|---|
200 | Massen-SMS-Versand erfolgreich erstellt |
202 | Unzureichende SMS-Credits |
400 | Pflichtfeld fehlt |
401 | Ungü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
}
/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
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
to | query | string | ja | Empfänger-Telefonnummer. Akzeptiert +41…, 0041… oder 41… mit oder ohne Trennzeichen. Siehe Phone number format in der API-Beschreibung. |
message | query | string | ja | SMS-Nachrichtentext (max. 160 Zeichen bei Standardkodierung) |
scheduled_time | query | string (date-time) | Den Versand terminieren (ISO 8601). Weglassen, um sofort zu senden. | |
shorten_urls | query | boolean | Auf 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
| Code | Beschreibung |
|---|---|
200 | SMS erfolgreich gesendet (oder terminiert) |
202 | Unzureichende SMS-Credits |
400 | Erforderlicher Parameter fehlt |
401 | Ungü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"
}
/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
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
Anfragetext (application/x-www-form-urlencoded)
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
id_client | integer | ja | Ihre Mailpro-Client-ID |
api_key | string | ja | Ihr API-Schlüssel (GUID) |
message | string | ja | SMS-Nachrichtentext |
to | string | ja | Empfänger-Telefonnummer. Akzeptiert +41…, 0041… oder 41… mit oder ohne Trennzeichen. Siehe Phone number format in der API-Beschreibung. |
scheduled_time | string (date-time) | Den Versand für einen zukünftigen Zeitpunkt terminieren. Weglassen, um sofort zu senden. | |
shorten_urls | boolean | Auf 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
| Code | Beschreibung |
|---|---|
200 | SMS erfolgreich gesendet (oder terminiert) |
202 | Unzureichende SMS-Credits |
400 | Pflichtfeld fehlt |
401 | Ungü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
}
/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:
0 (Standard) — Massenversände an Listen1 — einzelne EinzelversändeOAuth-Scope : sms:send
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
type_to | query | integer: 0, 1 | Versandtyp-Filter:
- 0 (Standard) — Massenversände an eine Kontaktliste
- 1 — Einzelversände an eine einzelne Nummer
|
Antworten
| Code | Beschreibung |
|---|---|
200 | SMS-Kampagnenliste erfolgreich zurückgegeben |
401 | Ungültige Anmeldedaten |
Beispiel 200
[
{
"Id": 5001,
"Message": "Your verification code is 8472",
"ScheduledTime": "2026-04-15T09:00:00",
"To": "41791234567"
}
]
/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
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
Anfragetext (application/x-www-form-urlencoded)
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
id_client | integer | ja | Ihre Mailpro-Client-ID |
api_key | string | ja | Ihr API-Schlüssel (GUID) |
id_send | integer | ja | ID des zu stornierenden oder zu löschenden SMS-Versands (aus /send/list) |
Antworten
| Code | Beschreibung |
|---|---|
200 | SMS-Versand erfolgreich storniert oder gelöscht |
400 | id_send fehlt |
401 | Ungültige Anmeldedaten |
500 | Löschen fehlgeschlagen (Versand nicht gefunden oder bereits verarbeitet) |
Beispiel 200
{
"Result": "OK"
}
Beispiel 500
{
"Error": "Delete failed",
"Code": 500
}
/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
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
id_client | query | integer | ja | |
api_key | query | string | ja | |
NumberOfRecords | header | integer | Einträge pro Seite — standardmäßig und maximal 5.000 (siehe Paginierung). HTTP-Header oder Query-Parameter. | |
PageNumber | header | integer | 1-basierte Seitenzahl für paginierte Antworten. Wird als HTTP-Header gesendet. |
Antworten
| Code | Beschreibung |
|---|---|
200 | Liste der terminierten SMS-Versände |
401 | Ungültige Anmeldedaten |
Beispiel 200
[
{
"Id": 9001,
"Message": "Black Friday: 30% off until midnight.",
"ScheduledTime": "2026-11-27T12:00:00",
"To": "+33671234567"
}
]
/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
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
id_send | path | integer | ja |
Anfragetext (application/x-www-form-urlencoded)
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
id_client | integer | ja | |
api_key | string | ja |
Antworten
| Code | Beschreibung |
|---|---|
200 | Versand storniert |
401 | Ungültige Anmeldedaten |
409 | Bereits 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."
}
/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
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
id_send | path | integer | ja |
Anfragetext (application/x-www-form-urlencoded)
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
id_client | integer | ja | |
api_key | string | ja | |
scheduled_time | string (date-time) | Primärer Feldname. | |
PlanDate | string (date-time) | Legacy-Alias, aus Gründen der Abwärtskompatibilität akzeptiert. | |
date_planned | string (date-time) | Legacy-Alias, aus Gründen der Abwärtskompatibilität akzeptiert. | |
DatePlanned | string (date-time) | Legacy-Alias, aus Gründen der Abwärtskompatibilität akzeptiert. |
Antworten
| Code | Beschreibung |
|---|---|
200 | Versand umterminiert |
400 | scheduled_time fehlt oder ist ungültig |
401 | Ungültige Anmeldedaten |
409 | Bereits 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."
}
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).
/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
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
Antworten
| Code | Beschreibung |
|---|---|
200 | Telefonlisten erfolgreich zurückgegeben |
401 | Ungültige Anmeldedaten |
Beispiel 200
{
"Items": [
{
"AddressBookId": 42,
"Name": "Newsletter subscribers",
"TotalNumberPhones": 1547
},
{
"AddressBookId": 43,
"Name": "Loyalty program",
"TotalNumberPhones": 823
}
]
}
/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
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
Anfragetext (application/x-www-form-urlencoded)
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
id_client | integer | ja | Ihre Mailpro-Client-ID |
api_key | string | ja | Ihr API-Schlüssel (GUID) |
name | string | ja | Anzeigename für die neue Kontaktliste |
Antworten
| Code | Beschreibung |
|---|---|
200 | Kontaktliste erfolgreich erstellt |
400 | Pflichtfeld fehlt (name) |
401 | Ungültige Anmeldedaten |
Beispiel 200
{
"Id": 44,
"Name": "Spring campaign 2026",
"NumberPhones": 0
}
Beispiel 400
{
"Error": "Malformed Input",
"Code": 103
}
/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
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
Anfragetext (application/x-www-form-urlencoded)
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
id_client | integer | ja | Ihre Mailpro-Client-ID |
api_key | string | ja | Ihr API-Schlüssel (GUID) |
address_book_id | integer | ja | ID der umzubenennenden Kontaktliste (aus /list/list) |
name | string | ja | Neuer Anzeigename für die Kontaktliste |
Antworten
| Code | Beschreibung |
|---|---|
200 | Kontaktliste erfolgreich umbenannt |
400 | Pflichtfeld fehlt |
401 | Ungültige Anmeldedaten |
/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
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
Anfragetext (application/x-www-form-urlencoded)
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
id_client | integer | ja | Ihre Mailpro-Client-ID |
api_key | string | ja | Ihr API-Schlüssel (GUID) |
address_book_id | integer | ja | ID der zu löschenden Kontaktliste |
Antworten
| Code | Beschreibung |
|---|---|
200 | Kontaktliste erfolgreich gelöscht |
400 | address_book_id fehlt |
401 | Ungültige Anmeldedaten |
Verwalten Sie einzelne Telefonnummern innerhalb einer Kontaktliste — Einträge hinzufügen, aktualisieren und entfernen.
/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
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
address_book_id | query | integer | ja | ID der Kontaktliste, aus der Telefonnummern abgerufen werden sollen |
NumberOfRecords | header | integer | Einträge pro Seite — standardmäßig und maximal 5.000 (siehe Paginierung). HTTP-Header oder Query-Parameter. | |
PageNumber | header | integer | 1-basierte Seitenzahl für paginierte Antworten. Wird als HTTP-Header gesendet. | |
SortByName | header | boolean | Auf true setzen, um Ergebnisse alphabetisch nach Namen zu sortieren. |
Antworten
| Code | Beschreibung |
|---|---|
200 | Telefonnummern erfolgreich zurückgegeben |
401 | Ungültige Anmeldedaten |
Beispiel 200
{
"Items": [
{
"Id": 1001,
"Number": "41791234567",
"FirstName": "Alice",
"LastName": "Dupont"
},
{
"Id": 1002,
"Number": "33612345678",
"FirstName": "Bob",
"LastName": "Martin"
}
]
}
/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
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
Anfragetext (application/x-www-form-urlencoded)
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
id_client | integer | ja | Ihre Mailpro-Client-ID |
api_key | string | ja | Ihr API-Schlüssel (GUID) |
address_book_id | integer | ja | ID der Kontaktliste, der die Nummer(n) hinzugefügt werden sollen |
number | string | Einzelne 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_list | string | Durch Semikola getrennte Liste von Telefonnummern für den Massenimport.
Verwenden Sie dies ODER number — nicht beides.
Beispiel: 0041791234567;0033612345678
| |
firstname | string | Vorname des Kontakts (optional, nur bei einzelner Nummer) | |
lastname | string | Nachname des Kontakts (optional, nur bei einzelner Nummer) | |
force | integer: 0, 1 | Auf 1 setzen, um eine Nummer auch dann hinzuzufügen, wenn sie zuvor abgemeldet wurde oder bereits existiert.
Standard: 0 (Duplikate werden übersprungen).
|
Antworten
| Code | Beschreibung |
|---|---|
200 | Telefonnummer(n) erfolgreich hinzugefügt |
400 | Pflichtfeld fehlt |
401 | Ungültige Anmeldedaten |
Beispiel 200
{
"Id": 1003,
"Number": "0041791234567",
"FirstName": "Alice",
"LastName": "Dupont"
}
/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
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
Anfragetext (application/x-www-form-urlencoded)
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
id_client | integer | ja | Ihre Mailpro-Client-ID |
api_key | string | ja | Ihr API-Schlüssel (GUID) |
number_id | integer | ja | ID des zu aktualisierenden Telefonnummerneintrags (aus /phone/list) |
number | string | Neue Telefonnummer. Akzeptiert +41…, 0041… oder 41… mit oder ohne Trennzeichen. Siehe Phone number format in der API-Beschreibung. | |
firstname | string | Neuer Vorname des Kontakts | |
lastname | string | Neuer Nachname des Kontakts |
Antworten
| Code | Beschreibung |
|---|---|
200 | Telefonnummerneintrag erfolgreich aktualisiert |
400 | number_id fehlt |
401 | Ungültige Anmeldedaten |
/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
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
Anfragetext (application/x-www-form-urlencoded)
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
id_client | integer | ja | Ihre Mailpro-Client-ID |
api_key | string | ja | Ihr API-Schlüssel (GUID) |
number_id | integer | ja | ID des zu löschenden Telefonnummerneintrags (aus /phone/list) |
Antworten
| Code | Beschreibung |
|---|---|
200 | Telefonnummer erfolgreich entfernt |
400 | number_id fehlt |
401 | Ungültige Anmeldedaten |
Überprüfen Sie das verbleibende SMS-Credit-Guthaben für Ihr Konto (getrennt vom monatlichen API-Anfragekontingent — siehe /account/limits).
/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
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
Antworten
| Code | Beschreibung |
|---|---|
200 | Credit-Guthaben erfolgreich zurückgegeben |
401 | Ungültige Anmeldedaten |
Beispiel 200
{
"TotalCredits": 5000
}
Durchsuchen Sie das vollständige Protokoll vergangener SMS-Kampagnen.
/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
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
Antworten
| Code | Beschreibung |
|---|---|
200 | Historienliste erfolgreich zurückgegeben |
401 | Ungültige Anmeldedaten |
Beispiel 200
{
"Items": [
{
"Id": 583294,
"DateSent": "2026-07-17T18:56:39.813",
"Message": "Your verification code is 8472",
"Charge": 3,
"Parts": 1
}
]
}
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.
/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:
id_client (Ganzzahl) — Ihre Mailpro-Client-IDapi_key (Zeichenkette) — Ihr API-Schlüsselid_list (Ganzzahl) — ID der Ziel-Kontaktlistefile (binär) — die hochzuladende CSV- oder XLSX-DateiOptional:
webhook_url (Zeichenkette) — HTTPS-URL, die nach Abschluss der Verarbeitung aufgerufen wird. Empfängt einen JSON-Payload mit dem Endstatus (success / failed) und der Anzahl importierter / übersprungener / ungültiger Zeilen.Dateiformat:
UTF-8-kodiertPhone oder PhoneNumber sein — Groß-/Kleinschreibung wird ignoriert)+41791234567OAuth-Scope : sms:contacts:write
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
Anfragetext (multipart/form-data)
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
id_list | integer (int64) | ja | ID der Ziel-Kontaktliste |
file | string (binary) | ja | CSV- oder XLSX-Datei (UTF-8, max. 50 MB) |
webhook_url | string (uri) | Callback-URL, die nach Abschluss der Verarbeitung aufgerufen wird |
Antworten
| Code | Beschreibung |
|---|---|
200 | Datei akzeptiert und in die Warteschlange gestellt |
400 | Keine Datei hochgeladen oder id_list fehlt |
401 | Ungültige Anmeldedaten |
500 | Server- oder Speicherfehler |
Beispiel 200
{
"Result": "OK",
"ImportJobId": 15,
"InternalName": "230575-20260420142616-phones.csv"
}
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.
/webhooksWebhooks auflisten
Gibt jeden auf dem authentifizierten Konto konfigurierten Webhook zurück.
Antworten
| Code | Beschreibung |
|---|---|
200 | Array von Webhooks |
401 | Ungü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
}
/webhooksEinen 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)
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
url | string (uri) | ja | HTTPS-Endpoint (HTTP wird in der Produktion abgelehnt) |
events | array of string | ja | Liste der Ereignistypen, die abonniert werden sollen (siehe Katalog oben). Verwenden Sie ["*"], um alle Ereignisse dieser API zu abonnieren. |
description | string |
Beispiel
{
"url": "https://example.com/hooks/mailpro",
"events": [
"sms.delivered",
"sms.failed"
],
"description": "Slack-Integration"
}
Antworten
| Code | Beschreibung |
|---|---|
201 | Webhook erstellt — secret wird nur hier zurückgegeben |
400 | Ungültige URL, Ereignisliste oder Limit überschritten |
401 | Ungü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"
}
/webhooks/{id}Einen Webhook abrufen
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
id | path | integer (int64) | ja |
Antworten
| Code | Beschreibung |
|---|---|
200 | Der Webhook |
404 | Webhook nicht gefunden |
/webhooks/{id}Einen Webhook aktualisieren
Teilaktualisierung — nur die gesendeten Felder werden geändert.
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
id | path | integer (int64) | ja |
Anfragetext (application/json)
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
url | string (uri) | ||
events | array of string | ||
description | string | ||
isActive | boolean | Auf true setzen, um einen automatisch deaktivierten Webhook wieder zu aktivieren, sobald Ihr Endpoint repariert ist. |
Antworten
| Code | Beschreibung |
|---|---|
200 | Aktualisierter Webhook |
400 | Ungültiger Payload |
404 | Webhook nicht gefunden |
/webhooks/{id}Einen Webhook löschen
Löscht den Webhook und seine vollständige Zustellhistorie dauerhaft.
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
id | path | integer (int64) | ja |
Antworten
| Code | Beschreibung |
|---|---|
204 | Gelöscht |
404 | Webhook nicht gefunden |
/webhooks/{id}/testEin 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
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
id | path | integer (int64) | ja |
Anfragetext (application/json)
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
eventType | string |
Beispiel
{
"eventType": "ping"
}
Antworten
| Code | Beschreibung |
|---|---|
202 | Ereignis zur Zustellung in die Warteschlange gestellt |
404 | Webhook nicht gefunden |
Beispiel 202
{
"deliveryId": 1234,
"eventId": "evt_8f3a9b2c4d1e5f6789abcdef01234567",
"eventType": "ping"
}
/webhooks/{id}/rotate-secretHMAC-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
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
id | path | integer (int64) | ja |
Antworten
| Code | Beschreibung |
|---|---|
200 | Neues Geheimnis (einmal sichtbar) |
404 | Webhook nicht gefunden |
Beispiel 200
{
"secret": "whsec_XyzA9876BcdE5432FghI1098JklM7654NopQ"
}
/webhooks/{id}/deliveriesZustellversuche 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
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
id | path | integer (int64) | ja | |
limit | query | integer | ||
cursor | query | integer (int64) | Paginierungs-Cursor (= zuletzt gesehene Delivery-ID). Gibt Zustellungen mit id < cursor zurück. |
Antworten
| Code | Beschreibung |
|---|---|
200 | Array von Zustellversuchen (neueste zuerst) |
404 | Webhook nicht gefunden |
/webhooks/{id}/deliveries/{deliveryId}/replayEine 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
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
id | path | integer (int64) | ja | |
deliveryId | path | integer (int64) | ja |
Antworten
| Code | Beschreibung |
|---|---|
202 | Replay in die Warteschlange gestellt |
404 | Webhook oder Zustellung nicht gefunden |