Zum Hauptinhalt springen

Einführung

Dieser Abschnitt enthält die offizielle Dokumentation zur Nutzung der Lovi API mit WhatsApp über Postman. Er enthält detaillierte Anweisungen zum Einrichten und Testen von API-Anfragen für die WhatsApp-Integration, um eine reibungslose Kommunikation über die Plattform zu gewährleisten. Die Authentifizierung erfolgt über Tokens, die eine Basisauthentifizierung für die API-Dienste ermöglichen. Weitere Informationen zur Authentifizierung finden Sie auf der Seite Authentifizierung. Die Lovi API unterstützt WhatsApp-Benachrichtigungen mit Multimedia-Inhalten, dynamischen Platzhaltern, geplanter Zustellung und Integration von Konversationsabläufen.

Hauptfunktionen:

  • WhatsApp-Benachrichtigungen mit Multimedia-Unterstützung
  • Dynamische Inhaltspersonalisierung mit Platzhaltern
  • Geplante Nachrichtenzustellung mit Zeitzonen-Unterstützung
  • Integration von Konversationsabläufen
  • Zwei Datenstrukturformate (verschachtelt und flach)

📣 WhatsApp-Benachrichtigung senden

Um eine Benachrichtigung über die Lovi API zu senden, führen Sie eine POST-Anfrage an den Endpoint mit den erforderlichen Parametern und der Authentifizierung durch.
Methode: POST Format: JSON

Endpoint

Query-Parameter

Beispiel-URLs:
Hinweis: Die Authentifizierung erfolgt über den Parameter access_key in der URL, nicht über Header.

📋 Anfrageparameter

Die API unterstützt zwei Datenstrukturformate, gesteuert durch den Parameter unflatten.

Erforderliche Parameter

Wichtig: Sie müssen entweder contact (für einen einzelnen Empfänger) ODER contacts (für mehrere Empfänger) verwenden, aber NICHT beides.

Optionale Parameter


👥 Einzelner vs. Mehrere Empfänger

Verwendung von contact - An eine Person senden

Verwenden Sie contact, wenn Sie eine Benachrichtigung an einen Empfänger senden möchten. Struktur:
  • contact ist ein Objekt (keine Liste)
  • Erforderliches Feld: number
  • Optionale Felder: name, email und beliebige benutzerdefinierte Felder

Verwendung von contacts - An mehrere Personen senden (Massenversand)

Verwenden Sie contacts, wenn Sie dieselbe Benachrichtigung an mehrere Empfänger gleichzeitig senden möchten. Struktur:
  • contacts ist eine Liste/Array (kein einzelnes Objekt)
  • Maximum: 100 Kontakte pro Anfrage
  • Jeder Kontakt in der Liste muss eine number haben
  • Optionale Felder: name, email und beliebige benutzerdefinierte Felder
Wichtige Einschränkungen:
  • ⚠️ unflatten=true kann nicht mit contacts verwendet werden - Massenversand funktioniert nur mit verschachtelter Struktur
  • ⚠️ contact und contacts können nicht gleichzeitig verwendet werden - wählen Sie eines
  • ⚠️ Die contacts-Liste darf nicht leer sein - muss mindestens 1 Kontakt enthalten

🔄 Datenstrukturformate

Die API unterstützt zwei Formate basierend auf dem Parameter unflatten:

Verschachtelte Struktur (unflatten=false oder weggelassen)

Wenn unflatten=false oder nicht angegeben, verwenden Sie verschachtelte Objekte:

Flache Struktur (unflatten=true)

Wenn unflatten=true, müssen alle verschachtelten Objekte mit Punktnotation abgeflacht werden:

Wann welches Format verwenden

  • Verschachtelte Struktur (unflatten=false): Empfohlen für bessere Lesbarkeit und wenn Ihr System verschachtelte Objekte unterstützt
  • Flache Struktur (unflatten=true): Verwenden, wenn Ihr System keine verschachtelten Objekte unterstützt oder eine flache Datenstruktur erfordert

🎨 Komponenten & Multimedia

WICHTIG: Komponenten, die Sie dynamisch senden können, sind NUR diejenigen, die vom Template-Komponenten-Endpoint zurückgegeben werden. Die Struktur variiert je nachdem, ob das Template Variablen oder Medien hat.

Regeln für Komponentennamen

  • Header-Medien: header_image, header_video, header_document (KEINE Suffixnummer)
  • Body-Variablen: body_text_0, body_text_1, body_text_2, etc. (mit Indexnummer für jeden {"{1}"}, {"{2}"}, {"{3}"} Platzhalter)
  • Footer und Buttons: Sind STATISCH in der Template-Definition und KÖNNEN NICHT dynamisch gesendet werden

