API v1
API-Dokumentation
Mit der API von DIGO Email arbeiten deine Website, dein Onlineshop oder deine Unternehmenssoftware mit deinem Konto zusammen: Sie melden Kontakte mit ihrer Einwilligung an, senden Produkte und Beiträge für deine E-Mails und erfassen Bestellungen und Warenkörbe, damit du siehst, wie viel jede Kampagne verkauft, und Automatisierungen starten kannst.
Bevor du anfängst
In diesen Fällen musst du keinen Code schreiben, denn die Verbindung ist schon fertig:
- WordPress und WooCommerce: Lade das Plugin unter Integrationen herunter. Es bringt die Anmeldungen aus dem Checkout und aus Contact-Form-7-Formularen zu DIGO Email, dazu Bestellungen, Produkte, Blogbeiträge und Warenkörbe.
- digo.sale: Öffne in der Verwaltung deines Shops Marketing → DIGO Email und füge den Schlüssel ein.
- Ein Anmeldeformular: Jede Liste hat ihr eigenes, zum Teilen per Link oder zum Einbinden in deine Website, unter Listen und Formulare.
- ChatGPT und Claude: Verbinde deinen Assistenten unter Integrationen › ChatGPT und Claude. Er meldet sich mit deiner Zustimmung an (OAuth), ohne API-Schlüssel.
Die API ist für alles andere da: eine individuell entwickelte Website, eine andere E-Commerce-Plattform, ein CRM, eine Unternehmenssoftware oder eine App mit eigenem Server.
403 account_inactive abgelehnt.Erste Schritte
- Öffne im Dashboard Integrationen. Gib unter Website verbinden den Namen und die Adresse der Website ein und wähle Website als Plattform.
- Klicke auf Verbinden und Schlüssel erstellen und kopiere den angezeigten Schlüssel: Er beginnt mit
dge_und wird nur ein einziges Mal angezeigt. - Teste den Schlüssel, indem du die Verbindungsdaten abfragst:
Anfrage
curl https://www.digo.email/api/v1/ping \
-H "Authorization: Bearer dge_DEIN_SCHLUESSEL" \
-H "Accept: application/json"
Antwort · 200
{
"store": "Onlineshop",
"account": "Rossi GmbH",
"platform": "site",
"can_send": true,
"status": "active"
}
Ab der ersten erfolgreichen Anfrage wird die Website im Dashboard als Verbunden angezeigt.
Authentifizierung
Jede Anfrage enthält den Schlüssel der Website im Header Authorization, nach dem Wort Bearer:
Header
Authorization: Bearer dge_DEIN_SCHLUESSEL
- Ein Schlüssel pro Website. Du kannst bis zu 20 Websites verbinden, jede mit ihrem eigenen Schlüssel. Produkte, Beiträge, Bestellungen und Warenkörbe gehören zu der Website, die sie gesendet hat; Kontakte, Listen, Tags und Felder gehören zum Konto und gelten für alle Websites.
- Bewahre ihn auf dem Server auf. Wer den Schlüssel hat, kann in deinem Namen Adressen anmelden und Bestellungen senden: Füge ihn nie in das JavaScript deiner Seiten, in eine auf Handys installierte App oder in ein öffentliches Repository ein.
- Du siehst ihn nur einmal. Wir speichern nur einen verschlüsselten Fingerabdruck des Schlüssels, und im Dashboard zeigen wir seine letzten sechs Zeichen. Wenn du ihn verlierst, erstelle einen neuen.
- Zum Ändern öffnest du Integrationen und dann Bearbeiten oder Schlüssel ändern › Neuer Schlüssel: Der bisherige funktioniert sofort nicht mehr. Mach das, wenn du glaubst, dass jemand ihn gesehen hat.
- Die Website trennen deaktiviert den Schlüssel und löscht die von dieser Website empfangenen Produkte, Beiträge und Bestellungen. Die Kontakte bleiben.
Anfragen und Antworten
Alle Adressen beginnen so:
https://www.digo.email/api/v1
- JSON. Sende die Daten als JSON mit
Content-Type: application/jsonund fordere die Antworten mitAccept: application/jsonan. Die Antworten sind immer JSON, in UTF-8. Verwende immer HTTPS. - Deine eigenen IDs. Produkte, Beiträge, Bestellungen und Warenkörbe werden an deiner
iderkannt (Text, bis zu 64 Zeichen). Wenn du dieselbeiderneut sendest, wird das Element aktualisiert statt neu angelegt. - Beträge in Einheiten der Währung, mit Punkt als Dezimaltrennzeichen:
49.90, nicht4990. Die Währung ist ein Code aus drei Buchstaben (EUR,CHF,USD); fehlt er, gilt die in Integrationen eingestellte Währung der Website. - Datumsangaben im Format ISO 8601 mit Zeitzone:
2026-10-20T09:30:00+02:00. - Meldungen. Das Feld
messageder Fehler ist für Menschen geschrieben, auf Italienisch, Englisch, Spanisch, Französisch oder Deutsch, je nach HeaderAccept-Languageoder Sprache des Kontos. Entscheide in deinem Code anhand des HTTP-Statuscodes und des Feldeserror, die sich nie ändern. - Neue Felder. Antworten können neue Felder bekommen: Ignoriere die, die du nicht kennst.
Fehler
Statuscodes 2xx bedeuten, dass die Anfrage erfolgreich war. In allen anderen Fällen erklärt der Inhalt der Antwort, was passiert ist:
Antwort · 403
{
"error": "account_inactive",
"message": "Das Konto bei DIGO Email ist noch nicht aktiv."
}
| Status | error | Bedeutung und was zu tun ist |
|---|---|---|
401 | invalid_key | Schlüssel fehlt, ist falsch oder wurde ersetzt. Prüfe den Schlüssel oder erstelle einen neuen. |
403 | account_inactive | Das Konto wird noch geprüft und nimmt keine Anmeldungen an. Wir benachrichtigen dich per E-Mail, sobald es aktiv ist. |
403 | account_suspended | Der Versand des Kontos ist gesperrt und Anmeldungen werden abgelehnt. Schreib an den Support. |
409 | contact_limit | Die Kontakte haben das Doppelte des Kontolimits erreicht: Neue Anmeldungen werden abgelehnt, bis du weitere Kontakte kaufst oder nicht genutzte entfernst. |
409 | privacy_missing | Nur bei GET /forms: Der Link zu deiner Datenschutzerklärung fehlt. Füge ihn unter Einstellungen › Unternehmen hinzu. |
422 | unknown_list | Keine der angegebenen Listen existiert. Lies die IDs mit GET /lists neu ein. |
422 | — | Ungültige Daten: Das Feld errors listet die Probleme Feld für Feld auf. Korrigiere die Daten, bevor du es erneut versuchst. |
429 | — | Zu viele Anfragen. Warte die im Header Retry-After angegebenen Sekunden. |
5xx | — | Ein vorübergehendes Problem bei uns. Versuch es später erneut und warte jedes Mal etwas länger. |
Antwort · 422
{
"message": "Du musst die Einwilligungserklärung akzeptieren.",
"errors": {
"consent": ["Du musst die Einwilligungserklärung akzeptieren."]
}
}
Limits
- Bis zu 300 Anfragen pro Minute für jede verbundene Website, über alle Endpunkte gerechnet.
- Für
POST /contactshöchstens 60 Anmeldungen pro Minute pro Website. - Produkte, Beiträge und frühere Bestellungen werden in Paketen von 100 pro Anfrage gesendet.
- Die Antworten nennen das allgemeine Limit (
X-RateLimit-Limit) und wie viele Anfragen in der laufenden Minute übrig sind (X-RateLimit-Remaining). Über einem Limit erhältst du429mitRetry-After.
Eine Anfrage, die an einem Netzwerkfehler, einem 429 oder einem 5xx gescheitert ist, kannst du bedenkenlos wiederholen: Bestellungen, Produkte, Beiträge und Warenkörbe werden über die id aktualisiert, und ein bereits angemeldeter Kontakt wird nicht doppelt angelegt. Andere 4xx-Fehler kommen dagegen unverändert zurück, bis du die Daten korrigierst.
Liste der Endpunkte
| Methode | Pfad | Wofür |
|---|---|---|
| GET | /ping | Prüft den Schlüssel und den Status des Kontos |
| GET | /lists | Die Listen mit ihren IDs |
| GET | /tags | Die Tags |
| GET | /fields | Die benutzerdefinierten Felder der Kontakte |
| GET | /forms | Die Anmeldeformulare, fertig zum Anzeigen |
| POST | /contacts | Meldet einen Kontakt mit seiner Einwilligung an |
| PUT | /items | Legt Produkte und Beiträge an oder aktualisiert sie |
| DELETE | /items/{type}/{id} | Entfernt ein Produkt oder einen Beitrag |
| POST | /orders | Erfasst eine Bestellung oder aktualisiert ihren Status |
| POST | /orders/history | Importiert frühere Bestellungen |
| PUT | /carts | Speichert den Warenkorb eines Kunden |
| DELETE | /carts/{id} | Schließt einen geleerten Warenkorb |
Konto und Einstellungen
Diese Endpunkte lesen, was du im Dashboard vorbereitet hast: Deine Website nutzt sie, damit die Person, die sie einrichtet, Listen, Tags und Felder auswählen kann.
GET /ping
Prüft den Schlüssel und den Status des Kontos. Ruf ihn auf, wenn jemand den Schlüssel in die Einstellungen deiner Website einfügt, und ab und zu, um zu wissen, ob das Konto Anmeldungen annimmt. Die Antwort siehst du unter Erste Schritte.
| Feld | Typ | Beschreibung |
|---|---|---|
store | string | Der Name der Website in Integrationen. |
account | string | Der Name des DIGO-Email-Kontos. |
platform | string | Die gewählte Plattform: woocommerce, digo_sale oder site (Website). |
can_send | boolean | true, wenn das Konto aktiv ist und Anmeldungen annimmt. |
status | string | pending (in Prüfung), active (aktiv) oder suspended (Versand gesperrt). |
GET /lists
Die Listen des Kontos in alphabetischer Reihenfolge, mit der id, die du zum Anmelden von Kontakten brauchst.
Antwort · 200
{
"data": [
{ "id": 3, "name": "Kunden", "double_opt_in": false },
{ "id": 5, "name": "Newsletter", "double_opt_in": true }
]
}
Ist double_opt_in auf true, erhält jede neue Anmeldung eine E-Mail zur Bestätigung: Die Person ist erst nach der Bestätigung angemeldet und bekommt erst dann Kampagnen.
GET /tags
Die Tags des Kontos in alphabetischer Reihenfolge. Um einem Kontakt einen Tag zu geben, genügt sein Name: Tags, die es noch nicht gibt, werden angelegt.
Antwort · 200
{
"data": [
{ "id": 9, "name": "Berlin" },
{ "id": 7, "name": "VIP" }
]
}
GET /fields
Die benutzerdefinierten Felder der Kontakte, die du unter Kontakte › Benutzerdefinierte Felder anlegst.
Antwort · 200
{
"data": [
{ "key": "firma", "label": "Firma", "type": "text" },
{ "key": "geburtstag", "label": "Geburtstag", "type": "date" }
]
}
| Feld | Typ | Beschreibung |
|---|---|---|
key | string | Der Name für fields in POST /contacts. Er ist auch der Platzhalter in E-Mails: {{geburtstag}}. |
label | string | Der im Dashboard angezeigte Name. |
type | string | text, number oder date. |
GET /forms
Die Anmeldeformulare der Listen, mit allem, was du brauchst, um sie im Stil deiner Website anzuzeigen. Das nutzt der Shortcode des WordPress-Plugins.
| Parameter | Typ | Beschreibung |
|---|---|---|
lang | string | Optional, in der Adresse: die Sprache der Seite (it, en, es, fr oder de). Beschriftungen und Einwilligungstext kommen in dieser Sprache, sofern die Liste keine eigene hat. |
Anfrage
curl "https://www.digo.email/api/v1/forms?lang=de" \
-H "Authorization: Bearer dge_DEIN_SCHLUESSEL" \
-H "Accept: application/json"
Antwort · 200
{
"data": [
{
"id": 5,
"name": "Newsletter",
"title": "Newsletter abonnieren",
"action": "https://www.digo.email/f/k3Jd9QmZ2xTb7LpV4nWc8RyA1sGe6HuF",
"locale": "de",
"consent_text": "Ich willige ein, E-Mails von Rossi GmbH zu erhalten. Ich kann mich jederzeit wieder abmelden.",
"labels": { "email": "E-Mail", "optional": "optional", "privacy": "Datenschutzerklärung", "submit": "Anmelden" },
"privacy_url": "https://www.deineseite.de/datenschutz",
"double_opt_in": true,
"fields": [
{ "name": "first_name", "label": "Vorname", "type": "text", "required": false },
{ "name": "fields[geburtstag]", "label": "Geburtstag", "type": "date", "required": false }
],
"script": "https://www.digo.email/js/digo-form.js?v=3",
"can_send": true
}
]
}
Das Formular läuft nicht über deinen Server: Der Browser der Besucherin oder des Besuchers sendet es direkt an die Adresse action, ohne Schlüssel. Einwilligung, Double-Opt-in und Schutz vor Missbrauch sind die der Formulare von DIGO Email. So baust du es:
- ein
<form method="post">mitactionals Ziel; - das Feld
emailund die Felder ausfields, jeweils mit ihremname, Pflichtfelder, wennrequiredtrueist; - ein Kontrollkästchen
consentneben dem Textconsent_textund dem Link zuprivacy_url, dazu ein verstecktes Feldconsent_textmit demselben Text; - das in
scriptangegebene Skript. Auf den Websites des Kontos (verifizierte Versanddomains und verbundene Websites) sendet es das Formular, ohne die Seite zu verlassen, und zeigt die Antwort direkt dort an; anderswo oder ohne Skript sieht man die Antwort auf einer Seite von DIGO Email.
Nenne kein Feld website: Das ist die Falle für automatische Programme, und ein Formular, das es ausfüllt, wird ignoriert. Ohne den Link zur Datenschutzerklärung in den Einstellungen des Kontos lautet die Antwort 409 privacy_missing.
Kontakte
POST /contacts
Meldet eine Person an, die eingewilligt hat, deine E-Mails zu erhalten: über ein Formular deiner Website, im Checkout oder bei der Registrierung. Ohne Einwilligung wird nichts gespeichert.
| Feld | Typ | Beschreibung |
|---|---|---|
emailPflichtfeld | string | Die E-Mail-Adresse, bis zu 190 Zeichen. |
list_idsPflichtfeld | array | Die IDs der Listen, 1 bis 10 (GET /lists). Nicht vorhandene werden ignoriert; existiert keine, lautet die Antwort 422 unknown_list. |
consentPflichtfeld | boolean | Muss true sein: Die Person hat das Kontrollkästchen der Einwilligung angehakt. |
consent_textPflichtfeld | string | Der genaue Text des Kontrollkästchens, das die Person angehakt hat, bis zu 1000 Zeichen. Wir speichern ihn als Nachweis der Einwilligung. |
sourcePflichtfeld | string | Wo die Anmeldung stattfand: form (ein Formular), checkout (ein Kauf) oder registration (das Anlegen eines Kontos auf deiner Website). |
first_name | string | Der Vorname, bis zu 100 Zeichen. |
last_name | string | Der Nachname, bis zu 100 Zeichen. |
fields | object | Die benutzerdefinierten Felder, nach key (GET /fields): {"geburtstag": "1990-04-18"}. Datumsangaben als JJJJ-MM-TT, Zahlen als JSON-Zahlen (12.5). Nicht vorhandene Felder werden ignoriert. |
tags | array | Bis zu 10 Tag-Namen mit höchstens 60 Zeichen. Tags, die es noch nicht gibt, werden angelegt. |
language | string | Die Sprache der Person: it, en, es, fr oder de (auch de_DE oder Deutsch funktionieren). Bestätigungs-E-Mails, Kampagnen und Abmeldeseiten richten sich danach. Eine Sprache, die wir nicht unterstützen, wird ignoriert. Das Feld kann auch locale heißen. |
form | string | Der Name des Formulars, bis zu 190 Zeichen: Er erscheint im Verlauf des Kontakts. |
page | string | Die Adresse der Seite, auf der die Anmeldung stattfand. Wir behalten nur Domain und Pfad, ohne alles nach ? oder #. |
ip | string | Die IP-Adresse der Person, nicht die deines Servers: Sie gehört zum Nachweis der Einwilligung. |
user_agent | string | Der Browser der Person, ebenfalls für den Nachweis der Einwilligung. |
Anfrage
curl -X POST https://www.digo.email/api/v1/contacts \
-H "Authorization: Bearer dge_DEIN_SCHLUESSEL" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"email": "lena.schmidt@example.com",
"first_name": "Lena",
"last_name": "Schmidt",
"list_ids": [5],
"tags": ["Website"],
"fields": { "firma": "Schmidt Design", "geburtstag": "1990-04-18" },
"consent": true,
"consent_text": "Ich möchte den Newsletter von Rossi GmbH mit Neuigkeiten und Angeboten erhalten.",
"source": "form",
"form": "Fußzeile",
"language": "de",
"page": "https://www.deineseite.de/kontakt",
"ip": "203.0.113.24",
"user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 15_6) AppleWebKit/605.1.15"
}'
Antwort · 200
{ "status": "confirming" }
| status | Bedeutung |
|---|---|
subscribed | Angemeldet. War die Person schon ein Kontakt, wurden die Listen und Tags hinzugefügt. |
confirming | Die Person muss über die E-Mail bestätigen, die wir ihr geschickt haben: Eine der Listen hat Double-Opt-in, oder sie hatte sich früher abgemeldet. |
limited | Anmeldung gespeichert, aber diese Adresse hat heute schon zu viele Bestätigungs-E-Mails erhalten: Der Link kommt, wenn sie sich morgen erneut anmeldet. |
capped | Anmeldung gespeichert, aber das Konto hat die 500 Bestätigungs-E-Mails von heute schon verschickt: Bitte die Person, es morgen noch einmal zu versuchen. |
Personen, die schon zu deinen Kontakten gehören
- Listen und Tags werden hinzugefügt, nie entfernt.
- Vor- und Nachname bleiben, wie sie sind; benutzerdefinierte Felder werden nur gefüllt, wenn sie leer sind, und die Sprache nur, wenn noch keine bekannt ist.
- Wer schon angemeldet ist, kommt sofort auch in Listen mit Double-Opt-in, ohne erneute Bestätigung.
- Wer sich abgemeldet hatte, muss über das eigene Postfach bestätigen, auch bei Listen ohne Double-Opt-in: Niemand kann die Person an ihrer Stelle wieder anmelden. An Adressen, die unzustellbar waren oder E-Mails als Spam gemeldet haben, senden wir nichts.
Was danach passiert
- Sobald der Kontakt angemeldet ist, sofort oder nach der Bestätigung, starten die Automatisierungen Meldet sich für eine Liste an und Erhält einen Tag.
- Über dem Kontaktlimit deines Kontos wird die Anmeldung trotzdem gespeichert, aber Kampagnen und Automatisierungen halten an, bis du weitere Kontakte kaufst oder welche entfernst; beim Doppelten des Limits werden neue Anmeldungen mit
409 contact_limitabgelehnt. - Im Kontaktprofil findest du die Anmeldung mit dem Einwilligungstext, der Website, der Seite und dem Formular.
PHP, auf dem Server, der das Formular empfängt
<?php
// Der Schlüssel kommt aus einer Umgebungsvariable: Schreib ihn nicht in den Code.
$consentText = 'Ich möchte den Newsletter von Rossi GmbH mit Neuigkeiten und Angeboten erhalten.';
if (empty($_POST['einwilligung'])) {
exit('Um dich anzumelden, hake das Kästchen zur Einwilligung an.');
}
$ch = curl_init('https://www.digo.email/api/v1/contacts');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 10,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('DIGO_EMAIL_KEY'),
'Content-Type: application/json',
'Accept: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'email' => trim($_POST['email'] ?? ''),
'first_name' => trim($_POST['vorname'] ?? ''),
'list_ids' => [5],
'consent' => true,
'consent_text' => $consentText, // derselbe Text wie neben dem Kästchen
'source' => 'form',
'language' => 'de',
'page' => 'https://www.deineseite.de/kontakt',
'ip' => $_SERVER['REMOTE_ADDR'],
'user_agent' => $_SERVER['HTTP_USER_AGENT'] ?? '',
]),
]);
$body = json_decode((string) curl_exec($ch), true);
$code = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
$messages = [
'subscribed' => 'Danke, du bist angemeldet.',
'confirming' => 'Fast geschafft: Öffne die E-Mail, die wir dir geschickt haben, und bestätige.',
'limited' => 'Heute können wir dir keine weitere Bestätigungs-E-Mail schicken: Versuch es morgen noch einmal.',
'capped' => 'Heute können wir dir keine weitere Bestätigungs-E-Mail schicken: Versuch es morgen noch einmal.',
];
if ($code === 200) {
echo $messages[$body['status']] ?? $messages['subscribed'];
} else {
error_log('DIGO Email: ' . ($body['message'] ?? 'HTTP ' . $code));
echo 'Die Anmeldung hat nicht geklappt. Bitte versuch es später noch einmal.';
}
Node.js 18 oder neuer, auf dem Server
const response = await fetch('https://www.digo.email/api/v1/contacts', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.DIGO_EMAIL_KEY}`,
'Content-Type': 'application/json',
Accept: 'application/json',
},
body: JSON.stringify({
email: 'lena.schmidt@example.com',
list_ids: [5],
consent: true,
consent_text: 'Ich möchte den Newsletter von Rossi GmbH mit Neuigkeiten und Angeboten erhalten.',
source: 'checkout',
language: 'de',
}),
});
const data = await response.json();
if (!response.ok) throw new Error(data.message);
console.log(data.status); // subscribed, confirming, limited oder capped
Produkte und Beiträge
Die Produkte und Blogbeiträge, die du hier sendest, erscheinen im E-Mail-Editor in den Blöcken Produkte und Beiträge: Wer eine Kampagne schreibt, wählt sie aus einer Liste aus, mit Titel, Bild, Preis und Link fertig vorbereitet.
PUT /items
Legt bis zu 100 Elemente pro Anfrage an oder aktualisiert sie, erkannt an type und id. Sende beim ersten Mal alle und danach immer dann, wenn sich Titel, Preis, Bild oder Verfügbarkeit ändern.
| Feld | Typ | Beschreibung |
|---|---|---|
itemsPflichtfeld | array | Die Elemente, bis zu 100. |
items[].typePflichtfeld | string | product (Produkt) oder post (Beitrag). |
items[].idPflichtfeld | string | Deine ID des Elements, bis zu 64 Zeichen. |
items[].title | string | Der Name. Ohne Namen wird das Element übersprungen. |
items[].url | string | Die vollständige Adresse der Seite, mit https://. Ohne gültige Adresse wird das Element übersprungen. |
items[].image | string | Die vollständige Adresse des Bildes. |
items[].excerpt | string | Eine kurze Beschreibung, bis zu 2000 Zeichen. HTML wird entfernt. |
items[].price | number | Der Preis, wie die Kundschaft ihn sieht. |
items[].sale_price | number | Der reduzierte Preis: In E-Mails wird er zum Preis, der reguläre erscheint durchgestrichen. |
items[].available | boolean | false, wenn das Produkt nicht verfügbar ist. Fehlt der Wert, gilt true. |
items[].published_at | string | Das Veröffentlichungsdatum: In der Liste stehen die neuesten Beiträge oben. |
Anfrage
curl -X PUT https://www.digo.email/api/v1/items \
-H "Authorization: Bearer dge_DEIN_SCHLUESSEL" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"items": [
{
"type": "product",
"id": "1042",
"title": "Glasierte Keramiktasse",
"url": "https://www.deineseite.de/produkte/glasierte-tasse",
"image": "https://www.deineseite.de/media/glasierte-tasse.jpg",
"excerpt": "Handgemacht, 350 ml, spülmaschinenfest.",
"price": 24.00,
"sale_price": 19.90,
"available": true
},
{
"type": "post",
"id": "87",
"title": "So findest du die richtige Tasse",
"url": "https://www.deineseite.de/blog/richtige-tasse",
"image": "https://www.deineseite.de/media/blog-tassen.jpg",
"excerpt": "Material, Größe und Pflege: ein Ratgeber in fünf Minuten.",
"published_at": "2026-10-12T08:00:00+02:00"
}
]
}'
Antwort · 200
{ "saved": 2, "skipped": [] }
saved zählt die gespeicherten Elemente; skipped listet die IDs, die übersprungen wurden, weil Name oder gültige Adresse fehlten.
DELETE /items/{type}/{id}
Entfernt ein Produkt, das du nicht mehr verkaufst, oder einen Beitrag, der nicht mehr veröffentlicht ist, aus der Liste. Antwortet mit 204, ohne Inhalt, auch wenn das Element nicht vorhanden war. Bereits vorbereitete E-Mails, die es enthalten, ändern sich nicht.
Anfrage
curl -X DELETE https://www.digo.email/api/v1/items/product/1042 \
-H "Authorization: Bearer dge_DEIN_SCHLUESSEL" \
-H "Accept: application/json"
Bestellungen
Bestellungen zeigen, wie viel jede Kampagne verkauft, starten die Automatisierungen Kauft im Shop ein und schließen verlassene Warenkörbe. Käuferinnen und Käufer werden nicht zu Kontakten: Wir behalten eine Bestellung nur, wenn die kaufende Person schon zu deinen Kontakten gehört oder über den Link einer Kampagne kommt (siehe Verkäufe aus Kampagnen). Alle anderen werden verworfen.
POST /orders
Erfasst eine Bestellung oder aktualisiert ihren Status. Sende sie beim Anlegen und erneut bei jeder Änderung (Zahlung, Erstattung, Stornierung), immer mit derselben id.
| Feld | Typ | Beschreibung |
|---|---|---|
idPflichtfeld | string | Deine ID der Bestellung, bis zu 64 Zeichen. |
statusPflichtfeld | string | pending (Zahlung ausstehend), paid (bezahlt), refunded (vollständig erstattet) oder cancelled (storniert). |
totalPflichtfeld | number | Der von der Kundschaft bezahlte Gesamtbetrag, inklusive Steuern und Versand. |
email | string | Die E-Mail der kaufenden Person: Sie verknüpft die Bestellung mit dem Kontakt mit derselben Adresse. |
number | string | Die Bestellnummer, die die Kundschaft sieht, falls sie von der ID abweicht. |
refunded | number | Wie viel bisher erstattet wurde. Bei einer Teilerstattung lässt du status auf paid und gibst hier den Betrag an. |
currency | string | Der Währungscode. Fehlt er, gilt die Währung der Website. |
created_at | string | Datum und Uhrzeit der Bestellung. Fehlen sie, gilt der Zeitpunkt, zu dem wir sie empfangen. |
click_id | string | Der Wert des Cookies digo_c, falls vorhanden: Er verknüpft die Bestellung mit der Kampagne. |
items | array | Die Positionen der Bestellung, bis zu 200. |
items[].namePflichtfeld | string | Der Produktname. |
items[].quantityPflichtfeld | integer | Die Menge, mindestens 1. |
items[].totalPflichtfeld | number | Die Summe der Position. |
items[].id | string | Die Produkt-ID, dieselbe wie in PUT /items: Automatisierungen, die für ein bestimmtes Produkt starten, brauchen sie. |
Anfrage
curl -X POST https://www.digo.email/api/v1/orders \
-H "Authorization: Bearer dge_DEIN_SCHLUESSEL" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"id": "5531",
"number": "#5531",
"email": "lena.schmidt@example.com",
"status": "paid",
"total": 43.80,
"refunded": 0,
"currency": "EUR",
"created_at": "2026-10-20T10:15:00+02:00",
"click_id": "184467.9f1c2ab07d3e4f51",
"items": [
{ "id": "1042", "name": "Glasierte Keramiktasse", "quantity": 2, "total": 39.80 }
]
}'
Antwort · 200
{ "attributed": true }
attributed ist true, wenn die Bestellung für eine Kampagne zählt. Eine Bestellung, die weder einen Kontakt noch eine Kampagne betrifft, wird nicht gespeichert, und die Antwort lautet {"attributed": false, "stored": false}.
- Wird eine Bestellung zum ersten Mal
paidund ist die kaufende Person ein Kontakt, starten die Automatisierungen Kauft im Shop ein. - Eine Bestellung mit
pendingoderpaidschließt die offenen Warenkörbe der kaufenden Person: E-Mails zu verlassenen Warenkörben gehen dann nicht mehr raus. - In den Berichten zählen bezahlte Bestellungen abzüglich Erstattungen. Ausstehende und stornierte Bestellungen zählen nicht.
POST /orders/history
Importiert frühere Bestellungen, bis zu 100 pro Anfrage, in orders und mit denselben Feldern wie POST /orders. Es gelten dieselben Regeln, aber diese Bestellungen beschreiben, was schon passiert ist: Sie starten keine Automatisierungen und schließen keine Warenkörbe. Du kannst sie erneut senden: Sie aktualisieren dieselben Bestellungen. Eine ungültige E-Mail passt einfach zu keinem Kontakt.
Anfrage
curl -X POST https://www.digo.email/api/v1/orders/history \
-H "Authorization: Bearer dge_DEIN_SCHLUESSEL" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"orders": [
{ "id": "4870", "email": "lena.schmidt@example.com", "status": "paid", "total": 24.00, "created_at": "2026-03-02T17:40:00+01:00" },
{ "id": "4871", "email": "jonas.mueller@example.com", "status": "refunded", "total": 58.50, "refunded": 58.50, "created_at": "2026-03-03T09:12:00+01:00" }
]
}'
Antwort · 200
{ "received": 2, "stored": 1 }
received zählt die empfangenen Bestellungen, stored die gespeicherten, weil sie zu deinen Kontakten gehören oder aus einer Kampagne kommen.
Warenkörbe
Mit Warenkörben kannst du die Kundschaft mit der Automatisierung Lässt den Warenkorb liegen daran erinnern, was sie in deinem Shop zurückgelassen hat. In E-Mails zeigen die Platzhalter {{carrello_link}}, {{carrello_totale}} und {{carrello_prodotti}} den Link zum Fortsetzen des Warenkorbs, die Summe und die Produkte.
PUT /carts
Speichert den Warenkorb einer Person, deren E-Mail du kennst, weil sie angemeldet ist oder sie im Checkout eingegeben hat. Sende ihn bei jeder Änderung erneut, immer mit derselben id. Wir behalten nur die Warenkörbe von Personen, die schon zu deinen Kontakten gehören: Niemand wird zum Kontakt, weil er einen Warenkorb füllt.
| Feld | Typ | Beschreibung |
|---|---|---|
idPflichtfeld | string | Deine ID des Warenkorbs, bis zu 64 Zeichen. |
emailPflichtfeld | string | Die E-Mail der Person. |
totalPflichtfeld | number | Die Summe des Warenkorbs. |
urlPflichtfeld | string | Die Adresse, die diesen Warenkorb wieder öffnet, auch auf einem anderen Gerät: Sie ist der Link der Schaltfläche in den E-Mails. Ist sie ungültig, verwenden wir die Adresse der Website. |
itemsPflichtfeld | array | Die Produkte, 1 bis 100, mit name, quantity und total als Pflichtfeldern, id und image (vollständige Adresse des Bildes) optional. |
currency | string | Der Währungscode. Fehlt er, gilt die Währung der Website. |
Anfrage
curl -X PUT https://www.digo.email/api/v1/carts \
-H "Authorization: Bearer dge_DEIN_SCHLUESSEL" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"id": "c-8f2a1c",
"email": "lena.schmidt@example.com",
"total": 39.80,
"currency": "EUR",
"url": "https://www.deineseite.de/warenkorb?fortsetzen=8f2a1c",
"items": [
{ "id": "1042", "name": "Glasierte Keramiktasse", "quantity": 2, "total": 39.80, "image": "https://www.deineseite.de/media/glasierte-tasse.jpg" }
]
}'
Antwort · 200
{ "saved": true }
Gehört die E-Mail zu keinem deiner Kontakte, lautet die Antwort {"saved": false}, und ein vorher mit derselben id gespeicherter Warenkorb wird entfernt.
DELETE /carts/{id}
Schließt einen Warenkorb, den die Person geleert hat. Antwortet mit 204, ohne Inhalt. Nach einem Kauf ist das nicht nötig: Die Bestellung schließt die Warenkörbe der kaufenden Person bereits.
Anfrage
curl -X DELETE https://www.digo.email/api/v1/carts/c-8f2a1c \
-H "Authorization: Bearer dge_DEIN_SCHLUESSEL" \
-H "Accept: application/json"
Verkäufe aus Kampagnen
Damit du siehst, wie viel jede Kampagne verkauft, verknüpft DIGO Email die Bestellungen mit den Klicks in den E-Mails:
- Wenn jemand in der E-Mail auf einen Link zu deiner Website klickt, hängen wir an die Adresse den Parameter
digo_can, zum Beispielhttps://www.deineseite.de/produkte/glasierte-tasse?digo_c=184467.9f1c2ab07d3e4f51. Das gilt für die in Integrationen eingestellte Adresse der Website und ihre Subdomains. - Hat die Person Marketing-Cookies akzeptiert, speichert deine Website den Wert 7 Tage lang im Cookie
digo_c. Ein neuerer Klick ersetzt den vorherigen. - Wenn die Person kauft, sendest du den Wert des Cookies als
click_idmit der Bestellung.
Die Bestellung zählt für die Kampagne, wenn sie innerhalb von 7 Tagen nach dem letzten Klick auf diese E-Mail eingeht. Hat die Person auf mehrere E-Mails geklickt, zählt die letzte.
JavaScript, auf jeder Seite der Website
<script>
(function () {
var click = new URLSearchParams(location.search).get('digo_c');
if (!/^\d{1,19}\.[a-f0-9]{16}$/.test(click || '')) return;
if (!marketingErlaubt()) return; // die Prüfung deines Cookie-Banners
document.cookie = 'digo_c=' + click + '; path=/; max-age=604800; SameSite=Lax; Secure';
})();
</script>
PHP, wenn du die Bestellung sendest
$order['click_id'] = $_COOKIE['digo_c'] ?? null;
digo_c ist ein Marketing-Cookie: Speichere es nur mit Einwilligung der Person und führe es in deiner Cookie-Richtlinie auf (Kategorie Marketing, Dauer 7 Tage, dient dazu, Verkäufe den E-Mail-Kampagnen zuzuordnen). Akzeptiert die Person die Cookies erst, nachdem die Seite geöffnet wurde, wiederhole die Prüfung, sobald das Banner die Wahl speichert.Die Verknüpfung funktioniert nur, wenn die Klickmessung eingeschaltet ist, unter Einstellungen › Unternehmen › Öffnungen und Klicks messen: Ohne sie führen die Links der E-Mails direkt zur Website und tragen kein digo_c.
Bewährte Vorgehensweisen
- Ruf die API von deinem Server auf, nie aus dem Browser: Der Schlüssel darf ihn nicht verlassen.
- Lass deine Kundschaft nicht warten. Stelle Anmeldungen, Bestellungen und Warenkörbe im Checkout in eine Warteschlange und sende sie direkt danach: Wenn DIGO Email langsam oder nicht erreichbar ist, darf der Kauf nicht hängen bleiben.
- Wiederhole in Ruhe nach einem Netzwerkfehler, einem
429oder einem5xxund warte jedes Mal etwas länger. Anfragen mit anderen4xx-Fehlern musst du korrigieren, nicht wiederholen. - Frag die Einwilligung mit einem Kontrollkästchen ab, das nicht schon angehakt ist, und sende in
consent_textgenau den Text, den die Person gelesen hat. - Sende die Sprache der Person, die sich anmeldet, mit
language: Bestätigungs-E-Mails, Kampagnen und Abmeldeseiten richten sich danach. - Halte deinen Katalog aktuell: Sende Produkte, wenn sie sich ändern, und entferne sie, wenn sie nicht mehr verkauft werden.
- Teste mit einer Testliste und deinen eigenen Adressen. Testanmeldungen sind echte Kontakte: Sie zählen zum Limit und erhalten mit Double-Opt-in echte E-Mails. Lösche sie danach im Dashboard.
Support
Bei Fragen zur API schreib an info@digo.email. Nenne den Namen der verbundenen Website, den Endpunkt und die erhaltene Antwort: nie den Schlüssel.