Interaktive Dokumentation · Entwicklerportal · OpenAPI-Spezifikation · EN · FR · DE · IT · PT · ES
Basis-URL : https://api.mailpro.com/v2
Die Mailpro™ Email API v2 ermöglicht Ihnen die programmatische Verwaltung von Kontaktlisten, E-Mail-Vorlagen, Absenderadressen und Kampagnen — sowie den Versand von Massen- und Transaktions-E-Mails.
Jeder Endpunkt akzeptiert drei Authentifizierungsmethoden. Verwenden Sie diejenige, die zu Ihrem Stack passt.
POST /token, ohne Scopes.> Der Legacy-Bearer-JWT und IdClient+ApiKey funktionieren unverändert weiter und unterliegen keiner > Scope-Prüfung. Nur OAuth-2.0-Zugriffstokens unterliegen den Scope-Prüfungen pro Endpunkt, > die bei jeder Operation unten angegeben sind.
Mailpro betreibt einen einzigen OAuth-2.0-Autorisierungsserver für alle seine APIs, unter einer einheitlichen, versionsunabhängigen Adresse: https://api.mailpro.com/oauth/. Es gibt keinen OAuth-Endpunkt pro Version — Sie erhalten ein Token über /oauth/token, und dasselbe Token funktioniert mit dieser Email API v2, mit CRM v3 und mit SMS. Welche Endpunkte es aufrufen darf, bestimmen die Scopes des Tokens, nicht die Basis-URL der API. Aussteller (iss-Claim): https://api.mailpro.com/oauth/.
| Endpunkt | URL |
|---|---|
| Autorisierung | GET https://api.mailpro.com/oauth/authorize |
| Token / Erneuerung | POST https://api.mailpro.com/oauth/token |
| JWKS | GET https://api.mailpro.com/oauth/.well-known/jwks |
| Discovery | GET https://api.mailpro.com/oauth/.well-known/openid-configuration |
Grants: authorization_code + PKCE (S256, obligatorisch), client_credentials, refresh_token (Rotation). Gültigkeit des Zugriffstokens: 20 Min.; Refresh-Token: 30 Tage (gleitend, einmalig verwendbar); Autorisierungscode: 60 s.
Schnellstart — Token abrufen und diese API aufrufen (Platzhalter ersetzen; committen Sie niemals ein echtes Secret):
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=email:send email:read"
Rufen Sie anschließend diese API mit Authorization: Bearer ACCESS_TOKEN auf. Dasselbe Token funktioniert mit den APIs CRM v3 und SMS. Ein Token, dem der für einen Endpunkt erforderliche Scope fehlt, erhält 403 insufficient_scope. Vollständiger Ablauf und Scope-Katalog: siehe die Dokumentation der CRM v3 API › Authentifizierung. Für E-Mail relevante Scopes: email:send, email:read, email:templates:read, email:templates:write, contacts:read, contacts:write, account:read.
Authorization: Bearer <access_token>
Sie erhalten ein Token über POST /token (form-kodiert, OAuth2 Password Grant):
POST https://api.mailpro.com/v2/token
Content-Type: application/x-www-form-urlencoded
grant_type=password&username=YOUR_USERNAME&password=YOUR_API_KEY
Dasselbe Token ist auch für die CRM API v3 und die SMS API gültig — einmal authentifizieren, jede API aufrufen. Tokens sind standardmäßig 30 Tage lang gültig; verwenden Sie grant_type=refresh_token, um sie ohne erneute Authentifizierung zu erneuern. Ohne Scopes — bevorzugen Sie OAuth 2.0 für installierbare Integrationen.
Zwei Zugangsdaten:
| Parameter | Typ | Beschreibung |
|---|---|---|
IdClient | integer | Ihre numerische Mailpro-Kundennummer, zu finden unter Einstellungen → API-Zugang |
ApiKey | string | Ihr API-Schlüssel, zu finden unter Einstellungen → API-Zugang |
Senden Sie sie an einer der folgenden Stellen — wählen Sie eine aus:
IdClient: 12345 und ApiKey: a1b2c3d4-…. URLs werden von Webservern, CDNs und Proxys protokolliert, sodass ein Schlüssel im Query-String in Zugriffsprotokollen offengelegt werden kann. Header werden nicht protokolliert.?IdClient=12345&ApiKey=…. Beibehalten zur Abwärtskompatibilität mit bestehenden Integrationen. Wechseln Sie so bald wie möglich zu Headern.IdClient=12345&ApiKey=… in application/x-www-form-urlencoded.Wenn Sie Zugangsdaten an mehreren Stellen angeben, gewinnt der Header.
Für per OAuth ausgestellte Tokens verlangt jede Endpunktgruppe einen Scope (die Legacy-Authentifizierung ist davon ausgenommen). Jede Operation nennt ihren Scope unter Authorization. Übersicht:
| Endpunkte | Erforderlicher Scope |
|---|---|
/send/* (Kampagnen, Transaktional, Planung, Test — außer /send/{IdSend}/status) | email:send |
/stats/* (außer /stats/del), /history/list, /send/{IdSend}/status | email:read |
/message/*, /senderEmail/* (Lesen) | email:templates:read |
/message/*, /senderEmail/* (add/edit/del), /stats/del | email:templates:write |
/list/list, /email/list | contacts:read |
/list/{add,edit,del}, /email/{add,addSingle,edit,del}, /import/upload | contacts:write |
/account/* | account:read |
Eine Scope-Ablehnung liefert 403 mit { "error": "insufficient_scope", "required_scope": "…" }.
Alle Endpunkte unterstützen json (Standard) und xml. Geben Sie das Format in der URL an:
/email/list.json/email/list.xmlGleiche 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).bodyHTML=true) liefern 10 Einträge pro Seite./email/list fügt X-Total-Count (die tatsächliche Gesamtzahl) und X-Truncated: true hinzu, wenn über die Seite hinaus Kontakte verbleiben.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.
| HTTP | Bedeutung |
|---|---|
| 400 | Bad Request — fehlender oder ungültiger Pflichtparameter |
| 401 | Unauthorized — ungültige IdClient oder ungültiger ApiKey |
| 403 | Verboten — Kontolimit erreicht (z. B. maximale Anzahl an Listen) |
| 404 | Nicht gefunden — die angeforderte Ressource existiert nicht |
| 500 | Interner Serverfehler |
Fehler aus Geschäftsregeln:
"Not enough credit available." → 403 — Ihr Konto verfügt über keine E-Mail-Credits mehr"Email address unsubscribed." → 400 — der Empfänger hat sich abgemeldetJede einzeln versendete E-Mail (POST /send/sendmail, die CRM API v3, 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/sendmail.{format} enthält die Kennung der Sendung.email.delivered und email.bounced senden den endgültigen Status an Ihren Server, sobald er feststeht – ganz ohne Abfragen.GET /send/{IdSend}/status.{format} liefert den aktuellen Status (Tabelle unten).status | Bedeutung | Endgültig? |
|---|---|---|
queued | Angenommen, wartet auf den Versand. | nein |
scheduled | Für später geplant (DatePlanned). | nein |
sent | Von unseren Servern übergeben, noch keine Antwort des Empfängerservers. | nein |
delivered | Vom Empfängerserver angenommen (DiagCode = seine SMTP-Antwort). | ja |
bounced | Abgelehnt. BounceType: 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 DatePlanned ist keine Abfrage nötig.Die Status werden 365 Tage aufbewahrt.
Mailpro™ kann Ihren Server in Echtzeit benachrichtigen, wenn bestimmte Ereignisse in Ihrem Konto eintreten (eine E-Mail wird zugestellt, eine Kampagne wird abgeschlossen, ein Kontakt erzeugt einen Bounce usw.). Im Stil von Stripe — Ihre URL empfängt einen HMAC-SHA256-signierten POST, sobald das Ereignis ausgelöst wird.
Jedes an Ihren Webhook gesendete Ereignis zählt als 1 Anfrage in Ihrem Kontingent an API-Anfragen.
POST /webhooks. Die Antwort enthält ein secret, das einmalig angezeigt wird (Stripe-/GitHub-Stil) — speichern Sie es.secret (Codebeispiele unten).> ⏱ Aktivierungsverzögerung — nach dem Erstellen, Aktualisieren oder Löschen eines Webhooks dauert es > bis zu 10 Minuten, bis die Änderung auf allen Mailpro-API-Servern wirksam wird. > In diesem Zeitfenster werden Ereignisse möglicherweise noch nicht von Ihrem neuen Abonnement erfasst > (oder weiterhin von einem soeben entfernten erfasst). 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 Umschlag:
{
"id": "evt_8f3a9b2c4d1e5f6789abcdef01234567",
"type": "email.delivered",
"created": 1748194800,
"apiVersion": "v2",
"account": { "id": 12345, "name": "ACME Corp" },
"data": { "messageId": "...", "email": "[email protected]", "...": "..." }
}
| Feld | Format | Beschreibung |
|---|---|---|
id | evt_ + 32 hex | Eindeutige Ereignis-ID — verwenden Sie sie auf Ihrer Seite als Idempotenzschlüssel. |
type | <domain>.<verb> | Kanonischer Ereignistyp. |
created | Unix-Sekunden UTC | In der HMAC-Signatur enthalten. |
apiVersion | "v2" | Welche Mailpro-API das Ereignis veröffentlicht hat. |
account.id | int | Ihre Mailpro-Kundennummer (= IdClient). |
account.name | string | Ihr Kontoname (praktisch für clientseitiges Debugging). |
data | object | Ereignis-Payload — die Struktur hängt vom type ab (siehe Katalog unten). |
| Ereignis | Auslöser | data-Struktur |
|---|---|---|
ping | Test über POST /webhooks/{id}/test | { message } |
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-Treffer | { messageId, email, campaignId, openedAt, ip, userAgent } |
email.clicked | Klick auf einen 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 | Abmelde-Link angeklickt | { 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 } |
credits.low | E-Mail-Credit-Guthaben unter Ihrem Warnschwellenwert | { remaining, threshold } |
Abonnieren Sie alle Ereignisse dieser API, indem Sie ["*"] im events-Array ü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: email.delivered
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 auf demselben Webhook wird dieser automatisch deaktiviert (isActive: false) und Sie erhalten eine Benachrichtigungs-E-Mail. Aktivieren Sie ihn mit PUT /webhooks/{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 s) zählt als Fehlschlag und löst Wiederholungen aus. Falls Ihr Endpunkt dauerhaft nicht mehr erreichbar ist, geben Sie explizit 410 Gone zurück — Wiederholungen werden weiterhin durchgeführt, aber der Grund des Fehlschlags ist in Ihrem Zustellungsprotokoll klarer ersichtlich.
| Limit | Wert |
|---|---|
| Webhooks pro Konto | 20 |
| Abonnierte Ereignisse pro Webhook | 50 |
| Maximale Payload-Größe | 256 KB |
| HTTP-Timeout pro Versuch | 10 Sekunden |
| Aufbewahrungsdauer des Zustellungsverlaufs | 30 Tage |
Beziehen Sie ein Bearer-JWT-Token, um alle anderen API-Aufrufe zu authentifizieren. Der v2-Endpunkt /token ist eine 307-Weiterleitung an den kanonischen Aussteller /v3/token — Ihr HTTP-Client folgt der Weiterleitung transparent (POST-Methode und Body bleiben erhalten).
/tokenAccess-Token beziehen (307-Weiterleitung zu /v3/token)
Bezieht ein Bearer-JWT-Token unter Verwendung der Mailpro-Client-Zugangsdaten. Übergeben Sie das zurückgegebene access_token in allen nachfolgenden Anfragen als Authorization: Bearer <token>. Dasselbe Token ist auch für die CRM API v3 und die SMS API gültig.
> ⚙ Implementierungsdetail — POST /v2/token ist eine 307 Temporary > Redirect zu POST /v3/token (konfiguriert auf der IIS-web.config- > Rewrite-Ebene). HTTP 307 erhält sowohl die Methode (POST) als > auch den Request-Body, sodass jeder standardkonforme HTTP-Client > der Weiterleitung transparent folgt — Sie senden weiterhin POST-Anfragen > an /v2/token und erhalten ein gültiges JWT zurück. Es gibt keine > doppelte Token-Ausstellungslogik; die Email v2 API stellt selbst niemals > Tokens aus.
| Grant-Typ | Anwendungsfall |
|---|---|
password | Standardintegration — Benutzername + API-Schlüssel |
refresh_token | Erneuern eines ablaufenden Access-Tokens ohne erneute Authentifizierung |
client_credentials | Server-zu-Server allein mit Client-Kennung |
Verwenden Sie grant_type=refresh_token, um das Access-Token ohne erneute Authentifizierung zu erneuern. Speichern Sie Tokens serverseitig (Vault, Umgebungsvariablen); betten Sie sie niemals in Browser-JS oder Mobile-App- Binärdateien ein. Den vollständigen Sicherheitshinweis finden Sie in der Dokumentation des CRM-API-v3-Endpunkts /token.
Anfragetext (application/x-www-form-urlencoded)
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
grant_type | string: password, refresh_token, client_credentials | ja | |
username | string | Ihr Mailpro-Benutzername (E-Mail). Erforderlich für 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-Kundenkennung (Ganzzahl). Erforderlich für den client_credentials-Grant. |
Antworten
| Code | Beschreibung |
|---|---|
200 | Token erfolgreich ausgestellt. Wird von POST /v3/token nach dem
transparenten 307-Follow zurückgegeben — Ihr HTTP-Client erhält ein
normales 200 mit derselben Body-Struktur, die er direkt vom v3-Token-
Endpunkt erhalten würde.
|
307 | Temporäre Weiterleitung an POST /v3/token, ausgestellt durch die
IIS-Rewrite-Regel in web.config. Standardkonforme HTTP-Clients folgen
dieser automatisch und erhalten dabei die ursprüngliche POST-Methode
und den Formular-Body. Nur für Clients sichtbar, die das Folgen von
Weiterleitungen explizit deaktivieren (z. B. curl --max-redirs 0).
|
400 | Ungültige Zugangsdaten 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."
}
Prüfen Sie Ihr E-Mail-Credit-Guthaben, Ihr monatliches API-Kontingent und Ihren Abonnementstatus.
/account/credits.{format}E-Mail-Credit-Guthaben abrufen
Gibt das verbleibende E-Mail-Credit-Guthaben Ihres Mailpro-Kontos zurück. Jede versendete E-Mail verbraucht einen Credit. Credits verfallen nicht mit dem Abonnement, sind jedoch nur nutzbar, solange das Abonnement aktiv ist.
OAuth-Scope : account:read
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
Antworten
| Code | Beschreibung |
|---|---|
200 | Credit-Guthaben erfolgreich zurückgegeben |
401 | Ungültige Zugangsdaten |
Beispiel 200
{
"Credits": 48500
}
/account/subscriptionEndDate.{format}Ablaufdatum des Abonnements abrufen
Gibt das Ablaufdatum des aktuellen Mailpro-Abonnements zurück. Nach dem Ablaufdatum werden Versendungen blockiert, bis das Abonnement verlängert wird.
OAuth-Scope : account:read
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
Antworten
| Code | Beschreibung |
|---|---|
200 | Ablaufdatum des Abonnements erfolgreich zurückgegeben |
401 | Ungültige Zugangsdaten |
Beispiel 200
{
"SubscriptionEndDate": "2027-01-15T00:00:00"
}
/account/limits.{format}Monatliches API-Kontingent abrufen
Gibt das monatliche API-Anfrage-Kontingent für den authentifizierten Client zurück.
Kontingentberechnung: Das Limit wird aus den E-Mail-Abonnement-Credits abgeleitet (typischerweise subscription_credits × 5). Bei einem Plan mit 10.000 E-Mails/Monat ergibt das ein monatliches Budget von 50.000 Anfragen. Zurückgesetzt am Jahrestag des Abonnements (nicht am Ersten des Kalendermonats).
Was Credits verbraucht:
v2, v3 oder sms.Was KOSTENLOS ist (verbraucht keine Credits):
/health-Endpunkte.401, 403 oder 429 fehlschlagen.Das Kontingent wird über alle 3 Mailpro-APIs (v2, v3, sms) hinweg geteilt — ein Kunde = ein monatliches Budget für die gesamte Plattform.
OAuth-Scope : account:read
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
Antworten
| Code | Beschreibung |
|---|---|
200 | Momentaufnahme des Kontingents |
401 | Ungültige Zugangsdaten |
404 | Kein Kontingent-Datensatz gefunden (neu erstelltes Konto; der Eintrag wird bei der ersten authentifizierten Anfrage angelegt). |
Beispiel 200
{
"MonthlyLimit": 50000,
"Remaining": 32847,
"Used": 17153,
"IsFree": false,
"RemainedSendsForFree": 0
}
Verwalten Sie Listen (Kontaktlisten). Eine Liste gruppiert Kontakte für Massenkampagnen. Maximal 1.000 Listen pro Konto (gleiche Grenze für die drei Mailpro-APIs und in der App). Type 0 = Standardliste. Type 1 = Sperrliste (zur Verwaltung von Abmeldungen).
/list/list.{format}Alle Listen auflisten
Gibt alle Listen des Kontos zurück, sortiert nach Erstellungsdatum (neueste zuerst), sofern nicht sortByName=true gesetzt ist. Verwenden Sie type=0 für reguläre Listen oder type=1 für Sperrlisten.
> Veralteter Alias: /addressbook/list.{format} — derselbe Endpunkt, aus Gründen der Abwärtskompatibilität beibehalten. Neue Integrationen sollten /list/* verwenden.
OAuth-Scope : contacts:read
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
titleFilter | query | string | Nach Titel filtern (teilweise, Groß-/Kleinschreibung ignorierend) | |
type | query | integer: 0, 1 | 0 = nur Standardlisten, 1 = nur Sperrlisten. Weglassen, um alle zurückzugeben. | |
numberOfRecords | query | integer | Einträge pro Seite — standardmäßig und maximal 5.000 (siehe Paginierung). | |
pageNumber | query | integer | Seitennummer (1-basiert). Standardwert ist 1. | |
sortByName | query | boolean | Auf true setzen, um die Ergebnisse alphabetisch nach Titel zu sortieren |
Antworten
| Code | Beschreibung |
|---|---|
200 | Listen erfolgreich zurückgegeben.
> Die Antwort enthält zusätzlich das veraltete Duplikat-Feld AddressBookList (identischer Inhalt), und jedes Element enthält ein veraltetes Duplikat AddressBookID (identisch mit ListID). Neue Integrationen sollten diese ignorieren.
|
401 | Ungültige Zugangsdaten |
Beispiel 200
{
"Lists": [
{
"ListID": 101,
"Title": "Newsletter — France",
"Type": 0,
"NumberEmails": 4521,
"CreationDate": "2025-01-15T10:30:00"
},
{
"ListID": 102,
"Title": "Unsubscribers",
"Type": 1,
"NumberEmails": 312,
"CreationDate": "2025-01-15T10:31:00"
}
]
}
/list/add.{format}Liste erstellen
Erstellt eine neue Liste (Kontaktliste). Die Liste ist zunächst leer — fügen Sie Kontakte über /email/add oder /email/addSingle hinzu. Maximal 1.000 Listen pro Konto (gleiche Grenze für die drei Mailpro-APIs und in der App). Gibt HTTP 422 zurück, wenn das Limit erreicht ist.
> Veralteter Alias: /addressbook/add.{format} — derselbe Endpunkt, aus Gründen der Abwärtskompatibilität beibehalten.
OAuth-Scope : contacts:write
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
Anfragetext (application/x-www-form-urlencoded)
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
Title | string | ja | Anzeigename für die neue Liste |
Type | integer: 0, 1 | 0 = Standardliste (Standard), 1 = Sperrliste |
Antworten
| Code | Beschreibung |
|---|---|
200 | Liste erfolgreich erstellt.
> Ein veraltetes Duplikat-Feld AddressBookList wird ebenfalls zurückgegeben (identischer Inhalt).
|
400 | Fehlender Titel |
401 | Ungültige Zugangsdaten |
422 | Listenlimit (1.000) erreicht |
Beispiel 200
{
"Lists": [
{
"ListID": 103,
"Title": "Spring Campaign 2026",
"Type": 0,
"NumberEmails": 0,
"CreationDate": "2026-04-14T12:00:00"
}
]
}
/list/edit.{format}Liste umbenennen
Aktualisiert den Titel einer bestehenden Liste. Die enthaltenen Kontakte sind davon nicht betroffen.
> Veralteter Alias: /addressbook/edit.{format} — derselbe Endpunkt, aus Gründen der Abwärtskompatibilität beibehalten. > Der Parametername AddressBookID wird ebenfalls als veralteter Alias für ListID akzeptiert.
OAuth-Scope : contacts:write
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
Anfragetext (application/x-www-form-urlencoded)
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
ListID | integer | ja | Kennung der umzubenennenden Liste (aus /list/list). Der veraltete Alias AddressBookID wird ebenfalls akzeptiert. |
Title | string | ja | Neuer Titel der Liste |
Antworten
| Code | Beschreibung |
|---|---|
200 | Liste erfolgreich umbenannt |
400 | Fehlende ListID oder fehlender Titel |
401 | Ungültige Zugangsdaten |
404 | Liste nicht gefunden |
/list/del.{format}Liste löschen
Löscht eine Liste und alle darin enthaltenen Kontakte dauerhaft. Diese Aktion kann nicht rückgängig gemacht werden.
> Veralteter Alias: /addressbook/del.{format} — derselbe Endpunkt, aus Gründen der Abwärtskompatibilität beibehalten. > Der Parametername AddressBookID wird ebenfalls als veralteter Alias für ListID akzeptiert.
OAuth-Scope : contacts:write
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
Anfragetext (application/x-www-form-urlencoded)
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
ListID | integer | ja | Kennung der zu löschenden Liste. Der veraltete Alias AddressBookID wird ebenfalls akzeptiert. |
Antworten
| Code | Beschreibung |
|---|---|
200 | Liste erfolgreich gelöscht |
400 | Fehlende ListID |
401 | Ungültige Zugangsdaten |
404 | Liste nicht gefunden |
Beispiel 200
{
"Result": "OK"
}
Verwalten Sie einzelne E-Mail-Kontakte. Kontakte gehören zu einer oder mehreren Listen. Verwenden Sie den Massenimport (/email/add) für große Stapel oder das Hinzufügen einzelner Kontakte (/email/addSingle) für individuelle Anmeldungen mit benutzerdefinierten Feldwerten.
/email/list.{format}Kontakte auflisten
Gibt eine paginierte Liste der E-Mail-Kontakte des Kontos zurück. Filtern Sie nach Liste oder nach E-Mail-Muster. Die Ergebnisse sind bei sortByName=true alphabetisch sortiert, andernfalls nach Einfügereihenfolge.
OAuth-Scope : contacts:read
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
emailFilter | query | string | Nach E-Mail-Adresse filtern (teilweise, Groß-/Kleinschreibung ignorierend) | |
listId | query | integer | Nur Kontakte in dieser Liste zurückgeben. Der veraltete Alias addressBookId wird ebenfalls akzeptiert. | |
numberOfRecords | query | integer | Einträge pro Seite — standardmäßig und maximal 5.000 (siehe Paginierung). | |
pageNumber | query | integer | Seitennummer (1-basiert). Standardwert ist 1. | |
sortByName | query | boolean | Auf true setzen, um die Ergebnisse alphabetisch nach E-Mail-Adresse zu sortieren |
Antworten
| Code | Beschreibung |
|---|---|
200 | Kontaktliste erfolgreich zurückgegeben |
401 | Ungültige Zugangsdaten |
Beispiel 200
{
"Emails": [
{
"IdEmail": 10001,
"Email": "[email protected]",
"Field1": "Alice",
"Field2": "Dupont"
}
]
}
/email/add.{format}Kontakte importieren (Massenimport)
Importiert eine oder mehrere E-Mail-Adressen in einem einzigen Anfrageaufruf in eine Liste. Geben Sie die Adressen in EmailList, getrennt durch Semikolons, an.
Beispiel: [email protected];[email protected];[email protected]
Dieser Endpunkt importiert ausschließlich E-Mail-Adressen. Wenn Sie auch benutzerdefinierte Feldwerte setzen möchten, verwenden Sie stattdessen /email/addSingle für jeden Kontakt.
Zuvor abgemeldete Adressen werden stillschweigend übersprungen, sofern Force=1 nicht gesetzt ist.
Listenauswahl: Geben Sie ListId (oder den veralteten Alias AddressBookId) an. Mindestens einer ist erforderlich.
OAuth-Scope : contacts:write
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
Anfragetext (application/x-www-form-urlencoded)
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
ListId | integer | Kennung der Zielliste. Der veraltete Alias AddressBookId wird ebenfalls akzeptiert. | |
EmailList | string | ja | Durch Semikolons getrennte zu importierende E-Mail-Adressen |
Force | integer: 0, 1 | Auf 1 setzen, um zuvor abgemeldete Adressen erneut zu importieren.
Standard: 0 (abgemeldete Adressen werden übersprungen).
|
Antworten
| Code | Beschreibung |
|---|---|
200 | Kontakte erfolgreich importiert |
400 | Fehlende EmailList |
401 | Ungültige Zugangsdaten |
Beispiel 200
{
"Result": "3 contacts imported"
}
/email/addSingle.{format}Einzelnen Kontakt hinzufügen
Fügt einer Liste einen einzelnen Kontakt mit optionalen benutzerdefinierten Feldwerten hinzu.
Field1 bis Field25 entsprechen den benutzerdefinierten Spaltendefinitionen Ihrer Liste. Die Zuordnung hängt von der Reihenfolge ab, in der die Spalten definiert wurden — prüfen Sie in den Listeneinstellungen in der Mailpro-Oberfläche, welche Feldnummer welcher Spalte entspricht (z. B. Field1 = Vorname, Field2 = Nachname, Field3 = Stadt …).
Listenauswahl: Geben Sie ListId (oder den veralteten Alias AddressBookId) an.
OAuth-Scope : contacts:write
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
Anfragetext (application/x-www-form-urlencoded)
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
ListId | integer | Kennung der Zielliste. Der veraltete Alias AddressBookId wird ebenfalls akzeptiert. | |
Email | string | ja | E-Mail-Adresse des neuen Kontakts |
Force | integer: 0, 1 | Auf 1 setzen, um eine zuvor abgemeldete Adresse erneut hinzuzufügen | |
Field1 | string | Wert für benutzerdefiniertes Feld 1 (Spaltenzuordnung abhängig von Ihrer Liste) | |
Field2 | string | Wert für benutzerdefiniertes Feld 2 | |
Field3 | string | Wert für benutzerdefiniertes Feld 3 | |
Field4 | string | Wert für benutzerdefiniertes Feld 4 | |
Field5 | string | Wert für benutzerdefiniertes Feld 5 |
Antworten
| Code | Beschreibung |
|---|---|
200 | Kontakt erfolgreich hinzugefügt |
400 | Fehlende E-Mail |
401 | Ungültige Zugangsdaten |
Beispiel 200
{
"EmailId": 10002,
"Email": "[email protected]",
"Field1": "Alice",
"Field2": "Dupont",
"ListID": 101
}
/email/edit.{format}Kontakt aktualisieren
Aktualisiert die E-Mail-Adresse und/oder die benutzerdefinierten Feldwerte eines bestehenden Kontakts. Identifizieren Sie den Kontakt anhand der EmailId (aus /email/list). Sowohl EmailId als auch Email sind erforderlich.
OAuth-Scope : contacts:write
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
Anfragetext (application/x-www-form-urlencoded)
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
EmailId | integer | ja | Kennung des zu aktualisierenden Kontakts (aus /email/list) |
Email | string | ja | Neue E-Mail-Adresse für den Kontakt |
Field1 | string | Neuer Wert für benutzerdefiniertes Feld 1 | |
Field2 | string | Neuer Wert für benutzerdefiniertes Feld 2 | |
Field3 | string | Neuer Wert für benutzerdefiniertes Feld 3 |
Antworten
| Code | Beschreibung |
|---|---|
200 | Kontakt erfolgreich aktualisiert |
400 | Fehlende EmailId oder fehlende E-Mail |
401 | Ungültige Zugangsdaten |
404 | Kontakt nicht gefunden |
/email/del.{format}Kontakt löschen
Löscht einen Kontakt anhand seiner eindeutigen Kennung dauerhaft.
OAuth-Scope : contacts:write
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
Anfragetext (application/x-www-form-urlencoded)
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
EmailId | integer | ja | Kennung des zu löschenden Kontakts (aus /email/list) |
Antworten
| Code | Beschreibung |
|---|---|
200 | Kontakt erfolgreich gelöscht |
400 | Fehlende EmailId |
401 | Ungültige Zugangsdaten |
404 | Kontakt nicht gefunden |
Verwalten Sie HTML-E-Mail-Vorlagen. Eine Nachrichtenvorlage speichert Ihren E-Mail-Betreff, den HTML-Body und die Konfiguration des Abmeldelinks. Vorlagen werden über mehrere Kampagnen hinweg wiederverwendet.
/message/list.{format}Nachrichtenvorlagen auflisten
Gibt die gespeicherten HTML-E-Mail-Vorlagen des Kontos zurück. Standardmäßig ist der HTML-Body nicht in der Antwort enthalten, um die Payload klein zu halten. Setzen Sie bodyHTML=true, um ihn einzuschließen (die Ergebnisse werden dann automatisch auf 10 pro Seite begrenzt).
OAuth-Scope : email:templates:read
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
subjectFilter | query | string | Nach Betreff filtern (teilweise, Groß-/Kleinschreibung ignorierend) | |
numberOfRecords | query | integer | Einträge pro Seite — standardmäßig und maximal 5.000 (siehe Paginierung). | |
pageNumber | query | integer | Seitennummer (1-basiert). Standardwert ist 1. | |
bodyHTML | query | boolean | Auf true setzen, um den vollständigen HTML-Body in jedes Ergebnis aufzunehmen.
Bei true werden die Ergebnisse unabhängig von numberOfRecords automatisch auf 10 pro Seite begrenzt.
|
Antworten
| Code | Beschreibung |
|---|---|
200 | Nachrichtenvorlagen erfolgreich zurückgegeben |
401 | Ungültige Zugangsdaten |
Beispiel 200
{
"MessageList": [
{
"IDMessage": 501,
"Subject": "Spring Newsletter — April 2026",
"Language": "EN",
"LinkAlign": "center",
"LinkUp": 0,
"UpdateDate": "2026-03-10T14:22:00"
}
]
}
/message/add.{format}Nachrichtenvorlage erstellen
Erstellt eine neue HTML-E-Mail-Vorlage. Die Vorlage speichert den Betreff, den HTML-Body und die Einstellungen des Abmeldelinks. Nach der Erstellung verwenden Sie die zurückgegebene IDMessage beim Starten einer Kampagne.
OAuth-Scope : email:templates:write
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
Anfragetext (application/x-www-form-urlencoded)
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
Subject | string | ja | Betreffzeile der E-Mail (max. 255 Zeichen) |
BodyHTML | string | ja | Vollständiger HTML-Inhalt des E-Mail-Bodys |
Language | string | ja | Sprachcode für die Lokalisierung des Abmeldelinks (z. B. EN, FR, DE) |
LinkAlign | string: left, center, right | ja | Horizontale Ausrichtung des Abmeldelinks |
LinkUp | integer: 0, 1 | ja | Position des Abmeldelinks — 0 = unten in der E-Mail, 1 = oben |
Antworten
| Code | Beschreibung |
|---|---|
200 | Nachrichtenvorlage erfolgreich erstellt |
400 | Fehlendes Pflichtfeld |
401 | Ungültige Zugangsdaten |
Beispiel 200
{
"IDMessage": 502,
"Subject": "Spring Newsletter — April 2026",
"Language": "EN",
"LinkAlign": "center",
"LinkUp": 0
}
/message/edit.{format}Nachrichtenvorlage aktualisieren
Aktualisiert den Inhalt und die Metadaten einer bestehenden Nachrichtenvorlage.
OAuth-Scope : email:templates:write
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
Anfragetext (application/x-www-form-urlencoded)
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
MessageId | integer | ja | Kennung der zu aktualisierenden Nachrichtenvorlage (aus /message/list) |
Subject | string | ja | Neue Betreffzeile der E-Mail |
BodyHTML | string | ja | Neuer HTML-Inhalt des E-Mail-Bodys |
Language | string | ja | Sprachcode für die Lokalisierung des Abmeldelinks |
LinkAlign | string: left, center, right | ja | |
LinkUp | integer: 0, 1 | ja |
Antworten
| Code | Beschreibung |
|---|---|
200 | Nachrichtenvorlage erfolgreich aktualisiert |
400 | Fehlendes Pflichtfeld |
401 | Ungültige Zugangsdaten |
404 | Nachrichtenvorlage nicht gefunden |
/message/del.{format}Nachrichtenvorlage löschen
Löscht eine Nachrichtenvorlage anhand ihrer eindeutigen Kennung dauerhaft. Vorlagen, die von ausstehenden geplanten Kampagnen verwendet werden, können nicht gelöscht werden.
OAuth-Scope : email:templates:write
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
Anfragetext (application/x-www-form-urlencoded)
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
MessageId | integer | ja | Kennung der zu löschenden Nachrichtenvorlage (aus /message/list) |
Antworten
| Code | Beschreibung |
|---|---|
200 | Nachrichtenvorlage erfolgreich gelöscht |
400 | Fehlende MessageId |
401 | Ungültige Zugangsdaten |
404 | Nachrichtenvorlage nicht gefunden |
Versenden Sie E-Mail-Massenkampagnen an eine Liste und verwalten Sie geplante Versendungen. Eine Kampagne verwendet eine Nachrichtenvorlage und eine Absenderadresse.
/send/list.{format}Geplante Kampagnen auflisten
Gibt die Liste der geplanten und kürzlich verarbeiteten E-Mail-Kampagnen zurück. Die Ergebnisse sind nach geplantem Versanddatum (neueste zuerst) sortiert.
OAuth-Scope : email:send
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
subjectMessageFilter | query | string | Nach Kampagnenbetreff filtern (teilweise, Groß-/Kleinschreibung ignorierend) | |
numberOfRecords | query | integer | Einträge pro Seite — standardmäßig und maximal 5.000 (siehe Paginierung). | |
pageNumber | query | integer | Seitennummer (1-basiert). Standardwert ist 1. |
Antworten
| Code | Beschreibung |
|---|---|
200 | Kampagnenliste erfolgreich zurückgegeben |
401 | Ungültige Zugangsdaten |
Beispiel 200
{
"sends": [
{
"IDSend": 3001,
"ListID": 101,
"SenderEmail": "[email protected]",
"SenderName": "Your Company Newsletter",
"DatePlanned": "2026-04-20T09:00:00",
"SubjectMessage": "Spring Newsletter — April 2026",
"NumberCredit": 4521
}
]
}
/send/campaign.{format}Kampagne starten
Plant oder versendet sofort eine E-Mail-Kampagne an eine Liste unter Verwendung einer gespeicherten Nachrichtenvorlage und einer Absenderadresse.
Erforderlich:
IDMessage — die zu versendende Vorlage (aus /message/list)IDEmailExp — die zu verwendende Absenderadresse (aus /senderEmail/list)ListId — die Empfängerliste (aus /list/list). Der veraltete Alias IDAddressBook wird ebenfalls akzeptiert.Planung: Setzen Sie DatePlanned auf ein zukünftiges ISO-8601-Datum/-Uhrzeit, um den Versand zu planen. Lassen Sie DatePlanned weg, um sofort zu versenden.
Statistik-Tracking: Setzen Sie Campaign=1 und geben Sie einen TitleCampaign an, um die Verfolgung von Öffnungen/Klicks/Bounces im Abschnitt Statistik zu aktivieren.
OAuth-Scope : email:send
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
Anfragetext (application/x-www-form-urlencoded)
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
ListId | integer | Kennung der Empfängerliste (aus /list/list). Der veraltete Alias IDAddressBook wird ebenfalls akzeptiert. | |
IDMessage | integer | ja | Kennung der zu versendenden Nachrichtenvorlage (aus /message/list) |
IDEmailExp | integer | ja | Kennung der zu verwendenden Absender-E-Mail-Adresse (aus /senderEmail/list) |
IDUnsubscribeList | integer | Liste, die zum Sammeln abgemeldeter Kontakte verwendet wird (Sperrliste).
Der veraltete Alias IDUnsubscribeAddressBook wird ebenfalls akzeptiert.
| |
DatePlanned | string (date-time) | Geplantes Versanddatum/-uhrzeit (ISO 8601). Weglassen, um sofort zu versenden. | |
Campaign | integer: 0, 1 | Auf 1 setzen, um diesen Versand in den Statistiken als benannte Kampagne zu verfolgen | |
TitleCampaign | string | In den Statistiken angezeigter Kampagnentitel (erforderlich bei Campaign=1) |
Antworten
| Code | Beschreibung |
|---|---|
200 | Kampagne erfolgreich geplant oder versendet.
> Die Antwort enthält außerdem die veralteten Aliase AddressBookID und UnsubscribeAddressBookID (identisch mit ListID / UnsubscribeListID). Neue Integrationen sollten diese ignorieren.
|
400 | Fehlende IDMessage oder IDEmailExp |
401 | Ungültige Zugangsdaten |
403 | Nicht genügend E-Mail-Credits |
404 | Liste, Nachricht oder Absender nicht gefunden |
Beispiel 200
{
"send": {
"IDSend": 3002,
"ListID": 101,
"UnsubscribeListID": 102,
"IDCampaign": 8001,
"SenderName": "Your Company Newsletter",
"SenderEmail": "[email protected]",
"DatePlanned": "2026-04-20T09:00:00",
"SubjectMessage": "Spring Newsletter — April 2026",
"NumberCredit": 4521
}
}
/send/del.{format}Kampagne stornieren oder löschen
Storniert einen ausstehenden geplanten Kampagnenversand oder löscht einen abgeschlossenen Versand. Nur zukünftig geplante Versendungen können storniert werden — laufende Versendungen können nicht gestoppt werden.
OAuth-Scope : email:send
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
Anfragetext (application/x-www-form-urlencoded)
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
IdSend | integer | ja | Kennung des zu stornierenden oder zu löschenden Kampagnenversands (aus /send/list) |
Antworten
| Code | Beschreibung |
|---|---|
200 | Kampagne erfolgreich storniert oder gelöscht |
400 | Fehlende IdSend |
401 | Ungültige Zugangsdaten |
404 | Kampagne nicht gefunden |
Beispiel 200
{
"Result": "Campaign Deleted"
}
/send/scheduled.{format}Meine geplanten E-Mail-Kampagnen auflisten
Gibt die E-Mail-Kampagnen und Einzelversendungen zurück, die für ein zukünftiges Datum geplant und noch nicht versendet wurden. Nützlich vor dem Aufruf von /cancel oder /reschedule. Die Datensätze sind aufsteigend nach DatePlanned sortiert.
OAuth-Scope : email:send
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
numberOfRecords | query | integer | Einträge pro Seite — standardmäßig und maximal 5.000 (siehe Paginierung). | |
pageNumber | query | integer | Seitennummer (1-basiert). Standardwert ist 1. |
Antworten
| Code | Beschreibung |
|---|---|
200 | Liste der geplanten Kampagnen/Versendungen.
> Jeder Datensatz enthält außerdem die veralteten Aliase AddressBookID und
> UnsubscribeAddressBookID (identisch mit ListID / UnsubscribeListID).
|
401 | Ungültige Zugangsdaten |
Beispiel 200
{
"sends": [
{
"IDSend": 5001,
"ListID": 101,
"UnsubscribeListID": 102,
"IDCampaign": 8001,
"SenderName": "Your Company Newsletter",
"SenderEmail": "[email protected]",
"DatePlanned": "2026-05-01T09:00:00",
"SubjectMessage": "Spring Sale 2026",
"NumberCredit": 4521
}
]
}
/send/{IdSend}/cancel.{format}Geplante Kampagne/Versendung stornieren
Storniert einen geplanten E-Mail-Versand (Kampagne oder Einzelversand), der noch nicht versendet wurde. Wurde der Versand bereits ausgeführt (oder existiert nicht / gehört einem anderen Kunden), wird 409 Conflict zurückgegeben.
OAuth-Scope : email:send
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
IdSend | path | integer | ja |
Antworten
| Code | Beschreibung |
|---|---|
200 | Versand storniert |
401 | Ungültige Zugangsdaten |
409 | Bereits versendet oder nicht gefunden |
Beispiel 200
{
"Result": "OK",
"Cancelled": 5001
}
/send/{IdSend}/reschedule.{format}Geplante Kampagne/Versendung neu planen
Aktualisiert das DatePlanned eines geplanten E-Mail-Versands. Das neue Datum muss in der Zukunft und innerhalb von 90 Tagen liegen.
OAuth-Scope : email:send
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
IdSend | path | integer | ja |
Anfragetext (application/x-www-form-urlencoded)
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
PlanDate | string (date-time) | ja |
Antworten
| Code | Beschreibung |
|---|---|
200 | Versand neu geplant |
400 | Fehlendes oder ungültiges PlanDate |
401 | Ungültige Zugangsdaten |
409 | Bereits versendet, nicht gefunden oder neues Datum außerhalb des zulässigen Bereichs (muss in der Zukunft und innerhalb von 90 Tagen liegen) |
Beispiel 200
{
"Result": "OK",
"IdSend": 5001,
"NewPlanDate": "2026-12-31T14:30:00"
}
/send/sendingTest.{format}Test-E-Mail versenden
Sendet eine Vorschau einer Nachrichtenvorlage an einen angegebenen Empfänger zur Überprüfung vor dem Start der eigentlichen Kampagne. Absender, Vorlage und Testempfänger werden jeweils über ihre Kennungen identifiziert.
OAuth-Scope : email:send
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
Anfragetext (application/x-www-form-urlencoded)
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
MessageId | integer | ja | Kennung der Nachrichtenvorlage für die Vorschau (aus /message/list) |
IDEmailExpFrom | integer | ja | Kennung der zu verwendenden Absenderadresse (aus /senderEmail/list) |
IDEmailExpTo | integer | ja | Kennung der Empfänger-Absenderadresse — die Test-E-Mail wird an diese Adresse gesendet |
Antworten
| Code | Beschreibung |
|---|---|
200 | Test-E-Mail erfolgreich versendet |
400 | Fehlendes Pflichtfeld |
401 | Ungültige Zugangsdaten |
Beispiel 200
{
"SendingTest": {
"IdSendingTest": 7001,
"ToEmail": "[email protected]",
"FromEmail": "[email protected]",
"SenderName": "Your Company Newsletter"
}
}
Versenden Sie einmalige transaktionale E-Mails an einzelne Empfänger. Im Gegensatz zu Kampagnen erfordern transaktionale E-Mails keine Liste — Sie übergeben die Empfänger-E-Mail-Adresse und den HTML-Body direkt.
/send/mail/scheduled.{format}Geplante Einzel-E-Mails auflisten
Gibt die mit /send/sendmail und einem zukünftigen Datum gesendeten Einzel-E-Mails zurück, die noch nicht versendet wurden. Kampagnen werden von /send/scheduled aufgelistet.
OAuth-Scope : email:send
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
Antworten
| Code | Beschreibung |
|---|---|
200 | Geplante E-Mails zurückgegeben |
401 | Ungültige Zugangsdaten |
Beispiel 200
{
"scheduledMails": [
{
"IdSingleSend": 880123,
"Email": "[email protected]",
"Subject": "Your invoice",
"DatePlanned": "2026-12-01T09:00:00"
}
]
}
/send/mail/{IdSingleSend}/cancel.{format}Geplante Einzel-E-Mail stornieren
Storniert die E-Mail, solange sie noch nicht versendet wurde.
OAuth-Scope : email:send
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
IdSingleSend | path | integer (int64) | ja | Von /send/sendmail zurückgegebene IdSingleSend |
Antworten
| Code | Beschreibung |
|---|---|
200 | E-Mail storniert |
401 | Ungültige Zugangsdaten |
409 | Versand nicht gefunden oder bereits erfolgt |
Beispiel 200
{
"Result": "OK",
"Cancelled": 880123
}
/send/mail/{IdSingleSend}/reschedule.{format}Geplante Einzel-E-Mail neu planen
Ändert das Versanddatum. Das neue Datum muss in der Zukunft und innerhalb von 90 Tagen liegen. PATCH wird ebenfalls akzeptiert.
OAuth-Scope : email:send
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
IdSingleSend | path | integer (int64) | ja | Von /send/sendmail zurückgegebene IdSingleSend |
Anfragetext (application/x-www-form-urlencoded)
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
PlanDate | string (date-time) | ja | Neues Versanddatum (ISO 8601) |
Antworten
| Code | Beschreibung |
|---|---|
200 | E-Mail neu geplant |
400 | Datum fehlt oder ist ungültig |
401 | Ungültige Zugangsdaten |
409 | Versand nicht gefunden, bereits erfolgt oder Datum außerhalb des zulässigen Bereichs |
Beispiel 200
{
"Result": "OK",
"IdSingleSend": 880123,
"NewPlanDate": "2026-12-15T09:00:00"
}
/send/sendmail.{format}Transaktionale E-Mail versenden
Versendet eine einmalige transaktionale E-Mail an einen oder mehrere Empfänger. Im Gegensatz zu Kampagnen erfordert dieser Endpunkt keine Liste — die Empfängeradresse und der HTML-Body werden direkt übergeben.
Erforderlich:
IDEmailExp — die Kennung der Absenderadresse (aus /senderEmail/list)EmailData — Empfänger im Format email,field1,field2,...,field25 (durch Kommas getrennt)BodyHTML — der HTML-BodySubject — die BetreffzeileEmailData-Format: [email protected],Alice,Dupont,Paris Der erste Wert ist die E-Mail-Adresse; die Werte 2–26 entsprechen den Feldern Field1–Field25 für Personalisierungsvariablen in Ihrer HTML-Vorlage.
Mehrere Empfänger: Trennen Sie mehrere EmailData-Einträge mit Semikolons: [email protected],Alice;[email protected],Bob
Planung: Setzen Sie DatePlanned auf ein zukünftiges ISO-8601-Datum/-Uhrzeit, oder lassen Sie es weg, um sofort zu versenden.
OAuth-Scope : email:send
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
Anfragetext (multipart/form-data)
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
IDEmailExp | integer | ja | Kennung der zu verwendenden Absender-E-Mail-Adresse (aus /senderEmail/list) |
EmailData | string | ja | Empfänger im Format email,feld1,feld2,...,feld25 (kommagetrennt).
Der erste Wert ist die E-Mail-Adresse; die übrigen sind Personalisierungsfelder,
die Field1–Field25 in Ihrer HTML-Vorlage zugeordnet werden.
Der lokale Teil der E-Mail (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.
|
BodyHTML | string | ja | Vollständiger HTML-Inhalt des E-Mail-Bodys |
Subject | string | ja | Betreffzeile der E-Mail (max. 255 Zeichen) |
attachments | array of string (binary) | Optionale Dateianhänge — senden Sie die Anfrage als multipart/form-data und fügen Sie pro Anhang einen Dateiteil hinzu (beliebiger Feldname). Bis zu 5 Dateien, 10 MB pro Datei, 15 MB insgesamt. 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). Alle anderen Felder dieses Endpunkts (ReplyTo, ActivateStatistics, CustomHeaders, …) funktionieren genau wie in der form-urlencoded-Variante. | |
KeepInMyFiles | 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.
|
Antworten
| Code | Beschreibung |
|---|---|
200 | Transaktionale E-Mail erfolgreich versendet oder geplant |
400 | Fehlendes Pflichtfeld oder ungültiges E-Mail-Format |
401 | Ungültige Zugangsdaten |
403 | Nicht genügend E-Mail-Credits |
404 | Absender nicht gefunden oder E-Mail-Adresse abgemeldet |
Beispiel 200
{
"SingleSend": {
"IdSingleSend": 8001,
"IdEmailExp": 201,
"DatePlanned": "2026-04-15T14:30:00",
"Subject": "Your order #12345 is confirmed",
"Email": "[email protected]",
"Field1": "Alice",
"Field2": "Dupont",
"UnsubscriptionLink": false,
"ActivateStatistics": true
}
}
/send/{IdSend}/status.{format}Zustellstatus einer transaktionalen E-Mail abrufen
Gibt den aktuellen Zustellstatus einer transaktionalen E-Mail zurück, die über /send/sendmail gesendet wurde. Übergeben Sie die IdSingleSend, die dieser Aufruf zurückgegeben hat.
Mögliche Werte: delivered (vom Empfängerserver angenommen, siehe DiagCode), bounced (abgelehnt — BounceType: 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, DatePlanned 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.
OAuth-Scope : email:read
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
IdSend | path | integer | ja | Die von /send/sendmail zurückgegebene IdSingleSend. |
Antworten
| Code | Beschreibung |
|---|---|
200 | Aktueller Zustellstatus |
401 | Ungültige Zugangsdaten |
404 | Kein transaktionaler Versand mit dieser ID für diesen Kunden gefunden |
Beispiel 200
{
"status": {
"IdSingleSend": 8001,
"Email": "[email protected]",
"Status": "delivered",
"DatePlanned": "2026-04-15T14:30:00",
"StatusDate": "2026-04-15T14:30:07",
"DiagCode": "2.0.0 (success)",
"BounceType": null
}
}
Auflistung und Verwaltung validierter Absender-E-Mail-Adressen. Nur verifizierte Adressen können als From-Adresse in Kampagnen verwendet werden.
/senderEmail/list.{format}Validierte Absenderadressen auflisten
Gibt die Liste der für das Konto konfigurierten Absender-E-Mail-Adressen zurück. Nur Adressen mit IsValid: true können beim Versenden von Kampagnen verwendet werden. Neue Adressen werden mit /senderEmail/add hinzugefügt und sind gültig, sobald der Link in der Bestätigungs-E-Mail angeklickt wurde.
OAuth-Scope : email:templates:read
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
emailFilter | query | string | Nach E-Mail-Adresse filtern (teilweise, Groß-/Kleinschreibung ignorierend) | |
numberOfRecords | query | integer | Einträge pro Seite — standardmäßig und maximal 5.000 (siehe Paginierung). | |
pageNumber | query | integer | Seitennummer (1-basiert). Standardwert ist 1. | |
sortByName | query | boolean | Auf true setzen, um die Ergebnisse alphabetisch nach Absendername zu sortieren |
Antworten
| Code | Beschreibung |
|---|---|
200 | Absenderadressen erfolgreich zurückgegeben |
401 | Ungültige Zugangsdaten |
Beispiel 200
{
"ExpEmailList": [
{
"IDEmailExp": 201,
"Email": "[email protected]",
"SenderName": "Your Company Newsletter",
"IsValid": true,
"CreationDate": "2025-06-01T09:00:00"
},
{
"IDEmailExp": 202,
"Email": "[email protected]",
"SenderName": "Your Company Support",
"IsValid": true,
"CreationDate": "2025-06-01T09:05:00"
}
]
}
/senderEmail/add.{format}Absenderadresse 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
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
Anfragetext (application/x-www-form-urlencoded)
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
Email | string | ja | Absenderadresse |
SenderName | string | ja | Den Empfängern angezeigter Name |
Antworten
| Code | Beschreibung |
|---|---|
200 | Adresse hinzugefügt. DomainHasMx ist false, wenn die Domain keinen MX-Eintrag hat. |
400 | Email oder SenderName fehlt |
401 | Ungültige Zugangsdaten |
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",
"ConfirmationSent": true,
"DomainHasMx": true
}
/senderEmail/{IdSenderEmail}/resendValidation.{format}Bestä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 |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
IdSenderEmail | path | integer | ja | ID des Absenders aus /senderEmail/list |
Antworten
| Code | Beschreibung |
|---|---|
200 | E-Mail erneut gesendet |
401 | Ungültige Zugangsdaten |
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",
"ConfirmationSent": true
}
/senderEmail/{IdSenderEmail}/authentication.{format}Domain 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: DkimSettingsUrl öffnet die richtige Seite.
OAuth-Scope : email:templates:read
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
IdSenderEmail | path | integer | ja | ID des Absenders aus /senderEmail/list |
Antworten
| Code | Beschreibung |
|---|---|
200 | Status der Domain. Spf.RecommendedRecord basiert auf Ihrem aktuellen Eintrag: Veröffentlichen Sie ihn nur, wenn Spf.ChangeNeeded true ist. |
401 | Ungültige Zugangsdaten |
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",
"RecommendedRecord": "v=spf1 include:spf.mailpro.com -all",
"ChangeNeeded": 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"
},
"DkimSettingsUrl": "https://app.mailpro.com/dkim/list?d=example.com"
}
/senderEmail/del.{format}Absenderadresse entfernen
Entfernt eine validierte Absender-E-Mail-Adresse aus dem Konto. Absenderadressen, die von geplanten Kampagnen verwendet werden, können nicht gelöscht werden.
OAuth-Scope : email:templates:write
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
Anfragetext (application/x-www-form-urlencoded)
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
idEmailExp | integer | ja | Kennung der zu entfernenden Absenderadresse (aus /senderEmail/list) |
Antworten
| Code | Beschreibung |
|---|---|
200 | Absenderadresse erfolgreich entfernt |
400 | Fehlende idEmailExp |
401 | Ungültige Zugangsdaten |
Beispiel 200
{
"Result": "EmailSender Deleted"
}
Zugriff auf Leistungskennzahlen pro Kampagne: Öffnungen, Klicks, Bounces und mehr. Detaillierte Aufschlüsselungen nach Stunde, Tag, Land, Betriebssystem und E-Mail-Client sind verfügbar.
/stats/list.{format}Kampagnenstatistiken auflisten
Gibt Gesamtleistungskennzahlen für alle Kampagnen zurück: Anzahl der Versendungen, Öffnungsrate, Klickrate, Anzahl der Bounces. Filtern Sie nach Datumsbereich oder Kampagnentitel. Die Ergebnisse sind nach Versanddatum (neueste zuerst) sortiert.
OAuth-Scope : email:read
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
titleCampaignFilter | query | string | Nach Kampagnentitel filtern (teilweise, Groß-/Kleinschreibung ignorierend) | |
numberOfRecords | query | integer | Einträge pro Seite — standardmäßig und maximal 5.000 (siehe Paginierung). | |
pageNumber | query | integer | Seitennummer (1-basiert). Standardwert ist 1. | |
dateStart | query | string (date-time) | Beginn des Datumsbereichsfilters (ISO 8601) | |
dateEnd | query | string (date-time) | Ende des Datumsbereichsfilters (ISO 8601) |
Antworten
| Code | Beschreibung |
|---|---|
200 | Kampagnenstatistiken erfolgreich zurückgegeben |
401 | Ungültige Zugangsdaten |
Beispiel 200
{
"Campaigns": [
{
"IdCampaign": 8001,
"DateCampaign": "2026-04-20T09:00:01",
"TitleCampaign": "Spring Newsletter April 2026",
"NumberEmailSend": 4521,
"NumberEmailOpen": 1823,
"NumberEmailClick": 342,
"BadMail": 12,
"NumberUnsubscribers": 8,
"NumberComplaints": 1,
"SpamTrap": 0,
"DeliverabilityScore": 98
}
]
}
/stats/byHour.{format}Statistik nach Stunde
Gibt die stündliche Aufschlüsselung der Öffnungen und Klicks für eine bestimmte Kampagne zurück. Nützlich, um die optimale Versandzeit zu ermitteln.
OAuth-Scope : email:read
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
idCampaign | query | integer | ja | Kennung der Kampagne (aus /stats/list) |
Antworten
| Code | Beschreibung |
|---|---|
200 | Stündliche Statistiken erfolgreich zurückgegeben |
401 | Ungültige Zugangsdaten |
Beispiel 200
{
"ByHour": [
{
"Hour": 9,
"Opens": 823,
"Clicks": 142
},
{
"Hour": 10,
"Opens": 512,
"Clicks": 98
}
]
}
/stats/byDay.{format}Statistik nach Tag
Gibt die tägliche Aufschlüsselung der Öffnungen und Klicks für eine bestimmte Kampagne zurück.
OAuth-Scope : email:read
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
idCampaign | query | integer | ja | Kennung der Kampagne (aus /stats/list) |
Antworten
| Code | Beschreibung |
|---|---|
200 | Tägliche Statistiken erfolgreich zurückgegeben |
401 | Ungültige Zugangsdaten |
/stats/del.{format}Kampagnenstatistiken löschen
Löscht alle Statistikdatensätze für eine bestimmte Kampagne dauerhaft.
OAuth-Scope : email:templates:write
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
Anfragetext (application/x-www-form-urlencoded)
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
IdCampaign | integer | ja | Kennung der Kampagne, deren Statistiken gelöscht werden sollen (aus /stats/list) |
Antworten
| Code | Beschreibung |
|---|---|
200 | Kampagnenstatistiken erfolgreich gelöscht |
400 | Fehlende IdCampaign |
401 | Ungültige Zugangsdaten |
404 | Kampagne nicht gefunden |
Beispiel 200
{
"Result": "Statistic Deleted"
}
/stats/country.{format}Geolokalisierungs-Aufschlüsselung
Gibt die geografische Aufschlüsselung der Kampagnenöffnungen zurück — wie viele Öffnungen aus welchem Land kamen.
OAuth-Scope : email:read
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
idCampaign | query | integer | ja |
Antworten
| Code | Beschreibung |
|---|---|
200 | Aufschlüsselung nach Land zurückgegeben |
401 | Ungültige Zugangsdaten |
/stats/open.{format}Protokoll der Öffnungsereignisse
Gibt das Protokoll der Öffnungsereignisse pro Empfänger für eine Kampagne zurück (eine Zeile pro Öffnung). Verwenden Sie emailFilter, um nach einem bestimmten Empfänger zu suchen (teilweise, Groß-/Kleinschreibung ignorierend).
OAuth-Scope : email:read
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
idCampaign | query | integer | ja | |
emailFilter | query | string | ||
numberOfRecords | query | integer | Einträge pro Seite — standardmäßig und maximal 5.000 (siehe Paginierung). | |
pageNumber | query | integer | Seitennummer (1-basiert). Standardwert ist 1. |
Antworten
| Code | Beschreibung |
|---|---|
200 | Öffnungsereignisse zurückgegeben |
401 | Ungültige Zugangsdaten |
/stats/click.{format}Protokoll der Klickereignisse
Gibt das Protokoll der Klickereignisse pro Empfänger für eine Kampagne zurück — einschließlich des angeklickten Links und des Zeitpunkts.
OAuth-Scope : email:read
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
idCampaign | query | integer | ja | |
emailFilter | query | string | ||
numberOfRecords | query | integer | Einträge pro Seite — standardmäßig und maximal 5.000 (siehe Paginierung). | |
pageNumber | query | integer | Seitennummer (1-basiert). Standardwert ist 1. |
Antworten
| Code | Beschreibung |
|---|---|
200 | Klickereignisse zurückgegeben |
401 | Ungültige Zugangsdaten |
/stats/system.{format}Aufschlüsselung nach Betriebssystem
Gibt die Aufschlüsselung der Öffnungen nach Betriebssystem (Windows, macOS, iOS, Android, Linux usw.) für eine bestimmte Kampagne zurück.
OAuth-Scope : email:read
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
idCampaign | query | integer | ja |
Antworten
| Code | Beschreibung |
|---|---|
200 | Aufschlüsselung nach Betriebssystem zurückgegeben |
401 | Ungültige Zugangsdaten |
/stats/emailSoftware.{format}Aufschlüsselung nach E-Mail-Client
Gibt die Aufschlüsselung der Öffnungen nach E-Mail-Client (Gmail, Outlook, Apple Mail, Thunderbird usw.) für eine bestimmte Kampagne zurück.
OAuth-Scope : email:read
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
idCampaign | query | integer | ja |
Antworten
| Code | Beschreibung |
|---|---|
200 | Aufschlüsselung nach E-Mail-Client zurückgegeben |
401 | Ungültige Zugangsdaten |
/stats/bounce.{format}Bounce-Protokoll
Gibt die Liste der zurückgewiesenen Empfänger (Hard Bounces, Soft Bounces, Spam-Beschwerden) einer Kampagne zurück, mit dem Fehlergrund für jede Adresse.
OAuth-Scope : email:read
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
idCampaign | query | integer | ja | |
emailFilter | query | string | ||
numberOfRecords | query | integer | Einträge pro Seite — standardmäßig und maximal 5.000 (siehe Paginierung). | |
pageNumber | query | integer | Seitennummer (1-basiert). Standardwert ist 1. |
Antworten
| Code | Beschreibung |
|---|---|
200 | Zurückgegebene Bounce-Ereignisse |
401 | Ungültige Zugangsdaten |
Beispiel 200
{
"ListBadMail": [
{
"Email": "[email protected]",
"Date": "2026-04-20T09:05:12",
"Error": "550 5.1.1 recipient rejected",
"AddressbookId": 1813318
}
]
}
Durchsuchen Sie das vollständige Protokoll aller bisherigen E-Mail-Versendungen.
/history/list.{format}Versandverlauf auflisten
Gibt ein paginiertes Protokoll aller bisherigen E-Mail-Versendungen zurück. Filtern Sie nach Kampagnenkennung oder nach Betreff. Setzen Sie bodyHTML=true, um den HTML-Body einzuschließen (begrenzt automatisch auf 10 pro Seite).
OAuth-Scope : email:read
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
subjectMessageFilter | query | string | Nach Kampagnenbetreff filtern (teilweise, Groß-/Kleinschreibung ignorierend) | |
idCampaign | query | integer | Nur den Verlauf einer bestimmten Kampagne zurückgeben | |
numberOfRecords | query | integer | Einträge pro Seite — standardmäßig und maximal 5.000 (siehe Paginierung). | |
pageNumber | query | integer | Seitennummer (1-basiert). Standardwert ist 1. | |
bodyHTML | query | boolean | Auf true setzen, um den vollständigen HTML-Body einzuschließen.
Begrenzt die Ergebnisse automatisch auf 10 pro Seite.
|
Antworten
| Code | Beschreibung |
|---|---|
200 | Verlauf erfolgreich zurückgegeben |
401 | Ungültige Zugangsdaten |
Beispiel 200
{
"HistoricList": [
{
"IDHistoric": 9001,
"SubjectMessage": "Spring Newsletter — April 2026",
"DateSend": "2026-04-20T09:00:01",
"NumberSend": 4521,
"NumberOpen": 1823,
"NumberClick": 342
}
]
}
Laden Sie eine CSV- oder XLSX-Datei hoch, um E-Mail-Kontakte in einem Schritt in eine Liste zu importieren. Die Datei wird zur asynchronen Verarbeitung in die Warteschlange gestellt — verfolgen Sie den Abschluss über die zurückgegebene ImportJobId oder über den optionalen Callback WebhookUrl.
/import/upload.{format}Kontaktdatei (CSV/XLSX) für den Massenimport hochladen
Laden Sie eine CSV- oder XLSX-Datei hoch, um E-Mail-Kontakte in eine Liste zu importieren. Die Datei wird gespeichert und zur asynchronen Verarbeitung in die Warteschlange gestellt — der Endpunkt gibt sofort eine ImportJobId zurück.
Anfragetyp: multipart/form-data
Erforderliche Formularfelder:
IdClient (Ganzzahl) — Ihre Mailpro-KundenkennungApiKey (Zeichenkette) — Ihr API-SchlüsselListId (Ganzzahl) — Kennung der Zielliste. Der veraltete Alias AddressBookId wird ebenfalls akzeptiert.file (Binärdaten) — die hochzuladende CSV- oder XLSX-DateiOptional:
WebhookUrl (Zeichenkette) — HTTPS-URL, die nach Abschluss der Verarbeitung aufgerufen wird. Empfängt eine JSON-Nutzlast mit dem endgültigen Status (erfolgreich/fehlgeschlagen) und der Anzahl der importierten/übersprungenen/ungültigen Zeilen.Dateiformat:
UTF-8-kodiertEmail lauten — Groß-/Kleinschreibung wird ignoriert)OAuth-Scope : contacts:write
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
Anfragetext (multipart/form-data)
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
ListId | integer | ja | Kennung der Zielliste. Der veraltete Alias AddressBookId wird ebenfalls akzeptiert. |
file | string (binary) | ja | CSV- oder XLSX-Datei (UTF-8, max. 50 MB) |
WebhookUrl | string (uri) | Callback-URL, die nach Abschluss der Verarbeitung aufgerufen wird |
Antworten
| Code | Beschreibung |
|---|---|
200 | Datei akzeptiert und in die Warteschlange gestellt |
400 | Keine Datei hochgeladen oder fehlende ListId |
401 | Ungültige Zugangsdaten |
500 | Server- oder Speicherfehler |
Beispiel 200
{
"Result": "OK",
"ImportJobId": 13,
"InternalName": "230575-20260420140221-contacts.csv"
}
Abonnieren Sie Echtzeit-Ereignisbenachrichtigungen für Ihren Server. Mailpro sendet eine HMAC-signierte JSON-Nutzlast per POST an Ihre URL, sobald das abonnierte Ereignis eintritt. Den vollständigen Ereigniskatalog, den Aufbau der Nutzlast, Code-Snippets zur Signaturprüfung und die Wiederholungsstrategie finden Sie im Abschnitt „Webhooks“ in der Einführung.
/webhooksWebhooks auflisten
Gibt alle für das authentifizierte Konto konfigurierten Webhooks zurück.
Antworten
| Code | Beschreibung |
|---|---|
200 | Array von Webhooks |
401 | Ungültige Zugangsdaten |
Beispiel 200
{
"items": [
{
"id": 14,
"url": "https://example.com/hooks/mailpro",
"description": "Slack-Integration",
"is_active": true,
"created_at": "2026-07-01T21:09:52.43",
"updated_at": "2026-07-21T18:56:08.02",
"last_delivery_at": "2026-07-21T18:56:07.653",
"last_delivery_status": 200,
"consecutive_failures": 0,
"events": [
"email.delivered",
"email.bounced"
]
}
],
"total": 1
}
/webhooksWebhook 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 jeder eingehenden Nutzlast.
Grenzen: max. 20 Webhooks pro Konto, max. 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 zu abonnierenden Ereignistypen (siehe Katalog oben). Verwenden Sie ["*"], um alle Ereignisse dieser API zu abonnieren. |
description | string |
Beispiel
{
"url": "https://example.com/hooks/mailpro",
"events": [
"email.delivered",
"email.bounced"
],
"description": "Slack-Integration"
}
Antworten
| Code | Beschreibung |
|---|---|
201 | Webhook erstellt — das secret wird nur hier zurückgegeben |
400 | Ungültige URL, ungültige Ereignisliste oder Limit überschritten |
401 | Ungültige Zugangsdaten |
Beispiel 201
{
"id": 42,
"url": "https://example.com/hooks/mailpro",
"events": [
"email.delivered",
"email.bounced"
],
"description": "Slack-Integration",
"isActive": true,
"consecutiveFailures": 0,
"autoDisabledAt": null,
"autoDisabledReason": null,
"createdAt": "2026-05-25T10:00:00Z",
"updatedAt": "2026-05-25T10:00:00Z",
"secret": "whsec_AbcD1234EfgH5678IjkL9012MnoP3456QrsT"
}
/webhooks/{id}Webhook abrufen
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
id | path | integer (int64) | ja |
Antworten
| Code | Beschreibung |
|---|---|
200 | Der Webhook |
404 | Webhook nicht gefunden |
/webhooks/{id}Webhook aktualisieren
Teilaktualisierung — nur die übermittelten Felder werden geändert.
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
id | path | integer (int64) | ja |
Anfragetext (application/json)
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
url | string (uri) | ||
events | array of string | ||
description | string | ||
isActive | boolean | Auf true setzen, um einen automatisch deaktivierten Webhook nach Behebung Ihres Endpunkts wieder zu aktivieren. |
Antworten
| Code | Beschreibung |
|---|---|
200 | Aktualisierter Webhook |
400 | Ungültige Nutzlast |
404 | Webhook nicht gefunden |
/webhooks/{id}Webhook löschen
Löscht den Webhook und seinen gesamten Zustellverlauf dauerhaft.
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
id | path | integer (int64) | ja |
Antworten
| Code | Beschreibung |
|---|---|
204 | Gelöscht |
404 | Webhook nicht gefunden |
/webhooks/{id}/testTestereignis senden
Stellt ein sofortiges ping-Ereignis (oder jeden anderen Ereignistyp über das Body-Feld eventType) zur Zustellung an Ihren Endpunkt in die Warteschlange. Nützlich, um die Erreichbarkeit und die Signaturprüfung vor dem Einsatz für echte Ereignisse zu überprüfen.
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
id | path | integer (int64) | ja |
Anfragetext (application/json)
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
eventType | string |
Beispiel
{
"eventType": "ping"
}
Antworten
| Code | Beschreibung |
|---|---|
202 | Ereignis zur Zustellung in die Warteschlange gestellt |
404 | Webhook nicht gefunden |
Beispiel 202
{
"deliveryId": 1234,
"eventId": "evt_8f3a9b2c4d1e5f6789abcdef01234567",
"eventType": "ping"
}
/webhooks/{id}/rotate-secretHMAC-Geheimnis rotieren
Generiert ein neues HMAC-Geheimnis und macht das alte sofort ungültig. Das neue Geheimnis wird in der Antwort einmalig zurückgegeben — speichern Sie es. Jede Zustellung wird ab diesem Zeitpunkt mit dem neuen Geheimnis signiert.
Verwenden Sie diese Funktion, wenn Sie vermuten, dass Ihr Geheimnis kompromittiert wurde.
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
id | path | integer (int64) | ja |
Antworten
| Code | Beschreibung |
|---|---|
200 | Neues Geheimnis (einmalig sichtbar) |
404 | Webhook nicht gefunden |
Beispiel 200
{
"secret": "whsec_XyzA9876BcdE5432FghI1098JklM7654NopQ"
}
/webhooks/{id}/deliveriesZustellversuche auflisten
Gibt den Verlauf der Zustellversuche für diesen Webhook zurück (30 Tage Aufbewahrung). Nützlich für die Fehlersuche — welche Ereignisse gesendet wurden, welche Statuscodes empfangen wurden, Anzahl der Wiederholungen, Fehlermeldungen.
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
id | path | integer (int64) | ja | |
limit | query | integer | ||
cursor | query | integer (int64) | Paginierungs-Cursor (= zuletzt gesehene Zustellungskennung). Gibt Zustellungen mit id < cursor zurück. |
Antworten
| Code | Beschreibung |
|---|---|
200 | Array von Zustellversuchen (neueste zuerst) |
404 | Webhook nicht gefunden |
/webhooks/{id}/deliveries/{deliveryId}/replayZustellung wiederholen
Stellt einen neuen Zustellversuch mit derselben Nutzlast wie das Original in die Warteschlange. Nützlich, um eine fehlgeschlagene Zustellung nach der Behebung Ihres Endpunkts erneut auszulösen. Es wird eine NEUE Zeile Webhook_Delivery erstellt (das Original wird zur Nachvollziehbarkeit aufbewahrt). Die Wiederholung durchläuft die Standard-Wiederholungsrichtlinie (gleicher Backoff-Zeitplan, gleiche automatische Deaktivierungsregel nach 10 Fehlschlägen).
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
id | path | integer (int64) | ja | |
deliveryId | path | integer (int64) | ja |
Antworten
| Code | Beschreibung |
|---|---|
202 | Wiederholung in die Warteschlange gestellt |
404 | Webhook oder Zustellung nicht gefunden |
Bounces und Abmeldungen des Kontos: auflisten, hinzufügen, entfernen.
/suppression/bounces.{format}Bounces des Kontos auflisten
Die neuesten zuerst. Die Gesamtzahl steht im Header X-Total-Count.
OAuth-Scope : email:read
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
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ültige Zugangsdaten |
Beispiel 200
{
"bounces": [
{
"Id": 5521,
"Source": "contact",
"BounceType": "hard",
"Email": "[email protected]",
"Date": "2026-10-12T08:30:00",
"DiagCode": "550 5.1.1 User unknown",
"IdList": 101
}
]
}
/suppression/bounces/{Id}/del.{format}Bounce entfernen
Source und Type sind erforderlich, wie von /suppression/bounces zurückgegeben: Eine Id allein ist nicht eindeutig.
OAuth-Scope : contacts:write
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
Id | path | integer (int64) | ja | Id des Bounces |
Anfragetext (application/x-www-form-urlencoded)
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
Source | string | ja | list, contact, api oder smtp |
Type | string: hard, soft | ja | hard oder soft |
Antworten
| Code | Beschreibung |
|---|---|
200 | Bounce entfernt |
400 | Source oder Type fehlt |
401 | Ungültige Zugangsdaten |
404 | Bounce nicht gefunden |
Beispiel 200
{
"Result": "OK",
"Id": 5521,
"Restored": false
}
/suppression/bounces/{Id}/restore.{format}Kontakt 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 |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
Id | path | integer (int64) | ja | Id des Bounces |
Antworten
| Code | Beschreibung |
|---|---|
200 | Kontakt wieder aufgenommen |
401 | Ungültige Zugangsdaten |
404 | Hard Bounce eines Kontakts nicht gefunden oder Adresse nicht mehr aktiv |
Beispiel 200
{
"Result": "OK",
"Id": 5521,
"Restored": true
}
/suppression/unsubscribers.{format}Abmeldungen des Kontos auflisten
Die neuesten zuerst. Die Gesamtzahl steht im Header X-Total-Count.
OAuth-Scope : contacts:read
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
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ültige Zugangsdaten |
Beispiel 200
{
"unsubscribers": [
{
"Id": 9012,
"Source": "api",
"Email": "[email protected]",
"Date": "2026-10-20T16:05:00",
"ListName": null,
"Comment": "Asked by phone"
}
]
}
/suppression/unsubscribers/add.{format}Abmeldung hinzufügen
Ohne ListId wird die Adresse für das gesamte Konto abgemeldet. Mit ListId nur von dieser Abmeldeliste.
OAuth-Scope : contacts:write
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
Anfragetext (application/x-www-form-urlencoded)
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
Email | string | ja | Abzumeldende Adresse |
Comment | string | Freier Kommentar | |
ListId | integer (int64) | Abmeldeliste des Kontos (optional) |
Antworten
| Code | Beschreibung |
|---|---|
200 | Erledigt. AlreadyUnsubscribed ist true, wenn die Adresse bereits abgemeldet war. |
400 | Eine gültige Adresse ist erforderlich |
401 | Ungültige Zugangsdaten |
404 | ListId ist keine Abmeldeliste dieses Kontos |
Beispiel 200
{
"Result": "OK",
"AlreadyUnsubscribed": false
}
/suppression/unsubscribers/{Id}/del.{format}Abmeldung entfernen
Source ist erforderlich, wie von /suppression/unsubscribers zurückgegeben: Eine Id allein ist nicht eindeutig.
OAuth-Scope : contacts:write
Parameter
| Name | Ort | Typ | Erforderlich | Beschreibung |
|---|---|---|---|---|
format | path | string: json, xml | ja | Antwortformat |
Id | path | integer (int64) | ja | Id der Abmeldung |
Anfragetext (application/x-www-form-urlencoded)
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
Source | string | ja | contact, list, smtp, api oder api3 |
Antworten
| Code | Beschreibung |
|---|---|
200 | Abmeldung entfernt |
400 | Source ist erforderlich |
401 | Ungültige Zugangsdaten |
404 | Abmeldung nicht gefunden |
Beispiel 200
{
"Result": "OK",
"Removed": 9012
}