So erfahren Sie, welche Komponenten zu senden sind

  1. Rufen Sie zuerst den Template-Komponenten-Endpoint auf:
  2. Die API gibt nur die Komponenten zurück, die Sie bereitstellen müssen:
  3. Senden Sie NUR diese Komponenten in Ihrer Benachrichtigungsanfrage

Komponententypen nach Position

Header-Komponenten (nur Medien)

WICHTIG: Nur EINE Header-Komponente pro Template. Header-Text ist STATISCH im Template. Hinweis: header_text ist KEINE dynamische Komponente. Header-Text wird im Template definiert und kann nicht geändert werden.

Body-Komponenten (nur Variablen)

Body-Text mit Platzhaltern erfordert Variablen in der Reihenfolge: {"{1}"}, {"{2}"}, {"{3}"}, etc. Beispiel-Template: “Hallo {"{1}"}, Ihr Kurs {"{2}"} ist bereit”
  • body_text_0: Wert für {"{1}"} (z.B. “Maria”)
  • body_text_1: Wert für {"{2}"} (z.B. “JavaScript”)
⚠️ Footer ist STATISCH - wird im Template definiert und kann nicht pro Nachricht geändert werden.

Button-Komponenten

WICHTIG: Die meisten Buttons sind STATISCH im Template. URL-Buttons mit Variablen KÖNNEN jedoch dynamisch sein. Beispiel-Template-Button: "url": "https://example.com/{"{1}"}"
  • Das Template definiert das URL-Muster mit Platzhalter
  • Sie geben den Wert für {"{1}"} über buttons_url_0 an
Hinweis: Schnellantwort-Buttons sind immer statisch und können nicht pro Nachricht geändert werden.

Komponentenbeispiele

Beispiel 1: Template mit Bild-Header (Verschachtelte Struktur)

Beispiel 2: Template mit Body-Variablen (Verschachtelte Struktur)

Beispiel 3: Template mit Bild und Variablen (Flache Struktur)


🧩 Template-Variablen (Body-Text)

KRITISCH: Variablen in WhatsApp-Templates verwenden positionelle Platzhalter wie {"{1}"}, {"{2}"}, {"{3}"}, NICHT benannte Variablen wie {"{name}"}.

Wie Template-Variablen funktionieren

WhatsApp-Templates definieren Variablen als nummerierte Platzhalter im Template-Body-Text:
  • Template-Text: “Hallo {"{1}"}, Ihr Kurs {"{2}"} ist bereit”
  • {"{1}"} entspricht body_text_0
  • {"{2}"} entspricht body_text_1

Variablenzuweisung

Sie geben die Werte für diese nummerierten Platzhalter im components_push-Objekt an:
Ergebnis: “Hallo María, Ihr Kurs JavaScript Advanced Course ist bereit”

Wichtige Regeln

  1. Positionsreihenfolge wichtig: body_text_0 = {"{1}"}, body_text_1 = {"{2}"}, etc.
  2. Direkte Werte: Geben Sie den tatsächlichen Wert an, nicht die {"{variable}"}-Syntax
  3. Alle Variablen erforderlich: Müssen Werte für alle {"{N}"}-Platzhalter im Template angeben
  4. Kein Mischen: Kann Variablen nicht mit statischem Text in components_push kombinieren

✅ Gültige Beispiele

Template: “Hallo {"{1}"}, Ihre Bestellung {"{2}"} ist bereit”
Sie können auch Kontaktfelder direkt verwenden:

❌ Ungültige Beispiele

Variablenauflösung

Das System löst {"{variable}"}-Referenzen in components_push auf, indem es sucht:
  1. Zuerst im contact-Objekt
  2. Dann in Parametern auf Root-Ebene

⏰ Planung & Konversationsabläufe

Sofortige Zustellung (Standard)

Wenn datetime_sending nicht angegeben ist, wird die Nachricht sofort gesendet:

Geplante Zustellung

Verwenden Sie datetime_sending und timezone, um Nachrichten zu planen: Verschachtelte Struktur:
Flache Struktur:

Integration von Konversationsabläufen

Verwenden Sie name_event, um bestimmte Konversationsabläufe auszulösen:

📋 Vollständige Beispiele

Beispiel 1: Einzelner Empfänger mit Body-Variablen

Senden an EINE Person mit contact Template: “Hallo {"{1}"}, vielen Dank für Ihr Interesse an {"{2}"}!” Anfrage:
Antwort:

Beispiel 1B: Mehrere Empfänger (Massenversand)

Senden an MEHRERE Personen mit contacts Template: “Hallo {"{1}"}, vielen Dank für Ihr Interesse an {"{2}"}!” Anfrage:
Antwort:
Wenn einige Kontakte fehlschlagen:

