Interaktive Dokumentation · Entwicklerportal · OpenAPI-Spezifikation · EN · FR · DE · IT · PT · ES
Basis-URL : https://api.mailpro.com/v3
Die Mailpro™ CRM API v3 ermöglicht es Ihnen, Kontakte, Listen, Tags, benutzerdefinierte Felder, E-Mail-Vorlagen und Kampagnen programmatisch zu verwalten — und sowohl Massen-Marketing-E-Mails als auch einzelne transaktionale E-Mails sowie SMS zu versenden.
Alle Endpunkte (außer POST /token und den OAuth-Endpunkten) akzeptieren drei Authentifizierungsmethoden. Verwenden Sie diejenige, die zu Ihrem Stack passt.
POST /token. Sieht wie OAuth aus, ist jedoch an einen einzelnen Kontozugang gebunden und nicht scope-basiert.> Legacy Bearer JWT und IdClient+ApiKey sind nicht scope-gesteuert — sie behalten > vollen Zugriff auf jeden Endpunkt, den sie bereits erreichen konnten. Nur OAuth 2.0 > Access Tokens unterliegen den endpunktspezifischen Scope-Prüfungen, die in jeder > nachstehenden Operation aufgeführt sind (ein Token, dem der Scope fehlt, erhält 403 insufficient_scope).
Mailpro betreibt einen OAuth 2.0 Authorization Server für sämtliche APIs, bereitgestellt über eine einzige versionsneutrale Oberfläche: https://api.mailpro.com/oauth/. Ein Server, ein Token — derselbe Access Token funktioniert über CRM v3, Email v2 und SMS hinweg. Welche Endpunkte ein Token aufrufen darf, wird durch die Scopes des Tokens gesteuert, nicht durch die API-Basis-URL, die Sie aufrufen. Es gibt keinen versionsspezifischen OAuth-Endpunkt (kein /v3/oauth, /v2/oauth oder /sms/oauth).
| Endpunkt | URL |
|---|---|
| Authorize | GET https://api.mailpro.com/oauth/authorize |
| Token / Refresh | POST https://api.mailpro.com/oauth/token |
| JWKS (Signaturen verifizieren) | GET https://api.mailpro.com/oauth/.well-known/jwks |
| Discovery | GET https://api.mailpro.com/oauth/.well-known/openid-configuration |
Issuer (der iss-Claim in jedem Token): https://api.mailpro.com/oauth/.
Unterstützte Grants
authorization_code + PKCE (code_challenge_method=S256 ist verpflichtend) — der Browser-Einwilligungsflow „Mailpro verbinden". Liefert einen Access Token und ein rotierendes Refresh Token zurück.client_credentials — Maschine-zu-Maschine, ohne Benutzer. Liefert ausschließlich einen Access Token zurück.refresh_token — tauschen Sie ein Refresh Token gegen ein neues Access-/Refresh-Paar ein. Refresh Tokens rotieren: jede Verwendung invalidiert das alte.Token-Lebensdauern
| Token | TTL |
|---|---|
| Access Token (RS256 JWT) | 20 Minuten |
| Refresh Token (gleitend, Einmalverwendung) | 30 Tage |
| Authorization Code | 60 Sekunden |
Authorization Code + PKCE — Schritt für Schritt
code_verifier (43–128 zufällige Zeichen) und code_challenge = base64url(sha256(code_verifier)). GET https://api.mailpro.com/oauth/authorize
?response_type=code
&client_id=YOUR_CLIENT_ID
&redirect_uri=https://yourapp.example.com/callback
&scope=contacts:read contacts:write
&state=RANDOM_CSRF_TOKEN
&code_challenge=CODE_CHALLENGE
&code_challenge_method=S256
?code=…&state=…. Verifizieren Sie state (CSRF-Schutz). POST https://api.mailpro.com/oauth/token
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code&code=AUTH_CODE
&redirect_uri=https://yourapp.example.com/callback
&client_id=YOUR_CLIENT_ID&code_verifier=CODE_VERIFIER
{ "access_token": "eyJ…", "token_type": "Bearer",
"expires_in": 1200, "refresh_token": "…" }
Authorization: Bearer ACCESS_TOKEN.grant_type=refresh_token und speichern Sie das neue Refresh Token (das alte ist nun ungültig).client_credentials
POST https://api.mailpro.com/oauth/token
Content-Type: application/x-www-form-urlencoded
grant_type=client_credentials&client_id=YOUR_CLIENT_ID
&client_secret=YOUR_CLIENT_SECRET&scope=contacts:read email:send
Derselbe OAuth Access Token wird auch von den APIs Email v2 (api.mailpro.com/v2) und SMS (api.mailpro.com/sms) akzeptiert — einmal authentifizieren, jede beliebige API aufrufen. Vollständiger Scope-Katalog: siehe OAuth 2.0 Scopes unten.
Der schnellste Weg, OAuth auszuprobieren, ist der client_credentials-Grant (Server-zu-Server, kein Browser, kein Benutzer). Sie benötigen ein client_id / client_secret-Paar (fragen Sie Ihren Mailpro-Ansprechpartner oder erstellen Sie eines unter Einstellungen → API-Zugriff). Ersetzen Sie die Platzhalter unten — committen Sie niemals ein echtes Secret.
1. Einen Access Token abrufen
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=contacts:read"
{ "access_token": "eyJhbGciOiJSUzI1Ni…", "token_type": "Bearer",
"expires_in": 1200 }
2. Einen Ressourcen-Endpunkt mit dem Token aufrufen
curl https://api.mailpro.com/v3/List \
-H "Authorization: Bearer eyJhbGciOiJSUzI1Ni…"
Derselbe Token funktioniert auch auf Email v2 (…/v2/…) und SMS (…/sms/…) — solange er den von jedem Endpunkt benötigten Scope enthält. Ein Token, dem der erforderliche Scope fehlt, wird mit 403 insufficient_scope abgewiesen.
Interaktives „Mailpro verbinden" (authorization_code + PKCE) — wenn Sie im Auftrag eines *Benutzers* handeln (Zapier/Make/n8n, Partner-Apps): leiten Sie den Benutzer weiter zu GET https://api.mailpro.com/oauth/authorize mit response_type=code, client_id, redirect_uri, scope, state, code_challenge und code_challenge_method=S256; der Benutzer stimmt zu; Sie tauschen den zurückgegebenen code an POST https://api.mailpro.com/oauth/token mit dem passenden code_verifier ein. Vollständige Anleitung oben; Scopes in OAuth 2.0 Scopes unten.
> Tokens sind RS256 JWTs — Access Tokens leben 20 Minuten, Refresh > Tokens 30 Tage (gleitend, Einmalverwendung: jede Erneuerung rotiert den Token). > Verifizieren Sie Signaturen gegen das JWKS unter > https://api.mailpro.com/oauth/.well-known/jwks und validieren Sie den Scope > jeder Anfrage gegen die nachstehende Scope-Matrix.
Authorization: Bearer <access_token>
Holen Sie sich einen Token über POST /token (siehe unten). Standardmäßig 30 Tage gültig; verwenden Sie grant_type=refresh_token, um ohne erneute Authentifizierung zu erneuern. Einfacher einzurichten, aber an einen einzelnen Kontozugang gebunden und kann nicht scope-basiert oder an Dritte weitergegeben werden — bevorzugen Sie OAuth 2.0 für jede installierbare Integration.
Senden Sie Ihre Client-ID und Ihren API-Schlüssel als HTTP-Header (bevorzugt) oder als Query-Parameter:
IdClient: 12345
ApiKey: a1b2c3d4-e5f6-7890-abcd-ef1234567890
Dieselben Zugangsdaten wie bei den v2- / SMS-APIs — per Copy-Paste aus Einstellungen → API-Zugriff. Kein Token-Austauschschritt. Die Header-Form wird empfohlen, da URLs von IIS / Cloudflare / Proxys protokolliert werden.
POST /token
Content-Type: application/x-www-form-urlencoded
grant_type=password&username=YOUR_USERNAME&password=YOUR_API_KEY
username — Ihr Mailpro-Benutzername (E-Mail)password — Ihr API-Schlüssel (GUID), zu finden unter Einstellungen → API-ZugriffPOST /token
Content-Type: application/x-www-form-urlencoded
grant_type=client_credentials&client_id=YOUR_CLIENT_ID
> Der von POST /v3/token ausgestellte Token ist auch auf der Email v2 API > (api.mailpro.com/v2) und der SMS API (api.mailpro.com/sms) gültig. Einmal authentifizieren, > jede beliebige API aufrufen.
Wenn Ihre App einen OAuth Access Token anfordert, deklariert sie eine Reihe von Scopes — Berechtigungen, die genau definieren, was der Token tun darf. Der Benutzer sieht eine allgemein verständliche Beschreibung jedes angeforderten Scopes auf dem Einwilligungsbildschirm. Scopes sind im scope-Parameter durch Leerzeichen getrennt (scope=contacts:read email:send). Fordern Sie nur an, was Sie benötigen.
Scopes folgen dem Muster <resource>:<action> und sind hierarchisch unabhängig — contacts:write impliziert nicht contacts:read; fordern Sie bei Bedarf beide an.
| Scope | Erlaubt |
|---|---|
contacts:read | Anzeigen Ihrer Kontakte, Listen, Tags, Segmente und benutzerdefinierten Felder. |
contacts:write | Erstellen, Bearbeiten und Löschen Ihrer Kontakte, Listen, Tags und benutzerdefinierten Felder. |
email:send | Versenden transaktionaler und kampagnenbezogener E-Mails in Ihrem Auftrag. |
email:read | Anzeigen von Zustellstatistiken, Öffnungen, Klicks und Bounce-Historie. |
email:templates:read | Anzeigen Ihrer E-Mail-Vorlagen (Betreff, HTML-, Plain-Text-Body). |
email:templates:write | Erstellen, Bearbeiten und Löschen Ihrer E-Mail-Vorlagen. |
sms:send | Versenden transaktionaler und kampagnenbezogener SMS-Nachrichten in Ihrem Auftrag. |
sms:read | Anzeigen des SMS-Guthabens und der Nachrichtenhistorie. |
sms:contacts:read | Anzeigen Ihres SMS-Telefonbuchs. |
sms:contacts:write | Erstellen, Bearbeiten und Löschen von Einträgen in Ihrem SMS-Telefonbuch. |
webhooks:manage | Abonnieren, Bearbeiten und Entfernen von Webhook-Endpunkten für Ihr Konto. |
account:read | Anzeigen Ihrer Konto-Credits, Limits und des Abonnementstatus. |
Scope-Prüfungen erfolgen live und werden für OAuth-ausgestellte Tokens pro Endpunkt erzwungen (Legacy-Authentifizierung ist ausgenommen). Jede Operation in dieser Referenz listet ihren erforderlichen Scope unter Authorization auf. Zusammenfassung für die CRM v3-Oberfläche:
| Endpunkte | Erforderlicher Scope |
|---|---|
GET /Contact/{id}, GET /List, GET /List/{id}, GET /List/{id}/Contact, GET /List/{listId}/Unsubscribers, GET /Tag, GET /Tag/{id}, GET /Tag/{id}/Contact, GET /Segment, Segment-Zugehörigkeitsprüfung | contacts:read |
POST /Contact, POST /Contact/Multiple, PUT/DELETE /Contact/{id}, Tag oder Liste an einem Kontakt hinzufügen/entfernen, POST/PUT/DELETE /List, POST/PUT/DELETE /Tag | contacts:write |
> Endpunkte in dieser Spezifikation, die nicht oben aufgeführt sind (z. B. GET /Field, > Kampagnen, transaktionaler Versand, SMS-Versand, Nachrichtenvorlagen, Kontoinformationen), > sind heute mit jedem gültigen Token erreichbar — sie sind auf der CRM v3-Oberfläche > noch nicht scope-gesteuert. Die Email v2- und SMS-APIs schützen zusätzlich ihre eigenen > Send- / Template- / Contacts- / Account-Endpunkte (siehe entsprechende Spezifikationen).
Eine Scope-Ablehnung liefert 403 mit { "error": "insufficient_scope", "required_scope": "…" } (RFC 6750 §3.1).
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).includeBodyHTML=true) liefern standardmäßig 10 Einträge pro Seite.200 mit einer leeren Liste []. 404 bedeutet, dass die Ressource selbst (Liste, Tag, Segment, Kampagne…) nicht existiert.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.
Verstöße gegen Geschäftsregeln liefern HTTP 406 mit einem JSON-Body:
{ "Message": "Contact cannot be created. Email cannot be empty." }
Häufige 406-Gründe:
Email cannot be empty — E-Mail ist erforderlichEmail has an invalid format — keine gültige E-Mail-AdresseA contact already exist with the same Email — Verstoß gegen die E-Mail-EindeutigkeitThe email address was unsubscribed permanently — Adresse auf der SperrlisteThe email address has identified has a hard bounce — Adresse ist gebouncedThe email address has identified has a spam trap — Spam-Falle erkanntAt least one List is necessary — Kontakte müssen mindestens einer Liste angehörenOne or more lists have reached the contact limit — maximal 1 Mio. Kontakte pro ListeInvalid Phone Number — Formatfehler bei der TelefonnummerInvalid country code for Phone Number — nicht unterstützter LändervorwahlLength exceeded for Phone Number (12) — Telefonnummer zu lang| Code | Bedeutung |
|---|---|
400 | Fehlerhafte Anfrage (ungültiges JSON, Nachricht über dem SMS-Teil-Limit) |
401 | Fehlende, ungültige oder abgelaufene Anmeldedaten |
402 | Nicht genügend Guthaben für den Versand |
403 | Durch Ihre Anmeldedaten erlaubt, aber abgelehnt — Konto für SMS-Versand gesperrt |
404 | Das referenzierte Objekt existiert nicht (Kontakt, Liste, Tag, Feld, Kampagne) |
406 | Verstoß gegen eine Kontakt-Geschäftsregel (siehe Liste oben) |
422 | Eingabe durch Validierung abgelehnt oder Kontolimit erreicht |
> Geändert: Einige dieser Fälle gaben früher 404 zurück. Unzureichendes > Guthaben gibt jetzt 402 zurück, Validierungsfehler und Kontolimits geben > 422 zurück, und ein für SMS gesperrtes Konto gibt 403 zurück. 404 > wird jetzt nur noch für „dieses Objekt existiert nicht" verwendet, konsistent > mit der SMS-API. Wenn Ihre Integration in diesen Fällen auf 404 verzweigt, > aktualisieren Sie sie auf die obigen Codes.
Telefonnummern werden automatisch normalisiert. Sie können diese in vielen Formaten senden — 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 (nicht entfernt) |
+33 6-12-34-56-78 — + mit Bindestrichen | tel=0041794849980 — zusätzliche Zeichen |
41794849980 — reine Ziffern | 1234567 — zu kurz (< 8 Ziffern) |
Regeln:
+, 00 oder kein Präfix0)-, Punkt ., Schrägstrich /, Klammern ( ), Unterstrich _, NBSP=, ;, + innerhalb der Nummer usw.) → abgelehnt41794849980)v3 Contact-Besonderheiten: das Feld phone_number auf einem Contact ist derzeit nach Normalisierung auf 12 Ziffern begrenzt (gegenüber 15 für die eigenständigen SMS- Endpunkte). Nummern aus Ländern wie Deutschland (13), Brasilien (13) oder Italien mobil (12–13) können auf /v3/Contact mit Length exceeded for Phone Number (12) abgelehnt werden. Diese Legacy-Beschränkung kann in einer zukünftigen Version gelockert werden.
| Ressource | Limit |
|---|---|
| Tags pro Konto | 1.000 |
| Listen pro Konto | 1.000 |
| Benutzerdefinierte Felder pro Konto | 50 |
| Monatliche API-Anfragen pro Konto | 50.000 (5× E-Mail-Credits des Abonnements) |
Jede einzeln versendete E-Mail (POST /Send/Mail, die Email API v2, das SMTP-Relay oder eine Automatisierung) erhält eine Kennung. Sie kann verfolgt werden, bis der Server des Empfängers sie annimmt oder ablehnt. Kampagnen sind hier nicht abgedeckt: Nutzen Sie die Statistiken.
POST /Send/Mail enthält id_single_send.email.delivered und email.bounced senden den endgültigen Status an Ihren Server, sobald er feststeht – ganz ohne Abfragen.GET /Send/{id}/Status liefert den aktuellen Status (Tabelle unten).status | Bedeutung | Endgültig? |
|---|---|---|
queued | Angenommen, wartet auf den Versand. | nein |
scheduled | Für später geplant (date_planned). | nein |
sent | Von unseren Servern übergeben, noch keine Antwort des Empfängerservers. | nein |
delivered | Vom Empfängerserver angenommen (diag_code = seine SMTP-Antwort). | ja |
bounced | Abgelehnt. bounce_type: hard = ungültige Adresse oder endgültige Ablehnung; soft = Ablehnung nach erneuten Versuchen (Postfach voll, Server nicht erreichbar …). | ja |
not_found | Unbekannte Kennung oder Kennung, die nicht zu Ihrem Konto gehört. | ja |
Abfragen ohne Endlosschleife
delivered erscheint etwa 5 Minuten nach der Übergabe.Retry-After (die Wartezeit in Sekunden), und der Aufruf zählt nicht für Ihr Kontingent.scheduled: Vor date_planned ist keine Abfrage nötig.Die Status werden 365 Tage aufbewahrt.
Mailpro™ kann Ihren Server in Echtzeit benachrichtigen, wenn bestimmte Ereignisse in Ihrem Konto auftreten (ein Kontakt wird erstellt, eine E-Mail wird zugestellt, eine Kampagne endet usw.). 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 /Webhook. Die Antwort enthält ein secret, das einmalig angezeigt wird (Stripe-/GitHub-Stil) — speichern Sie es.secret (Snippets unten).> ⏱ Aktivierungsverzögerung — nachdem Sie einen Webhook erstellt, aktualisiert oder gelöscht haben, dauert es > bis zu 10 Minuten, bis sich die Änderung über die Mailpro-API-Server verbreitet. > Während dieses Zeitfensters stimmen Ereignisse möglicherweise noch nicht mit Ihrem neuen Abonnement überein > (oder stimmen ggf. weiterhin mit einem gerade entfernten überein). Dies ist die Zeit, die erforderlich ist, um > den In-Memory-Abonnement-Cache auf jeder API-Instanz zu aktualisieren.
Alle Ereignisse teilen sich einen gemeinsamen Envelope:
{
"id": "evt_8f3a9b2c4d1e5f6789abcdef01234567",
"type": "contact.created",
"created": 1748194800,
"apiVersion": "v3",
"account": { "id": 12345, "name": "ACME Corp" },
"data": { "id": "...", "email": "[email protected]", "...": "..." }
}
| Feld | Format | Beschreibung |
|---|---|---|
id | evt_ + 32 Hex-Zeichen | Eindeutige Ereignis-ID — verwenden Sie sie auf Ihrer Seite als Idempotenzschlüssel. |
type | <domain>.<verb> | Kanonischer Ereignistyp (z. B. email.delivered, contact.created). |
created | Unix-Sekunden UTC | In der HMAC-Signatur enthalten. |
apiVersion | "v3" | Welche Mailpro-API das Ereignis veröffentlicht hat. |
account.id | int | Ihre Mailpro-Client-ID. |
account.name | string | Ihr Kontoname (nützlich für clientseitiges Debugging). |
data | object | Ereignis-Payload — die Form hängt vom type ab (siehe Katalog unten). |
| Ereignis | Auslöser | data-Form |
|---|---|---|
ping | Test über POST /Webhook/{id}/test | { message } |
contact.created | POST /Contact | { id, email, firstName, lastName, createdAt } |
contact.updated | PUT /Contact/{id} | { id, email, firstName, lastName, updatedAt, changes } |
contact.deleted | DELETE /Contact/{id} | { id, email, deletedAt } |
list.contact_added | Kontakt zu Liste hinzugefügt | { listId, listName, contactId, contactEmail, addedAt } |
list.contact_removed | Kontakt von Liste entfernt | { listId, listName, contactId, contactEmail, removedAt } |
tag.applied | Tag auf Kontakt angewendet | { tag, contactId, contactEmail, appliedAt } |
tag.removed | Tag entfernt | { tag, contactId, contactEmail, removedAt } |
segment.matched | Kontakt tritt in ein Segment ein | { segmentId, segmentName, contactId, contactEmail, matchedAt } |
email.processed | Versand von der Pipeline akzeptiert | { messageId, email, campaignId, processedAt } |
email.delivered | Eine einzelne E-Mail wurde vom Empfängerserver angenommen — API v2/v3, SMTP oder Automation (nicht Kampagnen). Aus dem PowerMTA-Zustellstrom ausgelöst. | { messageId, email, idSending, sendingType, diagCode, deliveredAt } |
email.opened | Tracking-Pixel aufgerufen | { messageId, email, campaignId, openedAt, ip, userAgent } |
email.clicked | Klick auf getrackten Link | { messageId, email, campaignId, clickedAt, url, ip, userAgent } |
email.bounced | Hard- oder Soft-Bounce | { messageId, email, campaignId, bouncedAt, bounceType, reason } |
email.spam_report | FBL-Beschwerde | { messageId, email, campaignId, reportedAt } |
email.unsubscribed | Opt-out-Link geklickt | { messageId, email, campaignId, unsubscribedAt } |
email.dropped | Vor dem Versand abgelehnt | { messageId, email, campaignId, droppedAt, reason } |
campaign.started | Versand beginnt | { campaignId, name, totalRecipients, startedAt } |
campaign.finished | Alle Empfänger verarbeitet | { campaignId, name, totalSent, totalFailed, finishedAt } |
import.started | Import-Job gestartet | { importId, fileName, totalRows, startedAt } |
import.progress | Bei 25/50/75 % | { importId, fileName, processedRows, totalRows, progressPct } |
import.completed | Import OK | { importId, fileName, totalRows, addedCount, updatedCount, errorCount, completedAt } |
import.failed | Schwerwiegender Fehler während des Imports | { importId, fileName, errorMessage, failedAt } |
Abonnieren Sie alle Ereignisse dieser API, indem Sie ["*"] im Array events übergeben.
Jeder POST enthält einen X-Mailpro-Signature-Header:
X-Mailpro-Signature: t=1748194800,v1=7f9ac2b6e4d1c8a3...
X-Mailpro-Event-Id: evt_8f3a9b2c4d1e5f6789abcdef01234567
X-Mailpro-Event-Type: contact.created
X-Mailpro-Attempt: 1
So verifizieren Sie:
t und v1 aus dem Header.|now - t| > 300 (5-minütiges 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 | Verzögerung 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 Fehlschlägen an demselben Webhook wird er automatisch deaktiviert (isActive: false) und Sie erhalten eine Benachrichtigungs-E-Mail. Aktivieren Sie ihn mit PUT /Webhook/{id} erneut, sobald Ihr Endpunkt repariert ist.
Wir betrachten Ihren Webhook nur dann als erfolgreich, wenn Sie einen Status im Bereich 200–299 zurückgeben. Jeder 3xx/4xx/5xx oder ein Timeout (> 10 Sek.) zählt als Fehlschlag und löst Wiederholungsversuche aus. Falls Ihr Endpunkt dauerhaft tot ist, geben Sie explizit 410 Gone zurück — Wiederholungsversuche finden weiterhin statt, aber der Grund des Fehlschlags ist in Ihrem Zustellprotokoll klarer.
| Limit | Wert |
|---|---|
| Webhooks pro Konto | 20 |
| Abonnierte Ereignisse pro Webhook | 50 |
| Maximale Payload-Größe | 256 KB |
| HTTP-Timeout pro Versuch | 10 Sekunden |
| Aufbewahrung der Zustellhistorie | 30 Tage |
Beziehen Sie ein Bearer-JWT-Token, um sich für alle anderen API-Aufrufe zu authentifizieren. Der Token-Endpunkt akzeptiert mehrere Grant-Typen: password, refresh_token, client_credentials und Drittanbieter-Integrationen (zapier, automateio, microsoft-flow).
/tokenAccess-Token abrufen
Bezieht ein Bearer-JWT-Token mithilfe von Client-Anmeldedaten. Übergeben Sie das zurückgegebene access_token als Authorization: Bearer <token> in allen nachfolgenden Anfragen.
| Grant-Typ | Anwendungsfall |
|---|---|
password | Standardintegration — Benutzername + API-Schlüssel |
refresh_token | Erneuern eines ablaufenden Access-Tokens ohne erneute Authentifizierung |
client_credentials | Server-zu-Server nur mit Client-ID |
zapier / automateio / microsoft-flow | Integrationen mit Drittanbieter-Plattformen |
Verwenden Sie grant_type=refresh_token, um ein frisches Access-Token ohne erneute Authentifizierung zu erhalten — Ihr SDK sollte dies automatisch tun, wenn das Access-Token kurz vor dem Ablauf steht (typische Strategie: Erneuerung, wenn weniger als 24 h verbleiben).
Auch bei einer Gültigkeitsdauer von 30 Tagen kann jede Person, die in den Besitz eines access_token kommt, Ihr Konto bis zu dessen Ablauf imitieren. Speichern Sie Tokens in einem serverseitigen Secret-Store (Vault, AWS Secrets Manager, Azure Key Vault, Umgebungs- variablen auf einem gehärteten Host). Niemals ein Token einbetten in:
Wenn ein Token offengelegt wurde, widerrufen Sie es über die Einstellungen Ihres Mailpro-Kontos und fordern Sie ein neues an.
Anfragetext (application/x-www-form-urlencoded)
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
grant_type | string: password, refresh_token, client_credentials, zapier, automateio, microsoft-flow | ja | Authentifizierungs-Grant-Typ |
username | string | Ihr Mailpro-Benutzername (E-Mail). Erforderlich für den password-Grant. | |
password | string | Ihr Mailpro-API-Schlüssel (GUID-Format). Erforderlich für den password-Grant. | |
refresh_token | string | Vorheriges Refresh-Token. Erforderlich für den refresh_token-Grant. | |
client_id | string | Ihre Mailpro-Client-ID (Ganzzahl). Erforderlich für den client_credentials-Grant. |
Antworten
| Code | Beschreibung |
|---|---|
200 | Token erfolgreich ausgestellt |
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."
}
Rufen Sie das Kontoprofil, den Guthabenstand und Abonnementdetails ab.
/Account/MeKontodetails abrufen
Gibt die Profildetails und Einstellungen des authentifizierten Mailpro-Kontos zurück.
Antworten
| Code | Beschreibung |
|---|---|
200 | Kontodetails erfolgreich zurückgegeben |
401 | Ungültiges oder abgelaufenes Token |
/Account/CreditsGuthabenstand abrufen
Gibt das verbleibende E-Mail- und SMS-Guthaben des Kontos zurück.
Antworten
| Code | Beschreibung |
|---|---|
200 | Guthabenstand erfolgreich zurückgegeben |
401 | Ungültiges oder abgelaufenes Token |
Beispiel 200
{
"email_credits": 48500,
"sms_credits": 1200
}
/Account/SubscriptionEndDateAbonnement-Enddatum abrufen
Gibt das Ablaufdatum des aktuellen Mailpro-Abonnements zurück.
Antworten
| Code | Beschreibung |
|---|---|
200 | Abonnement-Enddatum erfolgreich zurückgegeben |
401 | Ungültiges oder abgelaufenes Token |
/Account/LimitsMonatliches API-Kontingent abrufen
Gibt das monatliche API-Anfragekontingent für den authentifizierten Client zurück.
Kontingentberechnung: Das Limit wird aus den E-Mail- Abonnementguthaben kalibriert (typischerweise subscription_credits × 5). Für einen Tarif mit 10.000 E-Mails/Monat ergibt dies ein monatliches Budget von 50.000 Anfragen. Die exakte Zuordnung wird vom Abrechnungsjob bei der Abonnementregistrierung festgelegt und am Jahrestag des Abonnements zurückgesetzt (nicht am
Was Guthaben verbraucht:
v2, v3 oder sms (jeder Aufruf = 1 Guthaben, unabhängig vom Ergebnis — sowohl 2xx als auch die meisten fachlichen 4xx-Fehler zählen).contact.created, das an Ihren abonnierten Webhook ausgelöst wird = 1 Guthaben zusätzlich zum auslösenden API-Aufruf).Was KOSTENLOS ist (verbraucht kein Guthaben):
/health-Endpunkte (Monitoring).401 (Authentifizierungsfehler), 403 (verboten) oder 429 (Rate-Limit überschritten) fehlschlagen.Antworten
| Code | Beschreibung |
|---|---|
200 | Kontingent-Snapshot |
401 | Ungültiges oder abgelaufenes Token |
404 | Für dieses Konto wurde kein Kontingent-Datensatz gefunden (neu erstelltes Konto, das noch nie einen API-Aufruf getätigt hat; der Eintrag wird bei der ersten authentifizierten Anfrage angelegt). |
Vollständiges CRUD für CRM-Kontakte. Kontakte speichern eine E-Mail-Adresse, optional eine Telefonnummer, Werte benutzerdefinierter Felder und gehören einer oder mehreren Listen an. Sie können auch mit Tags versehen werden. Kontakt-IDs sind UUIDs.
/ContactKontakt erstellen
Erstellt einen neuen CRM-Kontakt mit optionalen benutzerdefinierten Feldern, Listenzuweisungen und Tags.
Erforderlich:
email — muss kontoübergreifend eindeutig seinlists — mindestens eine Listenzuweisung ist verpflichtendTelefonnummern akzeptieren +41…, 0041… oder 41… mit oder ohne Trennzeichen (maximal 12 Ziffern für Kontakte — siehe Telefonnummernformat in der API-Beschreibung).
Benutzerdefinierte Felder werden über ihre id identifiziert (aus GET /Field). Die Werte werden gegen den Typ des Felds validiert.
OAuth-Scope : contacts:write
Anfragetext (application/json)
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
email | string | ja | E-Mail-Adresse des Kontakts (erforderlich, muss eindeutig sein) |
phone_number | string | Telefonnummer — akzeptiert +41…, 0041… oder 41… mit oder ohne Trennzeichen.
Muss mit einem gültigen Ländercode beginnen. Maximal 12 Ziffern für Kontakte (siehe
Telefonnummernformat in der API-Beschreibung für die vollständigen Regeln).
| |
lists | array of ListRef | ja | Listen, denen dieser Kontakt zugewiesen werden soll. Mindestens eine Liste ist erforderlich. |
tags | array of TagRef | Tags, die diesem Kontakt zugewiesen werden sollen (optional) | |
custom_fields | array of FieldValue | Werte benutzerdefinierter Felder für diesen Kontakt (optional) |
Beispiel
{
"email": "[email protected]",
"phone_number": "+41791234567",
"lists": [
{
"id": 101
}
],
"tags": [
{
"id": 5
}
],
"custom_fields": [
{
"id": 1,
"value": "Alice"
},
{
"id": 2,
"value": "Dupont"
}
]
}
Antworten
| Code | Beschreibung |
|---|---|
200 | Kontakt erfolgreich erstellt |
400 | Ungültiges E-Mail-Format |
401 | Ungültiges oder abgelaufenes Token |
406 | Verstoß gegen Geschäftsregel (siehe Beschreibung für die vollständige Liste) |
Beispiel 406
{
"Message": "Contact cannot be created. A contact already exist with the same Email"
}
/Contact/MultipleKontakte importieren (Massenvorgang)
Erstellt bis zu 1.000 Kontakte in einer einzigen Anfrage für einen effizienten Massenimport. Die Antwort enthält eine Liste der erfolgreich erstellten Kontakte sowie eine Fehlerliste für Kontakte, die nicht erstellt werden konnten (z. B. doppelte E-Mail-Adresse, ungültige Daten).
Hinweis: In Massenimporten verwendete Listen und Tags dürfen nicht mit aktiven Automatisierungs-Workflows verknüpft sein. Andernfalls wird der gesamte Import mit HTTP 406 abgelehnt.
OAuth-Scope : contacts:write
Anfragetext (application/json)
Beispiel
[
{
"email": "[email protected]",
"lists": [
{
"id": 101
}
],
"custom_fields": [
{
"id": 1,
"value": "Alice"
}
]
},
{
"email": "[email protected]",
"lists": [
{
"id": 101
}
],
"custom_fields": [
{
"id": 1,
"value": "Bob"
}
]
}
]
Antworten
| Code | Beschreibung |
|---|---|
200 | Massenimport abgeschlossen (prüfen Sie das errors-Array auf Teilfehler) |
400 | Ungültige Eingabe |
401 | Ungültiges oder abgelaufenes Token |
406 | Verstoß gegen Geschäftsregel (z. B. Automatisierungskonflikt, Listenlimit erreicht) |
Beispiel 200
{
"Added": [
{
"Email": "[email protected]",
"Id": "550e8400-e29b-41d4-a716-446655440000"
},
{
"Email": "[email protected]",
"Id": "660e8400-e29b-41d4-a716-446655440001"
}
],
"Errors": []
}
/Contact/{id}Kontakt abrufen
Gibt die Details eines bestimmten Kontakts zurück. Verwenden Sie includeTags=true, um auch die dem Kontakt zugewiesenen Tags zurückzugeben. Verwenden Sie includeLists=true, um auch die Listen zurückzugeben, denen der Kontakt angehört.
OAuth-Scope : contacts:read
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
id | path | string (uuid) | ja | Kontakt-UUID (aus POST /Contact oder GET /List/{id}/Contact) |
includeTags | query | boolean | Auf true setzen, um die Tag-Zuweisungen des Kontakts in die Antwort einzubeziehen | |
includeLists | query | boolean | Auf true setzen, um die Listenzugehörigkeiten des Kontakts in die Antwort einzubeziehen |
Antworten
| Code | Beschreibung |
|---|---|
200 | Kontakt erfolgreich zurückgegeben |
401 | Ungültiges oder abgelaufenes Token |
404 | Kontakt nicht gefunden |
Beispiel 200
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"email": "[email protected]",
"phone_number": "41791234567",
"custom_fields": [
{
"id": 1,
"value": "Alice"
},
{
"id": 2,
"value": "Dupont"
}
],
"tags": [
{
"id": 5
}
],
"lists": [
{
"id": 101
}
]
}
/Contact/{id}Kontakt aktualisieren
Aktualisiert die E-Mail-Adresse, Telefonnummer, benutzerdefinierten Felder, Listenzuweisungen und Tags eines Kontakts. Der Anfrage-Body ersetzt die aktuellen Daten des Kontakts — geben Sie alle Listen und Tags an, denen der Kontakt weiterhin zugewiesen bleiben soll.
Im Body erforderlich: email und mindestens ein lists-Eintrag.
OAuth-Scope : contacts:write
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
id | path | string (uuid) | ja | Kontakt-UUID |
Anfragetext (application/json)
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
email | string | ja | E-Mail-Adresse des Kontakts (erforderlich, muss eindeutig sein) |
phone_number | string | Telefonnummer — akzeptiert +41…, 0041… oder 41… mit oder ohne Trennzeichen.
Muss mit einem gültigen Ländercode beginnen. Maximal 12 Ziffern für Kontakte (siehe
Telefonnummernformat in der API-Beschreibung für die vollständigen Regeln).
| |
lists | array of ListRef | ja | Listen, denen dieser Kontakt zugewiesen werden soll. Mindestens eine Liste ist erforderlich. |
tags | array of TagRef | Tags, die diesem Kontakt zugewiesen werden sollen (optional) | |
custom_fields | array of FieldValue | Werte benutzerdefinierter Felder für diesen Kontakt (optional) |
Antworten
| Code | Beschreibung |
|---|---|
200 | Kontakt erfolgreich aktualisiert |
401 | Ungültiges oder abgelaufenes Token |
404 | Kontakt nicht gefunden |
422 | Validierungsfehler (E-Mail-Format, Telefonnummer, Typdiskrepanz beim Feldwert) |
Beispiel 200
{
"Result": "Successful operation"
}
/Contact/{id}Kontakt löschen
Löscht einen Kontakt dauerhaft aus dem CRM.
OAuth-Scope : contacts:write
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
id | path | string (uuid) | ja | Kontakt-UUID |
Antworten
| Code | Beschreibung |
|---|---|
200 | Kontakt erfolgreich gelöscht |
401 | Ungültiges oder abgelaufenes Token |
404 | Kontakt nicht gefunden |
/Contact/{id}/ActivityAktivität eines Kontakts über 90 Tage
Empfangene, geöffnete und angeklickte E-Mails, bevorzugtes E-Mail-Programm und letzte Kampagnen des Kontakts.
OAuth-Scope : contacts:read
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
id | path | string (uuid) | ja | GUID des Kontakts |
Antworten
| Code | Beschreibung |
|---|---|
200 | Aktivität zurückgegeben |
401 | Ungültiges oder abgelaufenes Token |
404 | Der angeforderte Kontakt existiert nicht |
Beispiel 200
{
"period_days": 90,
"email_received": 12,
"email_opened": 7,
"email_clicked": 2,
"favorite_email_client": "Gmail",
"last_campaigns": [
{
"id": 5001,
"name": "Spring Sale 2026",
"date": "2026-10-01T09:00:00"
}
]
}
/Contact/{id}/Tag/{tagid}Tag zu Kontakt hinzufügen
Weist einem Kontakt ein Tag zu. Ist das Tag bereits zugewiesen, ist der Vorgang ein No-Op.
OAuth-Scope : contacts:write
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
id | path | string (uuid) | ja | Kontakt-UUID |
tagid | path | integer (int64) | ja | Tag-ID (aus GET /Tag) |
Antworten
| Code | Beschreibung |
|---|---|
200 | Tag erfolgreich zugewiesen |
401 | Ungültiges oder abgelaufenes Token |
404 | Kontakt oder Tag nicht gefunden |
/Contact/{id}/Tag/{tagid}Tag von Kontakt entfernen
Entfernt eine Tag-Zuweisung von einem Kontakt.
OAuth-Scope : contacts:write
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
id | path | string (uuid) | ja | Kontakt-UUID |
tagid | path | integer (int64) | ja | Tag-ID |
Antworten
| Code | Beschreibung |
|---|---|
200 | Tag erfolgreich entfernt |
401 | Ungültiges oder abgelaufenes Token |
404 | Kontakt oder Tag nicht gefunden |
/Contact/{id}/List/{listid}Kontakt zu Liste hinzufügen
Fügt einen Kontakt einer bestimmten Liste hinzu. Gibt HTTP 404 zurück, wenn der Kontakt zuvor von dieser Liste abgemeldet wurde.
OAuth-Scope : contacts:write
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
id | path | string (uuid) | ja | Kontakt-UUID |
listid | path | integer (int64) | ja | Listen-ID (aus GET /List) |
Antworten
| Code | Beschreibung |
|---|---|
200 | Kontakt erfolgreich zur Liste hinzugefügt |
401 | Ungültiges oder abgelaufenes Token |
404 | Kontakt, Liste nicht gefunden oder Kontakt wurde von dieser Liste abgemeldet |
/Contact/{id}/List/{listid}Kontakt aus Liste entfernen
Entfernt einen Kontakt aus einer bestimmten Liste. Der Kontakt selbst wird nicht gelöscht.
OAuth-Scope : contacts:write
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
id | path | string (uuid) | ja | Kontakt-UUID |
listid | path | integer (int64) | ja | Listen-ID |
Antworten
| Code | Beschreibung |
|---|---|
200 | Kontakt erfolgreich aus Liste entfernt |
401 | Ungültiges oder abgelaufenes Token |
404 | Kontakt oder Liste nicht gefunden |
Verwalten Sie Kontaktlisten. Listen gruppieren Kontakte für Kampagnen und Segmentierung. Maximal 1.000 Listen pro Konto (gleiche Grenze für die drei Mailpro-APIs und in der App). Maximal 1.000.000 Kontakte pro Liste.
/ListKontaktlisten auflisten
Gibt alle Kontaktlisten des Kontos zurück. Filterung nach Name oder Erstellungsdatum. Alphabetische Sortierung mit sortByName=true. Mit includeTotalContacts=true wird die Gesamtzahl der Kontakte pro Liste mit einbezogen.
OAuth-Scope : contacts:read
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
name | query | string | Filterung nach Listennamen (Teilübereinstimmung) | |
dateCreationFrom | query | string (date-time) | Filterung nach Erstellungsdatum (ab, ISO 8601) | |
dateCreationTo | query | string (date-time) | Filterung nach Erstellungsdatum (bis, ISO 8601) | |
numberOfRecords | query | integer | Einträge pro Seite — standardmäßig und maximal 5.000 | |
pageNumber | query | integer | 1-basierte Seitennummer | |
sortByName | query | boolean | Auf true setzen, um alphabetisch nach Namen zu sortieren | |
includeTotalContacts | query | boolean | Auf true setzen, um die Anzahl total_contacts in jedem Ergebnis einzubeziehen |
Antworten
| Code | Beschreibung |
|---|---|
200 | Listen erfolgreich zurückgegeben |
401 | Ungültiges oder abgelaufenes Token |
Beispiel 200
[
{
"id": 101,
"name": "Newsletter subscribers",
"total_contacts": 4521,
"date_creation": "2025-01-15T10:30:00"
}
]
/ListKontaktliste erstellen
Erstellt eine neue Kontaktliste. Maximal 1.000 Listen pro Konto.
OAuth-Scope : contacts:write
Anfragetext (application/json)
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
name | string | ja | Anzeigename für die Liste |
Beispiel
{
"name": "Spring Campaign 2026"
}
Antworten
| Code | Beschreibung |
|---|---|
200 | Liste erfolgreich erstellt |
401 | Ungültiges oder abgelaufenes Token |
406 | Listenlimit (1.000) erreicht |
Beispiel 200
{
"id": 102,
"name": "Spring Campaign 2026",
"date_creation": "2026-04-14T12:00:00"
}
/List/{id}Kontaktliste abrufen
Gibt die Details einer bestimmten Kontaktliste zurück.
OAuth-Scope : contacts:read
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
id | path | integer (int64) | ja | Listen-ID |
Antworten
| Code | Beschreibung |
|---|---|
200 | Liste erfolgreich zurückgegeben |
401 | Ungültiges oder abgelaufenes Token |
404 | Liste nicht gefunden |
/List/{id}Kontaktliste aktualisieren
Benennt eine bestehende Kontaktliste um.
OAuth-Scope : contacts:write
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
id | path | integer (int64) | ja | Listen-ID |
Anfragetext (application/json)
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
name | string | ja | Anzeigename für die Liste |
Beispiel
{
"name": "Newsletter subscribers — Europe"
}
Antworten
| Code | Beschreibung |
|---|---|
200 | Liste erfolgreich aktualisiert |
401 | Ungültiges oder abgelaufenes Token |
404 | Liste nicht gefunden |
/List/{id}Kontaktliste löschen
Löscht eine Kontaktliste dauerhaft. Die Kontakte selbst werden nicht gelöscht — nur ihre Zugehörigkeit zu dieser Liste wird entfernt. Listen, die von aktiven Automatisierungs-Workflows verwendet werden, können nicht gelöscht werden.
OAuth-Scope : contacts:write
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
id | path | integer (int64) | ja | Listen-ID |
Antworten
| Code | Beschreibung |
|---|---|
200 | Liste erfolgreich gelöscht |
401 | Ungültiges oder abgelaufenes Token |
404 | Liste nicht gefunden |
406 | Liste wird von einem aktiven Automatisierungs-Workflow verwendet |
/List/{id}/ContactKontakte in einer Liste auflisten
Gibt die Kontakte zurück, die einer bestimmten Liste angehören. Filterung nach E-Mail oder Hinzufügedatum. Tags und Listenzugehörigkeiten mit den entsprechenden Flags einbeziehen.
OAuth-Scope : contacts:read
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
id | path | integer (int64) | ja | Listen-ID |
email | query | string | Filterung nach E-Mail (Teilübereinstimmung) | |
numberOfRecords | query | integer | Einträge pro Seite — standardmäßig und maximal 5.000 | |
pageNumber | query | integer | ||
sortByEmail | query | boolean | Alphabetische Sortierung nach E-Mail | |
includeTags | query | boolean | Tag-Zuweisungen in die Ergebnisse einbeziehen | |
includeLists | query | boolean | Listenzugehörigkeiten in die Ergebnisse einbeziehen |
Antworten
| Code | Beschreibung |
|---|---|
200 | Kontakte erfolgreich zurückgegeben |
401 | Ungültiges oder abgelaufenes Token |
404 | Liste nicht gefunden oder keine Kontakte entsprechen den Kriterien |
/List/{listId}/UnsubscribersAbgemeldete auflisten
Gibt die Kontakte zurück, die sich von einer bestimmten Liste abgemeldet haben.
OAuth-Scope : contacts:read
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
listId | path | integer (int64) | ja | Listen-ID |
Antworten
| Code | Beschreibung |
|---|---|
200 | Abgemeldete erfolgreich zurückgegeben |
401 | Ungültiges oder abgelaufenes Token |
404 | Liste nicht gefunden |
Verwalten Sie Tags zur Kennzeichnung und Segmentierung von Kontakten. Tags sind flache Labels (z. B. „VIP“, „Churned“, „B2B“). Maximal 1.000 Tags pro Konto.
/TagTags auflisten
Gibt alle Tags des Kontos zurück.
OAuth-Scope : contacts:read
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
name | query | string | Filterung nach Name (Teilübereinstimmung) | |
numberOfRecords | query | integer | ||
pageNumber | query | integer | ||
sortByName | query | boolean |
Antworten
| Code | Beschreibung |
|---|---|
200 | Tags erfolgreich zurückgegeben |
401 | Ungültiges oder abgelaufenes Token |
Beispiel 200
[
{
"id": 5,
"name": "VIP customers"
},
{
"id": 6,
"name": "Newsletter openers"
}
]
/TagTag erstellen
Erstellt ein neues Tag. Maximal 1.000 Tags pro Konto.
OAuth-Scope : contacts:write
Anfragetext (application/json)
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
name | string | ja | Anzeigename für das Tag |
Beispiel
{
"name": "VIP customers"
}
Antworten
| Code | Beschreibung |
|---|---|
200 | Tag erfolgreich erstellt |
401 | Ungültiges oder abgelaufenes Token |
406 | Tag-Limit (1.000) erreicht |
/Tag/{id}Tag abrufen
Gibt ein bestimmtes Tag anhand seiner ID zurück.
OAuth-Scope : contacts:read
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
id | path | integer (int64) | ja | Tag-ID |
Antworten
| Code | Beschreibung |
|---|---|
200 | Tag erfolgreich zurückgegeben |
401 | Ungültiges oder abgelaufenes Token |
404 | Tag nicht gefunden |
/Tag/{id}Tag aktualisieren
Benennt ein bestehendes Tag um.
OAuth-Scope : contacts:write
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
id | path | integer (int64) | ja |
Anfragetext (application/json)
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
name | string | ja | Anzeigename für das Tag |
Beispiel
{
"name": "VIP customers — updated"
}
Antworten
| Code | Beschreibung |
|---|---|
200 | Tag erfolgreich aktualisiert |
401 | Ungültiges oder abgelaufenes Token |
404 | Tag nicht gefunden |
/Tag/{id}Tag löschen
Löscht ein Tag dauerhaft. Das Tag wird von allen Kontakten entfernt. Tags, die von aktiven Automatisierungs-Workflows verwendet werden, können nicht gelöscht werden.
OAuth-Scope : contacts:write
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
id | path | integer (int64) | ja |
Antworten
| Code | Beschreibung |
|---|---|
200 | Tag erfolgreich gelöscht |
401 | Ungültiges oder abgelaufenes Token |
404 | Tag nicht gefunden |
406 | Tag wird von einem aktiven Automatisierungs-Workflow verwendet |
/Tag/{id}/ContactKontakte mit einem Tag auflisten
Gibt die Kontakte zurück, denen ein bestimmtes Tag zugewiesen wurde.
OAuth-Scope : contacts:read
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
id | path | integer (int64) | ja | Tag-ID |
numberOfRecords | query | integer | ||
pageNumber | query | integer |
Antworten
| Code | Beschreibung |
|---|---|
200 | Kontakte erfolgreich zurückgegeben |
401 | Ungültiges oder abgelaufenes Token |
404 | Tag nicht gefunden |
Verwalten Sie benutzerdefinierte Kontaktfelder. Mit Feldern können Sie zusätzliche Daten zu jedem Kontakt speichern (z. B. Vorname, Stadt, Treuestufe). Maximal 50 Felder pro Konto. Feldtypen: text, number, date.
/FieldBenutzerdefinierte Felder auflisten
Gibt alle für das Konto definierten benutzerdefinierten Kontaktfelder zurück. Verwenden Sie die zurückgegebenen id-Werte beim Erstellen oder Aktualisieren von Kontakten.
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
name | query | string | Filterung nach Feldnamen | |
idFieldType | query | integer | Filterung nach Feldtyp-ID | |
numberOfRecords | query | integer | ||
pageNumber | query | integer | ||
sortByName | query | boolean |
Antworten
| Code | Beschreibung |
|---|---|
200 | Benutzerdefinierte Felder erfolgreich zurückgegeben |
401 | Ungültiges oder abgelaufenes Token |
Beispiel 200
[
{
"id": 1,
"name": "first_name",
"personalisation_key": "first_name",
"field_type": "text"
},
{
"id": 2,
"name": "last_name",
"personalisation_key": "last_name",
"field_type": "text"
}
]
/FieldBenutzerdefiniertes Feld erstellen
Erstellt ein neues benutzerdefiniertes Kontaktfeld. Maximal 50 Felder pro Konto. Verwenden Sie die zurückgegebene id, um Kontakten Werte zuzuweisen.
Anfragetext (application/json)
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
name | string | ja | Anzeigename des Feldes |
id_field_type | integer | ja | ID des Feldtyps (verfügbare Typen über GET /Field/Types):
- 1 = Text
- 2 = Ganzzahl
- 3 = Datum und Uhrzeit
- 4 = Ja / Nein
- 12 = Dezimalzahl
|
personalize_key | string | ja | Variablenschlüssel der Vorlage, um das Feld in eine Nachricht einzufügen |
sort | integer | Anzeigereihenfolge (0 bis 255). Pflicht beim Ändern eines Feldes (PUT /Field/{id}). |
Beispiel
{
"name": "First name",
"id_field_type": 1,
"personalize_key": "first_name"
}
Antworten
| Code | Beschreibung |
|---|---|
200 | Feld erfolgreich erstellt |
401 | Ungültiges oder abgelaufenes Token |
406 | Feldlimit (50) erreicht |
/Field/TypesFeldtypen auflisten
Gibt die verfügbaren Feldtyp-Kennungen zurück, die beim Erstellen eines benutzerdefinierten Felds zu verwenden sind. Gängige Typen: 1 = Text, 2 = Zahl, 3 = Datum.
Antworten
| Code | Beschreibung |
|---|---|
200 | Feldtypen erfolgreich zurückgegeben |
401 | Ungültiges oder abgelaufenes Token |
/Field/{id}Benutzerdefiniertes Feld abrufen
Gibt die Definition und Metadaten eines bestimmten benutzerdefinierten Felds zurück.
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
id | path | integer (int64) | ja | Feld-ID |
Antworten
| Code | Beschreibung |
|---|---|
200 | Feld erfolgreich zurückgegeben |
401 | Ungültiges oder abgelaufenes Token |
404 | Feld nicht gefunden |
/Field/{id}Benutzerdefiniertes Feld aktualisieren
Aktualisiert den Namen oder den Personalisierungsschlüssel eines benutzerdefinierten Felds.
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
id | path | integer (int64) | ja |
Anfragetext (application/json)
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
name | string | ja | Anzeigename des Feldes |
id_field_type | integer | ja | ID des Feldtyps (verfügbare Typen über GET /Field/Types):
- 1 = Text
- 2 = Ganzzahl
- 3 = Datum und Uhrzeit
- 4 = Ja / Nein
- 12 = Dezimalzahl
|
personalize_key | string | ja | Variablenschlüssel der Vorlage, um das Feld in eine Nachricht einzufügen |
sort | integer | Anzeigereihenfolge (0 bis 255). Pflicht beim Ändern eines Feldes (PUT /Field/{id}). |
Antworten
| Code | Beschreibung |
|---|---|
200 | Feld erfolgreich aktualisiert |
401 | Ungültiges oder abgelaufenes Token |
404 | Feld nicht gefunden |
/Field/{id}Benutzerdefiniertes Feld löschen
Löscht ein benutzerdefiniertes Feld dauerhaft und entfernt dessen Wert aus allen Kontakten. Diese Aktion kann nicht rückgängig gemacht werden.
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
id | path | integer (int64) | ja |
Antworten
| Code | Beschreibung |
|---|---|
200 | Feld erfolgreich gelöscht |
401 | Ungültiges oder abgelaufenes Token |
404 | Feld nicht gefunden |
Zeigen Sie Kampagnenstatistiken an und verwalten Sie geplante Kampagnen. Kampagnen können bis 5 Minuten vor dem geplanten Sendezeitpunkt bearbeitet oder gelöscht werden.
/CampaignKampagnen auflisten
Gibt eine paginierte Liste der E-Mail-Kampagnen des Kontos zurück.
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
numberOfRecords | query | integer | ||
pageNumber | query | integer |
Antworten
| Code | Beschreibung |
|---|---|
200 | Kampagnen erfolgreich zurückgegeben |
401 | Ungültiges oder abgelaufenes Token |
Beispiel 200
[
{
"id": 8001,
"title": "Spring Newsletter April 2026",
"date_planned": "2026-04-20T09:00:01",
"count_open": 1823,
"count_sent": 4521,
"count_click": 342,
"count_badmail": 12,
"count_unsubscription": 8,
"count_clicking_users": 289,
"count_complaints": 1,
"spam_trap": 0,
"deliverability_score": 98
}
]
/Campaign/{id}Kampagne abrufen
Gibt die Konfiguration und die Statistikzusammenfassung einer bestimmten Kampagne zurück.
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
id | path | integer (int64) | ja |
Antworten
| Code | Beschreibung |
|---|---|
200 | Kampagne erfolgreich zurückgegeben |
401 | Ungültiges oder abgelaufenes Token |
404 | Kampagne nicht gefunden |
/Campaign/{id}Kampagne aktualisieren
Aktualisiert den Titel oder das Sendedatum einer geplanten Kampagne. Kampagnen können nur bis 5 Minuten vor dem geplanten Sendezeitpunkt geändert werden.
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
id | path | integer (int64) | ja |
Anfragetext (application/json)
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
campaign_title | string | Anzeigename für die Kampagne | |
date_planned | string (date-time) | Geplante Sendezeit (ISO 8601). Weglassen, um sofort zu senden. |
Antworten
| Code | Beschreibung |
|---|---|
200 | Kampagne erfolgreich aktualisiert |
401 | Ungültiges oder abgelaufenes Token |
404 | Kampagne nicht gefunden |
/Campaign/{id}Kampagne löschen
Storniert und löscht eine Kampagne anhand ihrer Kennung dauerhaft.
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
id | path | integer (int64) | ja |
Antworten
| Code | Beschreibung |
|---|---|
200 | Kampagne erfolgreich gelöscht |
401 | Ungültiges oder abgelaufenes Token |
404 | Kampagne nicht gefunden |
/Campaign/ScheduledMeine geplanten Kampagnen auflisten
Gibt Kampagnen mit zukünftigem date_planned zurück, die noch nicht versendet wurden. Sortiert nach date_planned in aufsteigender Reihenfolge.
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
numberOfRecords | query | integer | ||
pageNumber | query | integer |
Antworten
| Code | Beschreibung |
|---|---|
200 | Liste der geplanten Kampagnen |
401 | Ungültiges oder abgelaufenes Token |
Beispiel 200
[
{
"id": 5001,
"id_client": 12345,
"subject": "Spring Sale 2026",
"date_planned": "2026-05-01T09:00:00",
"title": "Spring Sale",
"id_campaign": 7001,
"id_list": 101,
"id_segment": null,
"number_email": 1250
}
]
/Campaign/{id}/CancelGeplante Kampagne stornieren
Storniert eine zukünftig geplante Kampagne. Gibt 409 Conflict zurück, wenn die Kampagne bereits versendet wurde oder nicht existiert.
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
id | path | integer (int64) | ja |
Antworten
| Code | Beschreibung |
|---|---|
200 | Kampagne storniert |
401 | Ungültiges oder abgelaufenes Token |
409 | Bereits versendet oder nicht gefunden |
Beispiel 200
{
"result": "ok",
"cancelled": 5001
}
/Campaign/{id}/RescheduleGeplante Kampagne neu planen
Aktualisiert das geplante Sendedatum einer geplanten Kampagne. Das neue Datum muss in der Zukunft und innerhalb von 90 Tagen liegen.
Name des Body-Felds: Die API akzeptiert date_planned (snake_case, primär) sowie die Legacy-Aliasse PlanDate und scheduled_time. Geben Sie einen beliebigen davon an — der erste nicht-null-Wert wird verwendet.
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
id | path | integer (int64) | ja |
Anfragetext (application/json)
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
date_planned | string (date-time) | Primärer Feldname. | |
PlanDate | string (date-time) | Aus Gründen der Abwärtskompatibilität akzeptierter Legacy-Alias. | |
scheduled_time | string (date-time) | Aus Gründen der Abwärtskompatibilität akzeptierter Legacy-Alias. |
Antworten
| Code | Beschreibung |
|---|---|
200 | Kampagne neu geplant |
400 | Fehlendes Datum — geben Sie eines von date_planned / PlanDate / scheduled_time an |
401 | Ungültiges oder abgelaufenes Token |
409 | Bereits versendet |
Beispiel 200
{
"result": "ok",
"id": 5001,
"date_planned": "2026-12-31T14:30:00"
}
/Campaign/{id}/ByHourStatistik nach Stunde
Gibt die stündliche Aufschlüsselung der Öffnungen und Klicks für die Kampagne zurück.
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
id | path | integer (int64) | ja |
Antworten
| Code | Beschreibung |
|---|---|
200 | Stündliche Statistik erfolgreich zurückgegeben |
401 | Ungültiges oder abgelaufenes Token |
/Campaign/{id}/ByDayStatistik nach Tag
Gibt die tägliche Aufschlüsselung der Öffnungen und Klicks für die Kampagne zurück.
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
id | path | integer (int64) | ja |
Antworten
| Code | Beschreibung |
|---|---|
200 | Tägliche Statistik erfolgreich zurückgegeben |
401 | Ungültiges oder abgelaufenes Token |
/Campaign/{id}/OpeningsE-Mail-Öffnungen auflisten
Gibt eine paginierte Liste der Kontakte zurück, die die Kampagnen-E-Mail geöffnet haben.
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
id | path | integer (int64) | ja | |
email | query | string | Filterung nach Empfänger-E-Mail | |
numberOfRecords | query | integer | ||
pageNumber | query | integer |
Antworten
| Code | Beschreibung |
|---|---|
200 | Öffnungsliste erfolgreich zurückgegeben |
401 | Ungültiges oder abgelaufenes Token |
/Campaign/{id}/ClicksLink-Klicks auflisten
Gibt eine paginierte Liste der Kontakte zurück, die in der Kampagne auf einen Link geklickt haben.
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
id | path | integer (int64) | ja | |
email | query | string | ||
numberOfRecords | query | integer | ||
pageNumber | query | integer |
Antworten
| Code | Beschreibung |
|---|---|
200 | Klickliste erfolgreich zurückgegeben |
401 | Ungültiges oder abgelaufenes Token |
/Campaign/{id}/HardBouncesHard Bounces auflisten
Gibt die E-Mail-Adressen zurück, bei denen während dieser Kampagne ein Hard Bounce aufgetreten ist.
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
id | path | integer (int64) | ja | |
email | query | string | ||
numberOfRecords | query | integer | ||
pageNumber | query | integer |
Antworten
| Code | Beschreibung |
|---|---|
200 | Hard-Bounce-Liste erfolgreich zurückgegeben |
401 | Ungültiges oder abgelaufenes Token |
/Campaign/{id}/LinksVerfolgte Links auflisten
Gibt die Klick-Leistungsdaten für jeden in der Kampagne verfolgten Link zurück.
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
id | path | integer (int64) | ja | |
link | query | string | Filterung nach Link-URL (Teilübereinstimmung) | |
numberOfRecords | query | integer | ||
pageNumber | query | integer |
Antworten
| Code | Beschreibung |
|---|---|
200 | Link-Statistik erfolgreich zurückgegeben |
401 | Ungültiges oder abgelaufenes Token |
/Campaign/{id}/OSStatistik nach Betriebssystem / Gerät
Gibt die Aufschlüsselung der Öffnungen und Klicks nach Betriebssystem und Gerätetyp zurück.
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
id | path | integer (int64) | ja |
Antworten
| Code | Beschreibung |
|---|---|
200 | BS-Statistik erfolgreich zurückgegeben |
401 | Ungültiges oder abgelaufenes Token |
/Campaign/{id}/EmailClientsStatistik nach E-Mail-Client
Gibt die Aufschlüsselung der Öffnungen nach E-Mail-Client zurück (Gmail, Outlook, Apple Mail…).
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
id | path | integer (int64) | ja |
Antworten
| Code | Beschreibung |
|---|---|
200 | E-Mail-Client-Statistik erfolgreich zurückgegeben |
401 | Ungültiges oder abgelaufenes Token |
/Campaign/{id}/CountriesStatistik nach Land
Gibt die geografische Verteilung der Öffnungen und Klicks zurück.
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
id | path | integer (int64) | ja |
Antworten
| Code | Beschreibung |
|---|---|
200 | Länderstatistik erfolgreich zurückgegeben |
401 | Ungültiges oder abgelaufenes Token |
Versenden Sie E-Mail-Massenkampagnen (an Kontaktlisten) und einzelne transaktionale E-Mails. Kampagnen können geplant oder sofort versendet werden.
/Send/MailTransaktionale E-Mail senden
Sendet eine einmalige transaktionale E-Mail an einen einzelnen Empfänger.
Empfänger: Geben Sie email (inline angegebene Adresse) ODER id_contact (CRM-Kontakt) an — nicht beides. Die Verwendung von id_contact ermöglicht die automatische Personalisierung mit den Werten der benutzerdefinierten Felder des Kontakts.
Inhalt: Geben Sie body_html (inline angegebenes HTML) ODER id_message (gespeicherte Vorlage) an — nicht beides. Wenn beide angegeben werden, hat id_message Vorrang.
Erforderlich: id_sender_email, subject und eines von (email oder id_contact) sowie eines von (body_html oder id_message).
Anfragetext (application/json)
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
id_sender_email | integer | ID der Absender-E-Mail-Adresse (aus GET /SenderEmail). Erforderlich. | |
email | string | E-Mail-Adresse des Empfängers (inline). Geben Sie dies ODER id_contact an.
Wenn beide angegeben sind, hat id_contact Vorrang.
Der lokale Teil (vor dem @) akzeptiert Buchstaben, Ziffern und . _ - + —
einschließlich RFC-5322-Sub-Addressing (user+tag@domain, z. B. Gmail, Fastmail,
Proton). Andere von RFC 5322 erlaubte Sonderzeichen
(z. B. ! # $ % & ' * / = ? ^ { | } ~) sowie lokale Teile in Anführungszeichen
werden nicht akzeptiert.
| |
id_contact | string (uuid) | ID des CRM-Empfängerkontakts. Geben Sie diese ODER email an.
Die Verwendung von id_contact ermöglicht die Personalisierung mit den Werten der benutzerdefinierten Felder des Kontakts.
| |
subject | string | Betreffzeile der E-Mail (maximal 255 Zeichen). Erforderlich. | |
body_html | string | Inline-HTML-Inhalt. Geben Sie diesen ODER id_message an.
Wenn beide angegeben sind, hat id_message Vorrang.
| |
id_message | integer | ID einer gespeicherten Nachrichtenvorlage (aus GET /Message).
Geben Sie diese ODER body_html an.
| |
reply_to | string | Antwortadresse (standardmäßig die Absenderadresse) | |
fields | array of FieldValue | Benutzerdefinierte Personalisierungsfelder (nur in Verbindung mit inline angegebener email verwendet, nicht mit id_contact) | |
date_planned | string (date-time) | Planen Sie den Versand für einen späteren Zeitpunkt. Weglassen, um sofort zu senden. | |
attachments | array of EmailAttachment | Optionale Dateianhänge (max. 5). Jedes Element ist ein Objekt mit filename und Base64-kodiertem content. Grenzen: 10 MB pro Datei und 15 MB insgesamt, gemessen nach der Base64-Dekodierung. Zulässige Typen: PDF, Word, Excel, PowerPoint, Bilder (JPG, PNG, GIF, WebP), ZIP, CSV, TXT — ausführbare Dateien und Skripte werden abgelehnt. Abrechnung: der Versand behält sein übliches 1 Guthaben, plus 1 Guthaben pro 512 KB Anhänge über die ersten 512 KB hinaus (Anhänge ≤ 512 KB kosten nichts extra). | |
keep_in_my_files | boolean | false (Standard): Die Anhänge werden nur für diesen Versand verwendet — sie werden außerhalb
Ihres Kontos gespeichert, zählen nicht zu Ihrem Speicherkontingent und werden nach 35 Tagen
automatisch gelöscht. true: Die Anhänge werden zusätzlich in den Dateien Ihres Kontos gespeichert (Ordner
Secure/Files/Sending/api) und zählen zu Ihrem Speicherkontingent.
|
Beispiel
{
"id_sender_email": 201,
"email": "[email protected]",
"subject": "Your order #12345 has shipped",
"body_html": "<p>Hello {{first_name}}, your order is on its way!</p>",
"reply_to": "[email protected]",
"fields": [
{
"id": 1,
"value": "Alice"
}
],
"attachments": [
{
"filename": "invoice.pdf",
"content": "JVBERi0xLjQKJVBERi0xLjQK..."
}
]
}
Antworten
| Code | Beschreibung |
|---|---|
200 | E-Mail erfolgreich gesendet oder geplant |
400 | Ungültiges E-Mail-Format oder fehlendes Pflichtfeld |
401 | Ungültiges oder abgelaufenes Token |
404 | Absender, Nachricht oder Kontakt nicht gefunden; oder Empfänger abgemeldet |
422 | Validierungsfehler (Betreff zu lang, Body und Nachricht beide leer usw.) |
Beispiel 200
{
"message": "Successful operation",
"id_single_send": 8001
}
Beispiel 404
{
"Message": "Not enough credit available"
}
/Send/{id}/StatusZustellstatus einer transaktionalen E-Mail abrufen
Gibt den aktuellen Zustellstatus einer transaktionalen E-Mail zurück, die über POST /Send/Mail gesendet wurde. Übergeben Sie die id_single_send, die dieser Aufruf zurückgegeben hat.
Mögliche Werte: delivered (vom Empfängerserver angenommen, siehe diag_code), bounced (abgelehnt — bounce_type: hard ungültige Adresse oder endgültige Ablehnung, soft Ablehnung nach erneuten Versuchen), sent (an den Mailserver übergeben, noch keine Antwort), scheduled (noch nicht gesendet, date_planned in der Zukunft) und queued (wartet auf den Versand). delivered und bounced sind endgültig: Beenden Sie die Abfragen. Jede E-Mail hat spätestens 48 Stunden nach dem Versand einen endgültigen Status; fragen Sie höchstens alle 15 Minuten ab (jeder Aufruf zählt für Ihr API-Kontingent) oder nutzen Sie die Webhooks email.delivered / email.bounced. Nur der Kunde, der die E-Mail gesendet hat, kann ihren Status lesen — jede andere ID liefert 404.
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
id | path | integer (int64) | ja | Die von POST /Send/Mail zurückgegebene id_single_send. |
Antworten
| Code | Beschreibung |
|---|---|
200 | Aktueller Zustellstatus |
401 | Ungültiges oder abgelaufenes Token |
404 | Kein transaktionaler Versand mit dieser ID für diesen Kunden gefunden |
Beispiel 200
{
"id_single_send": 8001,
"email": "[email protected]",
"status": "delivered",
"date_planned": "2026-04-15T14:30:00",
"status_date": "2026-04-15T14:30:07",
"diag_code": "2.0.0 (success)",
"bounce_type": null
}
/Send/CampaignE-Mail-Kampagne senden
Sendet eine E-Mail-Massenkampagne an eine oder mehrere Kontaktlisten.
Erforderlich:
id_message — die zu sendende Vorlage (aus GET /Message)id_sender_email — die Absenderadresse (aus GET /SenderEmail)lists — mindestens eine Ziel-Kontaktlistecampaign_title — Bezeichnung zur Statistik-NachverfolgungSegment: Optional können Empfänger nach einem gespeicherten Segment gefiltert werden (id_segment). Das Segment filtert die Kontakte innerhalb der angegebenen Listen.
Planung: Setzen Sie date_planned auf ein zukünftiges ISO-8601-Datum/-Uhrzeit. Kampagnen können bis 5 Minuten vor dem geplanten Zeitpunkt bearbeitet oder storniert werden.
Anfragetext (application/json)
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
id_message | integer | ja | ID der zu verwendenden Nachrichtenvorlage (aus GET /Message) |
id_sender_email | integer | ja | ID der Absenderadresse (aus GET /SenderEmail) |
id_email_reply_to | integer | ID der Antwort-Absenderadresse (aus GET /SenderEmail). Muss eine der Absenderadressen Ihres Kontos sein, andernfalls wird die Anfrage abgelehnt. Standard: id_sender_email. | |
lists | array of ListRef | ja | Ziel-Kontaktlisten (mindestens eine erforderlich) |
id_segment | integer | Empfänger nach einem gespeicherten Segment filtern (optional) | |
campaign_title | string | ja | Anzeigename für diese Kampagne (maximal 150 Zeichen) |
date_planned | string (date-time) | Geplante Sendezeit (ISO 8601). Weglassen, um sofort zu senden. | |
id_automation | integer | Verknüpft diesen Versand mit einem Automatisierungs-Workflow (optional) |
Beispiel
{
"id_message": 501,
"id_sender_email": 201,
"lists": [
{
"id": 101
}
],
"campaign_title": "Spring Newsletter April 2026",
"date_planned": "2026-04-20T09:00:00"
}
Antworten
| Code | Beschreibung |
|---|---|
200 | Kampagne erfolgreich geplant oder gesendet |
401 | Ungültiges oder abgelaufenes Token |
402 | Unzureichendes Guthaben |
404 | Nachricht, Absender, Liste oder Segment nicht gefunden; oder unzureichendes Guthaben |
422 | Kampagnentitel leer oder zu lang (maximal 150 Zeichen) |
Beispiel 200
{
"Message": "Successful operation. Campaigns can be edited or deleted until 5 minutes prior to send.",
"IdCampaign": 8001
}
/SendGeplante Sendungen auflisten
Gibt die Liste der E-Mail-Kampagnen zurück, die auf ihren Versand warten (geplant, noch nicht verarbeitet).
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
subjectMessage | query | string | Filterung nach Betreff (Teilübereinstimmung) | |
numberOfRecords | query | integer | ||
pageNumber | query | integer |
Antworten
| Code | Beschreibung |
|---|---|
200 | Wartende Sendungen erfolgreich zurückgegeben |
401 | Ungültiges oder abgelaufenes Token |
/Send/{id}Geplante Sendung stornieren
Storniert und löscht eine geplante E-Mail-Sendung, die noch nicht verarbeitet wurde. Sendungen, die gerade verarbeitet werden, können nicht storniert werden.
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
id | path | integer (int64) | ja | Sendungs-ID (aus GET /Send) |
Antworten
| Code | Beschreibung |
|---|---|
200 | Geplante Sendung erfolgreich storniert |
401 | Ungültiges oder abgelaufenes Token |
404 | Geplante Sendung nicht gefunden |
/Send/Mail/ScheduledGeplante Einzel-E-Mails auflisten
Gibt die mit POST /Send/Mail und einem zukünftigen Datum gesendeten Einzel-E-Mails zurück, die noch nicht versendet wurden. Kampagnen werden von GET /Campaign/Scheduled aufgelistet.
OAuth-Scope : email:send
Antworten
| Code | Beschreibung |
|---|---|
200 | Geplante E-Mails zurückgegeben |
401 | Ungültiges oder abgelaufenes Token |
Beispiel 200
[
{
"id_single_send": 880123,
"email": "[email protected]",
"subject": "Your invoice",
"date_planned": "2026-12-01T09:00:00"
}
]
/Send/Mail/{id}/CancelGeplante Einzel-E-Mail stornieren
Storniert die E-Mail, solange sie noch nicht versendet wurde.
OAuth-Scope : email:send
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
id | path | integer (int64) | ja | Von POST /Send/Mail zurückgegebene id_single_send |
Antworten
| Code | Beschreibung |
|---|---|
200 | E-Mail storniert |
401 | Ungültiges oder abgelaufenes Token |
409 | Versand nicht gefunden oder bereits erfolgt |
Beispiel 200
{
"result": "ok",
"cancelled": 880123
}
/Send/Mail/{id}/RescheduleGeplante Einzel-E-Mail neu planen
Ändert das Versanddatum. Das neue Datum muss in der Zukunft und innerhalb von 90 Tagen liegen. POST wird ebenfalls akzeptiert.
OAuth-Scope : email:send
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
id | path | integer (int64) | ja | Von POST /Send/Mail zurückgegebene id_single_send |
Anfragetext (application/json)
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
date_planned | string (date-time) | ja | Neues Versanddatum (ISO 8601) |
Antworten
| Code | Beschreibung |
|---|---|
200 | E-Mail neu geplant |
400 | Datum fehlt |
401 | Ungültiges oder abgelaufenes Token |
409 | Versand nicht gefunden, bereits erfolgt oder Datum außerhalb des zulässigen Bereichs |
Beispiel 200
{
"result": "ok",
"id": 880123,
"date_planned": "2026-12-15T09:00:00"
}
Verwalten Sie validierte Absender-E-Mail-Adressen. Nur verifizierte Adressen können als From verwendet werden.
/SenderEmailAbsenderadressen auflisten
Gibt die für das Konto konfigurierten validierten Absender-E-Mail-Adressen zurück.
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
numberOfRecords | query | integer | ||
pageNumber | query | integer |
Antworten
| Code | Beschreibung |
|---|---|
200 | Absenderadressen erfolgreich zurückgegeben |
401 | Ungültiges oder abgelaufenes Token |
Beispiel 200
[
{
"id": 201,
"email": "[email protected]",
"sender_name": "Your Company Newsletter",
"is_validated": true
}
]
/SenderEmailAbsenderadresse hinzufügen
Fügt die Adresse mit denselben Prüfungen wie in der Anwendung hinzu und sendet ihr eine Bestätigungs-E-Mail. Sie kann verwendet werden, sobald der Link in dieser E-Mail angeklickt wurde. Ein Konto kann bis zu 25 Absender haben, bestätigt oder ausstehend.
OAuth-Scope : email:templates:write
Anfragetext (application/json)
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
email | string | ja | Absenderadresse |
sender_name | string | ja | Den Empfängern angezeigter Name |
Antworten
| Code | Beschreibung |
|---|---|
200 | Adresse hinzugefügt. domain_has_mx ist false, wenn die Domain keinen MX-Eintrag hat. |
400 | email oder sender_name fehlt |
401 | Ungültiges oder abgelaufenes Token |
422 | Adresse abgelehnt: ungültig, bereits unter den Absendern des Kontos, öffentliche E-Mail-Domain, unzulässiger Name oder Limit von 25 erreicht. Die Meldung nennt den Grund. |
503 | Vorübergehend nicht verfügbar, bitte versuchen Sie es erneut |
Beispiel 200
{
"result": "ok",
"confirmation_sent": true,
"domain_has_mx": true
}
/SenderEmail/{id}/ResendValidationBestätigungs-E-Mail erneut senden
Für eine Adresse, die noch auf die Bestätigung wartet.
OAuth-Scope : email:templates:write
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
id | path | integer | ja | id_sender_email aus GET /SenderEmail |
Antworten
| Code | Beschreibung |
|---|---|
200 | E-Mail erneut gesendet |
401 | Ungültiges oder abgelaufenes Token |
404 | Absender nicht gefunden |
409 | Dieser Absender ist bereits bestätigt |
503 | Vorübergehend nicht verfügbar, bitte versuchen Sie es erneut |
Beispiel 200
{
"result": "ok",
"confirmation_sent": true
}
/SenderEmail/{id}/AuthenticationDomain eines Absenders prüfen (SPF, DKIM, DMARC, MX)
Prüft die Domain live im DNS und gibt die zu veröffentlichenden Einträge zurück. Nur Lesezugriff. DKIM wird in der Anwendung aktiviert: dkim_settings_url öffnet die richtige Seite.
OAuth-Scope : email:templates:read
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
id | path | integer | ja | id_sender_email aus GET /SenderEmail |
Antworten
| Code | Beschreibung |
|---|---|
200 | Status der Domain. spf.recommended_record basiert auf Ihrem aktuellen Eintrag: Veröffentlichen Sie ihn nur, wenn spf.change_needed true ist. |
401 | Ungültiges oder abgelaufenes Token |
404 | Absender nicht gefunden |
503 | Vorübergehend nicht verfügbar, bitte versuchen Sie es erneut |
Beispiel 200
{
"domain": "example.com",
"spf": {
"valid": true,
"record": "v=spf1 include:spf.mailpro.com -all",
"recommended_record": "v=spf1 include:spf.mailpro.com -all",
"change_needed": false
},
"dkim": {
"valid": true,
"records": [
{
"host": "key._domainkey.example.com",
"value": "v=DKIM1;k=rsa;p=MIIBIjANBgkq...",
"validated": true
}
]
},
"dmarc": {
"valid": true,
"record": "v=DMARC1; p=quarantine"
},
"mx": {
"valid": true,
"record": "mail.example.com"
},
"dkim_settings_url": "https://app.mailpro.com/dkim/list?d=example.com"
}
Durchsuchen Sie das Protokoll vergangener E-Mail- und SMS-Versendungen.
/History/EmailVerlauf der E-Mail-Versendungen auflisten
Gibt das Protokoll vergangener E-Mail-Versendungen des Kontos zurück.
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
subjectMessage | query | string | Filterung nach Betreff (Teilübereinstimmung) | |
idCampaign | query | integer | Filterung nach Kampagnen-ID | |
includeBodyHTML | query | boolean | Vollständigen HTML-Body in die Antwort einbeziehen (langsamer) | |
numberOfRecords | query | integer | ||
pageNumber | query | integer |
Antworten
| Code | Beschreibung |
|---|---|
200 | E-Mail-Verlauf erfolgreich zurückgegeben |
401 | Ungültiges oder abgelaufenes Token |
/History/SMSVerlauf der SMS-Versendungen auflisten
Gibt das Protokoll vergangener SMS-Versendungen des Kontos zurück.
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
dateSend | query | string (date-time) | Filterung ab diesem Datum (ISO 8601) | |
dateSendEnd | query | string (date-time) | Filterung bis zu diesem Datum (ISO 8601) | |
phoneNumber | query | string | Filterung nach Telefonnummer des Empfängers (Teilübereinstimmung) | |
type | query | integer | Filter für SMS-Typ | |
statusCode | query | integer | Filter für DLR-Statuscode | |
sortByStatus | query | boolean | ||
numberOfRecords | query | integer | ||
pageNumber | query | integer |
Antworten
| Code | Beschreibung |
|---|---|
200 | SMS-Verlauf erfolgreich zurückgegeben |
401 | Ungültiges oder abgelaufenes Token |
Verwalten Sie dynamische Segmente — gespeicherte Filterregeln, die Kontakte automatisch auf Basis von Feldwerten, Verhalten oder Listenzugehörigkeit auswählen.
/SegmentSegmente auflisten
Gibt alle für das Konto gespeicherten dynamischen Segmente zurück.
OAuth-Scope : contacts:read
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
numberOfRecords | query | integer | ||
pageNumber | query | integer |
Antworten
| Code | Beschreibung |
|---|---|
200 | Segmente erfolgreich zurückgegeben |
401 | Ungültiges oder abgelaufenes Token |
/Segment/{id}/ContactKontakte eines Segments auflisten
Mit id_list werden nur die Kontakte dieser Liste im Segment zurückgegeben: diejenigen, die eine Kampagne Liste + Segment erreichen würde. Die Gesamtzahl steht im Header X-Total-Count.
OAuth-Scope : contacts:read
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
id | path | integer (int64) | ja | ID des Segments |
id_list | query | integer (int64) | Auf diese Liste beschränken (optional) | |
numberOfRecords | query | integer | ||
pageNumber | query | integer |
Antworten
| Code | Beschreibung |
|---|---|
200 | Kontakte zurückgegeben |
401 | Ungültiges oder abgelaufenes Token |
404 | Segment oder Liste nicht gefunden |
/Segment/{id}/CountKontakte eines Segments zählen
Nur die Anzahl, um die Größe eines Versands im Voraus zu kennen. Mit id_list werden nur die Kontakte dieser Liste im Segment gezählt.
OAuth-Scope : contacts:read
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
id | path | integer (int64) | ja | ID des Segments |
id_list | query | integer (int64) | Auf diese Liste beschränken (optional) |
Antworten
| Code | Beschreibung |
|---|---|
200 | Anzahl der Kontakte |
401 | Ungültiges oder abgelaufenes Token |
404 | Segment oder Liste nicht gefunden |
Beispiel 200
{
"total": 1250
}
/Segment/{id}/contact/{contactId}/checkPrüfen, ob ein Kontakt einem Segment entspricht
Prüft, ob ein bestimmter Kontakt (per GUID) aktuell den Regeln eines bestimmten Segments entspricht. Nützlich, um Automatisierungslogik bei Bedarf auszulösen.
OAuth-Scope : contacts:read
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
id | path | integer (int64) | ja | Segment-ID |
contactId | path | string (uuid) | ja | Kontakt-GUID |
Antworten
| Code | Beschreibung |
|---|---|
200 | Gibt das Übereinstimmungsergebnis zurück |
401 | Ungültiges oder abgelaufenes Token |
404 | Segment oder Kontakt nicht gefunden |
Senden Sie SMS-Nachrichten an einzelne Kontakte oder an ganze Kontaktlisten. Verwendet das Feld phone_number jedes Kontakts.
/Sms/SingleSMSEinzel-SMS senden
Sendet eine einzelne SMS direkt an eine Telefonnummer. Verwenden Sie dies für transaktionale Nachrichten (OTPs, Bestellbestätigungen, Benachrichtigungen). Die Telefonnummer akzeptiert +41…, 0041… oder 41… mit oder ohne Trennzeichen — siehe Telefonnummernformat in der API-Beschreibung für akzeptierte / abgelehnte Eingaben.
Anfragetext (application/json)
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
phone_number | string | ja | Telefonnummer des Empfängers — akzeptiert +41…, 0041… oder 41… mit oder ohne Trennzeichen. Siehe Telefonnummernformat in der API-Beschreibung. |
message | string | ja | SMS-Nachrichtentext (maximal 160 Zeichen für Standardkodierung) |
date_planned | string (date-time) | Planen Sie den Versand. Weglassen, um sofort zu senden. |
Beispiel
{
"phone_number": "+41791234567",
"message": "Your verification code is 9473. Valid for 10 minutes."
}
Antworten
| Code | Beschreibung |
|---|---|
200 | SMS erfolgreich gesendet oder geplant |
401 | Ungültiges oder abgelaufenes Token |
422 | Ungültiges Telefonnummernformat |
/Sms/CampaignSMS-Kampagne senden
Sendet eine SMS-Nachricht an das Feld phone_number aller Kontakte in einer oder mehreren Listen. Kontakte ohne Telefonnummer werden übersprungen.
Anfragetext (application/json)
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
lists | array of ListRef | ja | Ziel-Kontaktlisten (verwendet das Feld phone_number jedes Kontakts) |
message | string | ja | SMS-Nachrichtentext |
date_planned | string (date-time) | Planen Sie den Versand. Weglassen, um sofort zu senden. |
Beispiel
{
"lists": [
{
"id": 101
}
],
"message": "Flash sale today — 20% off. Shop at mailpro.com",
"date_planned": "2026-04-20T10:00:00"
}
Antworten
| Code | Beschreibung |
|---|---|
200 | SMS-Kampagne erfolgreich gesendet oder geplant |
401 | Ungültiges oder abgelaufenes Token |
/SmsSMS-Verlauf auflisten
Gibt das Protokoll der SMS-Versendungen (sowohl Einzel- als auch Kampagnen-SMS) des Kontos zurück.
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
numberOfRecords | query | integer | ||
pageNumber | query | integer |
Antworten
| Code | Beschreibung |
|---|---|
200 | SMS-Verlauf erfolgreich zurückgegeben |
401 | Ungültiges oder abgelaufenes Token |
/Sms/{id}Geplante SMS stornieren
Storniert eine ausstehende geplante SMS-Sendung.
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
id | path | integer (int64) | ja | ID der SMS-Sendung |
Antworten
| Code | Beschreibung |
|---|---|
200 | Geplante SMS erfolgreich storniert |
401 | Ungültiges oder abgelaufenes Token |
404 | SMS-Sendung nicht gefunden |
/Sms/ScheduledGeplante SMS-Sendungen auflisten
Gibt SMS-Sendungen mit zukünftigem date_planned (noch nicht versendet) zurück, aufsteigend nach Datum sortiert.
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
numberOfRecords | query | integer | ||
pageNumber | query | integer |
Antworten
| Code | Beschreibung |
|---|---|
200 | Geplante SMS-Sendungen erfolgreich zurückgegeben |
401 | Ungültiges oder abgelaufenes Token |
/Sms/{id}/CancelGeplante SMS stornieren
Storniert eine geplante SMS-Sendung nur, wenn diese noch nicht versendet wurde.
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
id | path | integer | ja | ID der SMS-Sendung |
Antworten
| Code | Beschreibung |
|---|---|
200 | Geplante SMS erfolgreich storniert |
401 | Ungültiges oder abgelaufenes Token |
409 | SMS-Sendung nicht gefunden, gehört nicht zum Client oder bereits versendet |
/Sms/{id}/RescheduleGeplante SMS neu planen
Aktualisiert das geplante Sendedatum einer geplanten SMS. Das neue Datum muss in der Zukunft und innerhalb von 90 Tagen liegen. Schlägt fehl, wenn die SMS bereits versendet wurde.
Name des Body-Felds: Die API akzeptiert date_planned (snake_case, primär) sowie die Legacy-Aliasse PlanDate und scheduled_time. Geben Sie einen beliebigen davon an.
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
id | path | integer | ja | ID der SMS-Sendung |
Anfragetext (application/json)
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
date_planned | string (date-time) | Primärer Feldname. | |
PlanDate | string (date-time) | Aus Gründen der Abwärtskompatibilität akzeptierter Legacy-Alias. | |
scheduled_time | string (date-time) | Aus Gründen der Abwärtskompatibilität akzeptierter Legacy-Alias. |
Antworten
| Code | Beschreibung |
|---|---|
200 | Geplante SMS erfolgreich neu geplant |
400 | Fehlendes Datum — geben Sie eines von date_planned / PlanDate / scheduled_time an |
401 | Ungültiges oder abgelaufenes Token |
409 | Neuplanung fehlgeschlagen (nicht gefunden, bereits versendet oder Datum außerhalb des Bereichs) |
Organisieren Sie Nachrichtenvorlagen in Ordnern.
/FolderListListenordner auflisten
Gibt die zur Organisation von Kontaktlisten verwendeten Ordner zurück.
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
name | query | string | Filterung nach Ordnernamen (Teilübereinstimmung) | |
numberOfRecords | query | integer | ||
pageNumber | query | integer |
Antworten
| Code | Beschreibung |
|---|---|
200 | Listenordner erfolgreich zurückgegeben |
401 | Ungültiges oder abgelaufenes Token |
/FolderList/{id}Einzelnen Listenordner abrufen
Gibt die Details eines Listenordners anhand seiner ID zurück.
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
id | path | integer | ja | Ordner-ID |
Antworten
| Code | Beschreibung |
|---|---|
200 | Ordner erfolgreich zurückgegeben |
401 | Ungültiges oder abgelaufenes Token |
404 | Ordner nicht gefunden |
/FolderMessageNachrichtenordner auflisten
Gibt die zur Organisation von E-Mail-Nachrichtenvorlagen verwendeten Ordner zurück.
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
name | query | string | Filterung nach Ordnernamen | |
numberOfRecords | query | integer | ||
pageNumber | query | integer |
Antworten
| Code | Beschreibung |
|---|---|
200 | Nachrichtenordner erfolgreich zurückgegeben |
401 | Ungültiges oder abgelaufenes Token |
Laden Sie eine CSV- oder XLSX-Datei hoch, um Kontakte massenhaft in eine Liste zu importieren. Die Datei wird zur asynchronen Verarbeitung in die Warteschlange eingereiht — verfolgen Sie den Abschluss über die zurückgegebene import_job_id oder über den optionalen webhook_url-Callback.
/Import/UploadKontaktdatei (CSV / XLSX) für Massenimport hochladen
Laden Sie eine CSV- oder XLSX-Datei hoch, um Kontakte in eine Liste zu importieren. Die Datei wird gespeichert und zur asynchronen Verarbeitung in die Warteschlange eingereiht — der Endpunkt gibt sofort eine import_job_id zurück.
Anfragetyp: multipart/form-data
Erforderliche Formularfelder:
id_list (Ganzzahl) — ID der Ziellistefile (Binär) — die hochzuladende CSV- oder XLSX-Dateijson_match_fields (Zeichenfolge, JSON) — welche Spalte der Datei in welches Kontaktfeld geht. email_position = Spalte der E-Mail-Adresse, ab 0 gezählt (erforderlich), phone_position = Spalte der Mobilnummer oder -1, fields = IDs der übrigen Felder (siehe GET /Field), fields_position = Spalte jedes dieser Felder, update_fields = bestehende Kontakte aktualisieren. Fehlende oder ungültige Zuordnung: Antwort 400, es wird kein Import angelegt.Optional:
webhook_url (Zeichenfolge) — HTTPS-URL, die beim Abschluss der Verarbeitung aufgerufen wird. Empfängt einen JSON-Payload mit dem endgültigen Status (success / failed) und der Anzahl der importierten / übersprungenen / ungültigen Zeilen.Dateiformat:
json_match_fields den Feldern zugeordnetAnfragetext (multipart/form-data)
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
id_list | integer (int64) | ja | ID der Zielliste |
file | string (binary) | ja | CSV- oder XLSX-Datei (UTF-8, max. 50 MB) |
json_match_fields | string | ja | JSON-Zuordnung der Dateispalten zu den Kontaktfeldern |
webhook_url | string (uri) | Callback-URL, die beim Abschluss der Verarbeitung aufgerufen wird |
Antworten
| Code | Beschreibung |
|---|---|
200 | Datei akzeptiert und in Warteschlange eingereiht |
400 | Keine Datei hochgeladen, id_list fehlt oder json_match_fields fehlt / ist ungültig |
401 | Ungültiges oder abgelaufenes Token |
500 | Server- oder Speicherfehler |
Beispiel 200
{
"result": "OK",
"import_job_id": 14,
"internal_name": "230575-20260420142615-contacts.csv"
}
Abonnieren Sie mit Ihrem Server Echtzeit-Ereignisbenachrichtigungen. Mailpro sendet einen HMAC-signierten JSON-Payload per POST an Ihre URL, sobald das abonnierte Ereignis eintritt. Im Abschnitt „Webhooks“ der Einführung finden Sie den vollständigen Ereigniskatalog, die Payload-Hülle, Codebeispiele zur Signaturprüfung und die Wiederholungsrichtlinie.
/WebhookWebhooks auflisten
Gibt alle für das authentifizierte Konto konfigurierten Webhooks zurück.
Antworten
| Code | Beschreibung |
|---|---|
200 | Array von Webhooks |
401 | Ungültiges oder abgelaufenes Token |
/WebhookWebhook 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 zur Überprüfung der HMAC-Signatur jedes eingehenden Payloads.
Limits: maximal 20 Webhooks pro Konto, maximal 50 Ereignisse pro Webhook.
Anfragetext (application/json)
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
url | string (uri) | ja | HTTPS-Endpunkt (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 | Frei wählbare Beschreibung für Ihre Referenz |
Beispiel
{
"url": "https://example.com/hooks/mailpro",
"events": [
"email.delivered",
"email.bounced",
"contact.created"
],
"description": "Slack-Integration"
}
Antworten
| Code | Beschreibung |
|---|---|
201 | Webhook erstellt — secret wird ausschließlich hier zurückgegeben |
400 | Ungültige URL, Ereignisliste oder Limit überschritten |
401 | Ungültiges oder abgelaufenes Token |
Beispiel 201
{
"id": 42,
"url": "https://example.com/hooks/mailpro",
"events": [
"email.delivered",
"email.bounced",
"contact.created"
],
"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"
}
/Webhook/{id}Webhook abrufen
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
id | path | integer (int64) | ja |
Antworten
| Code | Beschreibung |
|---|---|
200 | Der Webhook |
404 | Webhook nicht gefunden |
/Webhook/{id}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 | Setzen Sie auf true, um einen automatisch deaktivierten Webhook wieder zu aktivieren, sobald Ihr Endpunkt repariert ist. |
Antworten
| Code | Beschreibung |
|---|---|
200 | Aktualisierter Webhook |
400 | Ungültiger Payload |
404 | Webhook nicht gefunden |
/Webhook/{id}Webhook löschen
Löscht den Webhook und seine vollständige Zustellungshistorie dauerhaft.
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
id | path | integer (int64) | ja |
Antworten
| Code | Beschreibung |
|---|---|
204 | Gelöscht |
404 | Webhook nicht gefunden |
/Webhook/{id}/testTestereignis senden
Reiht sofort ein ping-Ereignis (oder einen beliebigen anderen Ereignistyp über das Body-Feld eventType) für Ihren Endpunkt in die Warteschlange ein. Nützlich, um die Erreichbarkeit und die Signaturprüfung zu verifizieren, bevor Sie sich auf reale Ereignisse verlassen.
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
id | path | integer (int64) | ja |
Anfragetext (application/json)
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
eventType | string | Überschreibt den Ereignistyp (muss von diesem Webhook abonniert sein). ping funktioniert immer. |
Beispiel
{
"eventType": "ping"
}
Antworten
| Code | Beschreibung |
|---|---|
202 | Ereignis zum Versand in die Warteschlange eingereiht |
404 | Webhook nicht gefunden |
Beispiel 202
{
"deliveryId": 1234,
"eventId": "evt_8f3a9b2c4d1e5f6789abcdef01234567",
"eventType": "ping"
}
/Webhook/{id}/rotate-secretHMAC-Secret rotieren
Erstellt ein neues HMAC-Secret und macht das alte sofort ungültig. Das neue Secret wird einmalig in der Antwort zurückgegeben — speichern Sie es. Jede Zustellung ab diesem Zeitpunkt wird mit dem neuen Secret signiert.
Verwenden Sie diese Funktion, wenn Sie den Verdacht haben, dass Ihr Secret kompromittiert wurde.
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
id | path | integer (int64) | ja |
Antworten
| Code | Beschreibung |
|---|---|
200 | Neues Secret (einmalig sichtbar) |
404 | Webhook nicht gefunden |
Beispiel 200
{
"secret": "whsec_XyzA9876BcdE5432FghI1098JklM7654NopQ"
}
/Webhook/{id}/deliveriesZustellversuche auflisten
Gibt die Historie der Zustellversuche für diesen Webhook zurück (30 Tage Aufbewahrung). Nützlich zur Fehlersuche — welche Ereignisse wurden gesendet, welche Statuscodes wurden empfangen, wie viele Wiederholungsversuche und welche Fehlermeldungen.
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
id | path | integer (int64) | ja | |
limit | query | integer | ||
cursor | query | integer (int64) | Paginierungs-Cursor (= zuletzt gesehene Zustellungs-ID). Gibt Zustellungen mit id < cursor zurück. |
Antworten
| Code | Beschreibung |
|---|---|
200 | Array von Zustellversuchen (neueste zuerst) |
404 | Webhook nicht gefunden |
/Webhook/{id}/deliveries/{deliveryId}/replayZustellung wiederholen
Reiht einen frischen Zustellversuch mit demselben Payload wie das Original in die Warteschlange ein. Nützlich, um eine fehlgeschlagene Zustellung nach Behebung Ihres Endpunkts erneut auszulösen. Eine NEUE Webhook_Delivery-Zeile wird angelegt (das Original bleibt zu Prüfzwecken erhalten). Die Wiederholung durchläuft die standardmäßige Wiederholungsrichtlinie (10s → 1min → 5min → 30min → 2h → 6h → 24h, dann aufgegeben).
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
id | path | integer (int64) | ja | |
deliveryId | path | integer (int64) | ja |
Antworten
| Code | Beschreibung |
|---|---|
202 | Wiederholung in Warteschlange eingereiht |
404 | Webhook oder Zustellung nicht gefunden |
Bounces und Abmeldungen des Kontos: auflisten, hinzufügen, entfernen.
/Suppression/BouncesBounces des Kontos auflisten
Die neuesten zuerst. Die Gesamtzahl steht im Header X-Total-Count.
OAuth-Scope : email:read
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
type | query | string: hard, soft | hard oder soft | |
source | query | string | Herkunft des Bounces: list, contact, api oder smtp | |
email | query | string | Genaue Adresse | |
dateFrom | query | string (date-time) | Ab diesem Datum | |
dateTo | query | string (date-time) | Bis zu diesem Datum | |
numberOfRecords | query | integer | ||
pageNumber | query | integer |
Antworten
| Code | Beschreibung |
|---|---|
200 | Bounces zurückgegeben |
400 | type muss hard oder soft sein |
401 | Ungültiges oder abgelaufenes Token |
Beispiel 200
[
{
"id": 5521,
"source": "contact",
"type": "hard",
"email": "[email protected]",
"date": "2026-10-12T08:30:00",
"diag_code": "550 5.1.1 User unknown",
"id_list": 101
}
]
/Suppression/Bounces/{id}Bounce entfernen
source und type sind erforderlich, wie von GET /Suppression/Bounces zurückgegeben: Eine id allein ist nicht eindeutig.
OAuth-Scope : contacts:write
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
id | path | integer (int64) | ja | id des Bounces |
source | query | string | ja | list, contact, api oder smtp |
type | query | string: hard, soft | ja | hard oder soft |
Antworten
| Code | Beschreibung |
|---|---|
200 | Bounce entfernt |
400 | source oder type fehlt |
401 | Ungültiges oder abgelaufenes Token |
404 | Bounce nicht gefunden |
Beispiel 200
{
"result": "ok",
"id": 5521,
"restored": false
}
/Suppression/Bounces/{id}/RestoreKontakt mit Hard Bounce wieder in seine Listen aufnehmen
Nur für einen Hard Bounce mit der Herkunft contact.
OAuth-Scope : contacts:write
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
id | path | integer (int64) | ja | id des Bounces |
Antworten
| Code | Beschreibung |
|---|---|
200 | Kontakt wieder aufgenommen |
401 | Ungültiges oder abgelaufenes Token |
404 | Hard Bounce eines Kontakts nicht gefunden oder Adresse nicht mehr aktiv |
Beispiel 200
{
"result": "ok",
"id": 5521,
"restored": true
}
/Suppression/UnsubscribersAbmeldungen des Kontos auflisten
Die neuesten zuerst. Die Gesamtzahl steht im Header X-Total-Count.
OAuth-Scope : contacts:read
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
source | query | string | Herkunft der Abmeldung: contact, list, smtp, api oder api3 | |
email | query | string | Genaue Adresse | |
dateFrom | query | string (date-time) | Ab diesem Datum | |
dateTo | query | string (date-time) | Bis zu diesem Datum | |
numberOfRecords | query | integer | ||
pageNumber | query | integer |
Antworten
| Code | Beschreibung |
|---|---|
200 | Abmeldungen zurückgegeben |
401 | Ungültiges oder abgelaufenes Token |
Beispiel 200
[
{
"id": 9012,
"source": "api3",
"email": "[email protected]",
"date": "2026-10-20T16:05:00",
"list_name": null,
"comment": "Asked by phone"
}
]
/Suppression/UnsubscribersAbmeldung hinzufügen
Ohne id_list wird die Adresse für das gesamte Konto abgemeldet. Mit id_list nur von dieser Abmeldeliste.
OAuth-Scope : contacts:write
Anfragetext (application/json)
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
email | string | ja | Abzumeldende Adresse |
comment | string | Freier Kommentar | |
id_list | integer (int64) | Abmeldeliste des Kontos (optional) |
Antworten
| Code | Beschreibung |
|---|---|
200 | Erledigt. already_unsubscribed ist true, wenn die Adresse bereits abgemeldet war. |
400 | Eine gültige Adresse ist erforderlich |
401 | Ungültiges oder abgelaufenes Token |
404 | id_list ist keine Abmeldeliste dieses Kontos |
Beispiel 200
{
"result": "ok",
"already_unsubscribed": false
}
/Suppression/Unsubscribers/{id}Abmeldung entfernen
source ist erforderlich, wie von GET /Suppression/Unsubscribers zurückgegeben: Eine id allein ist nicht eindeutig.
OAuth-Scope : contacts:write
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
id | path | integer (int64) | ja | id der Abmeldung |
source | query | string | ja | contact, list, smtp, api oder api3 |
Antworten
| Code | Beschreibung |
|---|---|
200 | Abmeldung entfernt |
400 | source ist erforderlich |
401 | Ungültiges oder abgelaufenes Token |
404 | Abmeldung nicht gefunden |
Beispiel 200
{
"result": "ok",
"removed": 9012
}