Beispiel 2: Template mit Bild-Header

Template-Komponenten: ["header_image"] URL:
Verschachtelte Struktur:
Hinweis: Body, Footer und Buttons sind im Template statisch und können nicht geändert werden.

Beispiel 3: Template mit PDF-Dokument

Template-Komponenten: ["header_document"] URL:
Flache Struktur:

Beispiel 4: Auslösung eines Konversationsablaufs

Verschachtelte Struktur:

📊 Antwortcodes

Erfolgreiche Antwort (200 OK)

Sofortiger Versand:
Geplanter Versand:

Fehlerantworten

400 Bad Request - Ungültige Parameter

401 Unauthorized - Ungültiger Zugriffsschlüssel

404 Not Found - Template nicht gefunden

422 Unprocessable Entity - Geschäftslogikfehler

429 Too Many Requests - Anfragelimit


🔧 Bewährte Praktiken

Datenstruktur

  • Bevorzugen Sie die verschachtelte Struktur (unflatten=false) für bessere Lesbarkeit
  • Verwenden Sie die flache Struktur (unflatten=true) nur wenn Ihr System es erfordert
  • Validieren Sie die Struktur vor dem Senden von Anfragen

Medienrichtlinien

  • Verwenden Sie HTTPS-URLs für alle Mediendateien
  • Optimieren Sie Dateigrößen für schnellere Zustellung
  • Verwenden Sie öffentliche URLs ohne Authentifizierungsanforderungen
  • Testen Sie Medien-URLs vor dem Versand, um die Erreichbarkeit sicherzustellen

Planung

  • Geben Sie die Zeitzone an bei Verwendung von datetime_sending
  • Validieren Sie zukünftige Daten vor der Planung
  • Berücksichtigen Sie Geschäftszeiten für besseres Engagement
  • Testen Sie die Planung in der Entwicklungsumgebung

Platzhalter

  • Verwenden Sie aussagekräftige Variablennamen, die zu Ihren Daten passen
  • Testen Sie die Variablenersetzung vor der Produktion
  • Halten Sie eine Variable pro Feld ein, um Fehler zu vermeiden
  • Stellen Sie Fallback-Werte in Ihrer Anwendungslogik bereit

Leistung

  • Bündeln Sie mehrere Benachrichtigungen wenn möglich
  • Cachen Sie Template-Informationen, um API-Aufrufe zu reduzieren
  • Überwachen Sie Anfragelimits und implementieren Sie Backoff-Strategien
  • Verwenden Sie Connection-Pooling für bessere Leistung

🚨 Häufige Fehler & Lösungen

Kontakt-/Kontakte-Validierungsfehler

Fehler: Fehlende Kontaktinformationen

Problem: Anfrage enthält weder contact noch contacts
Lösung: Sie müssen entweder contact (für eine Person) ODER contacts (für mehrere Personen) angeben

Fehler: Gleichzeitige Verwendung von Contact und Contacts

Problem: Anfrage enthält sowohl contact als auch contacts gleichzeitig
Lösung: Wählen Sie nur eines - verwenden Sie contact für einzelne Empfänger oder contacts für mehrere Empfänger

Fehler: Contact ist eine Liste statt eines Objekts

Problem: contact als Liste [...] statt als Objekt {...} gesendet
Lösung: Für einen einzelnen Empfänger verwenden Sie contact als Objekt:

Fehler: Contacts ist keine Liste

Problem: contacts als Objekt {...} statt als Liste [...] gesendet
Lösung: Für mehrere Empfänger verwenden Sie contacts als Liste:

Fehler: Leere Kontaktliste

Problem: contacts als leere Liste [] gesendet
Lösung: Fügen Sie mindestens einen Kontakt in die Liste ein

Fehler: Zu viele Kontakte

Problem: Mehr als 100 Kontakte in der contacts-Liste gesendet
Lösung: Teilen Sie Ihre Kontakte in mehrere Anfragen mit maximal 100 Kontakten auf

Fehler: Unflatten mit Contacts

Problem: unflatten=true mit contacts (Massenversand) verwendet
Lösung: Massenversand mit contacts funktioniert nur mit verschachtelter Struktur. Entfernen Sie unflatten=true oder verwenden Sie unflatten=false

Strukturkonflikt

Problem: Vermischung von verschachtelten und flachen Strukturen Lösung: Wählen Sie ein Format konsistent basierend auf dem unflatten-Parameter

Template nicht gefunden

Problem: Verwendung eines nicht existierenden oder nicht genehmigten Templates Lösung: Überprüfen Sie den Template-Namen und den Genehmigungsstatus mithilfe der Template-Management-Endpoints

Ungültiges Telefonnummernformat

Problem: ’+’ oder Leerzeichen in der Telefonnummer enthalten Lösung: Verwenden Sie das saubere internationale Format ohne Symbole (z.B. 34666033135)

Fehler bei Komponentennamen

Problem: Verwendung falscher Komponentennamen wie header_image_0 statt header_image Lösung: Überprüfen Sie immer zuerst die Template-Komponenten mit dem /notify/template/components Endpoint

Fehler bei Variablenpositionen

Problem: Falsche Zuordnung zwischen Template-Platzhaltern und body_text-Komponenten Lösung: Denken Sie daran: {"{1}"} = body_text_0, {"{2}"} = body_text_1, etc.

Änderung statischer Komponenten

Problem: Versuch, Footer, Buttons oder Header-Text dynamisch zu senden Lösung: Diese Komponenten sind im Template statisch. Senden Sie nur Komponenten, die vom Template-Komponenten-Endpoint zurückgegeben werden

Planungsfehler

Problem: Vergangene Daten oder ungültige Zeitzone Lösung: Verwenden Sie zukünftige Daten im ISO 8601-Format mit gültigen IANA-Zeitzonencodes

🔬 Template-Beispiele

Diese Beispiele zeigen verschiedene Arten von Template-Strukturen.

Beispiel 1: Einfaches Nur-Text-Template

Von der API zurückgegebene Komponenten: [] (leer - keine dynamischen Komponenten)
Hinweis: Kein components_push erforderlich, da das Template keine dynamischen Komponenten hat.

Beispiel 2: Template mit Body-Variablen

Template-Body: “Hallo {"{1}"}, Ihr {"{2}"} ist bereit!” Von der API zurückgegebene Komponenten: ["body_text_0", "body_text_1"]
Ergebnis: “Hallo John, Ihr Premium Package ist bereit!”

Beispiel 3: Template mit Bild-Header

Von der API zurückgegebene Komponenten: ["header_image"]
Hinweis: Body, Footer und Buttons sind im Template statisch.

Beispiel 4: Template mit Video-Header

Von der API zurückgegebene Komponenten: ["header_video"]

Beispiel 5: Template mit PDF-Dokument

Von der API zurückgegebene Komponenten: ["header_document"]

Beispiel 6: Template mit Header-Text und Body-Variable

Header: “Wichtiger Hinweis” (statischer Text im Template) Body: “Hallo {"{1}"}, willkommen auf unserer Plattform!” Von der API zurückgegebene Komponenten: ["body_text_0"]
Ergebnis:
  • Header: “Wichtiger Hinweis”
  • Body: “Hallo Michael, willkommen auf unserer Plattform!”

Beispiel 7: Template mit dynamischem URL-Button

Body: Statischer Text Buttons:
  • URL-Button mit Variable: "url": "https://example.com/{"{1}"}" (dynamisch)
  • Schnellantwort-Button: “Support kontaktieren” (statisch) Von der API zurückgegebene Komponenten: ["buttons_url_0"]
Ergebnis: Der URL-Button verlinkt zu https://example.com/profile/12345 Hinweis: Die Variable in buttons_url_0 kann Kontaktfelder mit der {"{variable}"}-Syntax referenzieren, und das System löst sie vor dem Versand auf.

Kampagnenstatus abfragen

Nach dem Erstellen den Fortschritt per GET abfragen, per ID oder per Name. Derselbe Endpoint gilt für WhatsApp und Voice (POST /notify/voice). Es gibt kein notification_id. Status braucht keine Extra-Permission; jeder gültige Key der Firma. Create braucht whatsapp_notifications am Key. Status braucht keine Extra-Permission. Max. 100 Kontakte. Kein HTTP-Rate-Limit, keine Pagination. Bei contacts ist message "Processing completed" plus Zähler. Host: https://cloud.lovi.ai/functions/v1/…. app.lovi.ai/functions ist nicht diese API.
Große Versände werden oft in Batches mit gleichem Namen erstellt (z. B. 4 × F001): per Name kommen die Summen, campaigns listet jeden Batch. Wird ein Name an verschiedenen Tagen wiederverwendet, wird ebenfalls summiert — dann per campaign_id abfragen.
Mit failed_limit kommen zusätzlich failed_list und failed_offset. Nächste Seite: failed_offset um failed_limit erhöhen; leere Liste = Ende.
Fehlerkörper: { "success": false, "message": "…" }. 400 fehlende Parameter oder campaign_id keine UUID. 404 ungültiger Key (nicht 401) oder fremde/unbekannte Kampagne. 500 intern.

📚 Verwandte Dokumentation