Lead-API

Anbindung für Leadlieferanten · Sol-Living · Stand 08.08.2026

Diese Seite richtet sich an Entwickler bei Lieferanten, die uns Leads übergeben. Sie beschreibt, wie eine Anbindung abläuft, welche Felder wir verarbeiten und woran Anbindungen erfahrungsgemäß scheitern.

Kein Selbstbedienungs-Zugang

Sie können sich nicht registrieren und keinen Schlüssel selbst erzeugen. Jede Anbindung wird bei uns einzeln eingerichtet — dazu gehören ein fester Quellen-Schlüssel, die Abrechnungsart und die Reklamationsregeln. Ohne diese Einrichtung wird ein gelieferter Lead zwar gespeichert, erscheint aber nicht in der Bearbeitungsliste, wird nicht abgerechnet und ist nicht reklamierbar. Rechnen Sie mit einem terminierten Vorlauf.

1. Zugang

Basis-URL für die Produktion:

https://erp.sol-living.de/api/v2
Der teuerste Fehler

Unter /api/v1/… antwortet ein anderes System. Es liefert plausible Antworten — teils HTTP 200, teils HTML-Fehlerseiten — sieht Ihre Leads aber nie. Faustregel: kommt HTML statt JSON zurück, sprechen Sie mit dem falschen System.

Sie erhalten von uns ein Zugangsgeheimnis, das Sie bei jeder Anfrage im Header x-lead-secret mitsenden. Es bestimmt zugleich, unter welcher Quelle Ihre Leads verbucht werden — ein Feld quelle im Rumpf wird ignoriert. Damit kann niemand unter fremder Herkunft einliefern, auch nicht versehentlich.

Was der Zugang erlaubt — und was nicht

Erlaubt: Leads Ihrer vereinbarten Quelle anliefern; denselben Lead mit derselben Lead-ID erneut senden, um Angaben zu ergänzen.

Nicht vorgesehen: Leads anderer Herkunft einliefern · bestehende Leads ändern, löschen oder deren Status setzen · Bestandsdaten oder den Bearbeitungsstand abfragen · ein Benutzerkonto im Portal. Lieferanten erhalten kein Login — unter anderem, weil ein Konto durch fremde Anmeldeversuche gesperrt werden und Ihre Lieferung dadurch stillstehen könnte.

Liefergeschwindigkeit

Es gibt keinen Sammel-Endpunkt — ein Aufruf, ein Lead. Die Annahme ist auf 60 Aufrufe pro Minute begrenzt; darüber antwortet der Endpunkt mit 429. Für Altbestände und Nachlieferungen ist die Dateilieferung vorgesehen, nicht ein schnellerer Takt.

2. Einen Lead liefern

POST https://erp.sol-living.de/api/v2/lead-eingang
Content-Type: application/json; charset=utf-8
x-lead-secret: <Ihr Zugangsgeheimnis>

Beispiel

curl -sS -X POST "https://erp.sol-living.de/api/v2/lead-eingang" \
  -H "Content-Type: application/json; charset=utf-8" \
  -H "x-lead-secret: $LEAD_SECRET" \
  -d '{
    "leadId":    "AB-2026-000123",
    "vorname":   "Max",
    "nachname":  "Mustermann",
    "telefon":   "+491701234567",
    "email":     "max.mustermann@example.de",
    "strasse":   "Hauptstraße",
    "hausnummer":"12a",
    "plz":       "06846",
    "ort":       "Dessau-Roßlau"
  }'

Alle Werte als JSON-Strings senden. Das gilt besonders für die Postleitzahl: als Zahl geschrieben verliert 06846 die führende Null.

Antworten

HTTPRumpfBedeutungIhre Reaktion
200 {"status":"received","dealId":"…"} Angelegt. dealId ist unsere Referenz. Als geliefert verbuchen, dealId speichern.
200 {"status":"duplicate","dealId":"…"} Kontakt war bereits bekannt; Ihre Angaben wurden ergänzt. Es entsteht kein zweiter Lead. Nicht erneut senden.
200 {"status":"rejected","grund":"…"} Nicht gespeichert. Der Grund nennt das fehlende Feld. Daten ergänzen, dann erneut senden.
401 {"message":"Zugang ungültig oder gesperrt"} Geheimnis fehlt, ist falsch, oder der Zugang wurde gesperrt. Nicht wiederholen. Bei uns melden.
429 Mehr als 60 Aufrufe in einer Minute. Warten, danach langsamer senden.

3. Felder

FeldPflichtRegelBeispiel
leadIdja Ihre eigene, dauerhaft eindeutige ID. Grundlage der Dublettenprüfung. AB-2026-000123
vorname / nachnamesiehe unten Alternativ name als ganzer Name.Max / Mustermann
telefonsiehe unten Mit Landesvorwahl. Wird für die Dublettenprüfung normalisiert. +491701234567
emailsiehe untenEine Adresse, kein Verteiler. max@example.de
strasse / hausnummerneinGetrennt oder zusammen als adresse. Hauptstraße / 12a
plznein Genau fünf Ziffern, als String. Siehe Hinweis unten. 06846
ortneinDessau-Roßlau
Pflicht in Kombination

leadId ist immer Pflicht. Von Name, E-Mail und Telefon muss mindestens eines gefüllt sein — fehlen alle drei, ist der Lead nicht verwertbar und wird mit rejected abgewiesen.

Zusätzliche Felder dürfen Sie mitsenden. Wir speichern den vollständigen Rumpf, auch was wir heute nicht auswerten — so ist später nachvollziehbar, was geliefert wurde.

Postleitzahl — hier scheitern Anbindungen

Angenommen wird nur eine Zeichenkette aus genau fünf Ziffern. Alles andere wird verworfen, und der Lead entsteht ohne Ortsbezug — er wird angelegt, aber keinem Vertriebspartner zugeordnet.

Nicht angenommen: 6846 (führende Null verloren) · 06846-12 · D-06846 · "277,282,283" (Listen) · 068 46. Wir raten bewusst nicht: eine falsch geratene PLZ schickt einen Vertriebler in die falsche Stadt.

4. Was nach dem Eingang passiert

Dublettenprüfung

Geprüft wird zuerst gegen Ihre leadId, danach gegen E-Mail und Telefonnummer (normalisiert, quellenübergreifend). Ein erkannter Doppelgänger wird kein zweiter Lead — Ihre Angaben ergänzen den vorhandenen. Sie erhalten duplicate mit der dealId des bestehenden Vorgangs.

Zuordnung

Die Quelle ergibt sich aus Ihrem Zugang. Der Lead landet unmittelbar in der Bearbeitungsliste des Callcenters und wird von dort einem Vertriebspartner zugewiesen — abhängig von Postleitzahl, Kapazität und Guthaben des Partners. „Angenommen" heißt nicht „sofort bearbeitet".

Reklamation

Gründe, Fristen und Meldeweg werden bei der Einrichtung vereinbart und richten sich nach dem Reklamationsgrund, nicht nach dem Lieferdatum. Ein reklamierter Lead wird Ihnen gemeldet.

5. Rückmeldung (Webhook)

Es gibt keine Abfrage-Schnittstelle — Sie fragen bei uns nichts ab. Stattdessen melden wir Ihnen, was aus einem gelieferten Lead geworden ist, sobald es feststeht. Sie hinterlegen dafür eine Adresse, wir senden dorthin.

Die Rückmeldung ist freiwillig. Ohne hinterlegte Adresse ändert sich für Sie nichts; Sie liefern wie bisher und erhalten Rückmeldungen auf dem vereinbarten Weg.

Was Sie hinterlegen

Nennen Sie Ihrem Ansprechpartner eine https-Adresse. Sie erhalten daraufhin ein zweites Geheimnis — das Signatur-Geheimnis. Es ist nicht dasselbe wie Ihr Zugangsgeheimnis:

GeheimnisWofürRichtung
x-lead-secret Beweist uns, dass Sie liefern Sie → wir
Signatur-Geheimnis Beweist Ihnen, dass die Meldung von uns stammt wir → Sie

Beide lassen sich unabhängig voneinander wechseln. Wer eines tauscht, muss das andere nicht anfassen.

Wie eine Meldung aussieht

POST https://ihre-adresse.example/hook
Content-Type: application/json
User-Agent: SolLiving-LeadWebhook/1
X-SolLiving-Ereignis: lead.terminiert
X-SolLiving-Signatur: sha256=<HMAC des Rumpfes>

{
  "ereignis":    "lead.terminiert",
  "externe_id":  "AB-2026-000123",
  "lead_id":     "cmf3k2p9x0001abcd",
  "quelle":      "IHRE_QUELLE",
  "termin_at":   "2026-08-20T09:00:00.000Z",
  "gemeldet_at": "2026-08-08T14:32:10.412Z"
}

externe_id ist Ihre ID aus dem Feld leadId der Lieferung — damit ordnen Sie die Meldung zu. lead_id ist unsere interne ID; nennen Sie sie bei Rückfragen, dann ist der Vorgang eindeutig.

Welche Ereignisse

EreignisBedeutung
lead.terminiert Ein Termin wurde vereinbart. termin_at trägt den Zeitpunkt (UTC).
lead.abgelehnt Der Lead wurde als nicht qualifiziert eingestuft.
lead.reklamiert Wir beanstanden den Lead. Zusätzlicher Block rekla im Rumpf — siehe Abschnitt 6.
lead.test Probemeldung, von Hand ausgelöst. Hängt an keinem echten Lead.
Zwischenstände melden wir bewusst nicht. „Nicht erreicht" oder „Wiedervorlage" ändern sich morgen wieder. Sie bekommen das Ergebnis, nicht den Weg dorthin — sonst rechneten Sie auf einem Zustand ab, der noch wandert.

Signatur prüfen

Der Wert in X-SolLiving-Signatur ist ein HMAC-SHA256 über den rohen Rumpf, mit Ihrem Signatur-Geheimnis als Schlüssel, hexadezimal, mit dem Präfix sha256=.

// Node.js
const erwartet = 'sha256=' + require('crypto')
  .createHmac('sha256', SIGNATUR_GEHEIMNIS)
  .update(rohBody)          // der unveränderte Rumpf, NICHT das geparste Objekt
  .digest('hex');

// PHP
$erwartet = 'sha256=' . hash_hmac('sha256', $rohBody, $signaturGeheimnis);
Über den rohen Rumpf rechnen, nicht über das wieder zusammengesetzte JSON. Parsen und neu ausgeben ändert Reihenfolge und Leerzeichen — die Signatur stimmt dann nie, und die Ursache ist von aussen kaum zu erkennen. Lesen Sie den Rumpf als Zeichenkette, prüfen Sie die Signatur, parsen Sie danach.

Vergleichen Sie zeitkonstant (crypto.timingSafeEqual bzw. hash_equals). Stimmt die Signatur nicht, verwerfen Sie die Meldung.

Was Ihre Seite antworten muss

Wiederholung und doppelte Meldungen

Die Rückmeldung ist keine Abrechnungsgrundlage. Sie zeigt den Stand im Callcenter zum Zeitpunkt der Meldung. Was abgerechnet wird, richtet sich nach der getroffenen Vereinbarung — nicht nach der Zahl der eingegangenen Meldungen.

Vor dem Scharfschalten

Wir können eine Probemeldung (lead.test) auslösen, bevor ein echter Lead durchläuft. Sie hat denselben Signatur- und Kopfzeilen-Aufbau wie eine echte Meldung — ein grüner Test sagt deshalb wirklich etwas über den Betrieb aus. Bitten Sie Ihren Ansprechpartner darum, sobald Ihre Seite steht.

6. Reklamationen

Beanstanden wir einen Lead, melden wir Ihnen das mit einem eigenen Code (SL-REK-…). Sie können darauf antworten — annehmen oder bestreiten.

Der Code benennt den Sachverhalt, nicht den Anspruch. Ob daraus eine Erstattung folgt, richtet sich allein nach der Vereinbarung mit Ihnen. Deshalb reist im Rumpf das Feld erstattungsfaehig mit: derselbe Sachverhalt ist bei einem Lieferanten erstattungsfähig und bei einem anderen ausdrücklich nicht.

Die Codes

CodeSachverhaltNachweis
SL-REK-001Dublette — derselbe Kontakt wurde bereits geliefertja
SL-REK-002Falsche Kontaktdaten — Rufnummer oder E-Mail falsch, nicht vergeben oder nicht die des Anfragenden
SL-REK-003Nicht erreichbar nach dokumentierten Wählversuchenja
SL-REK-004Objekt technisch nicht realisierbar (Dach, Statik, Netzanschluss)
SL-REK-005Ausserhalb unseres Einzugsgebiets
SL-REK-006Kein Interesse — die Anfrage wird bestritten oder war nicht ernsthaft
SL-REK-007Kunde wollte nur ein Angebot, kein Beratungsgespräch
SL-REK-008Anfragender ist nicht entscheidungsbefugt (z. B. Mieter statt Eigentümer)
SL-REK-009Vorhaben vom Kunden nachweislich verworfenja
SL-REK-010Technischer Fehler bei der Lieferung (unvollständiger oder unbrauchbarer Datensatz)
SL-REK-999Sonstiger Grund — kein automatischer Erstattungsanspruchja

Die Nummern werden nie neu vergeben. Ein Code, den Sie heute erhalten, bedeutet in zwei Jahren dasselbe. Neue Sachverhalte bekommen neue Nummern.

Wie eine Reklamation ankommt

X-SolLiving-Ereignis: lead.reklamiert

{
  "ereignis":    "lead.reklamiert",
  "externe_id":  "AB-2026-000123",
  "lead_id":     "cmf3k2p9x0001abcd",
  "quelle":      "IHRE_QUELLE",
  "termin_at":   null,
  "gemeldet_at": "2026-08-08T14:32:10.412Z",
  "rekla": {
    "code":              "SL-REK-001",
    "bedeutung":         "Dublette — derselbe Kontakt wurde bereits geliefert",
    "begruendung":       "Kontakt lag seit 04.08. unter AB-2026-000098 vor",
    "frist_bis":         "2026-08-12T00:00:00.000Z",
    "erstattungsfaehig": true
  }
}

Antworten

POST https://erp.sol-living.de/api/v2/lead-eingang/reklamation-antwort
Content-Type: application/json; charset=utf-8
x-lead-secret: <Ihr Zugangsgeheimnis>

{
  "lead_id":     "cmf3k2p9x0001abcd",
  "code":        "SL-REK-001",
  "antwort":     "bestritten",
  "begruendung": "Erstlieferung durch uns am 04.08., Protokoll liegt bei."
}

Beachten Sie: hier gilt das Zugangsgeheimnis (x-lead-secret) wie beim Liefern — nicht das Signatur-Geheimnis. Das dient nur dazu, unsere Meldungen zu prüfen.

FeldPflichtRegel
lead_id
oder externe_id
eines Aus der Reklamationsmeldung. externe_id ist Ihre eigene ID.
code ja Muss der Code sein, den wir zu diesem Lead gemeldet haben. Ein abweichender Code wird abgewiesen — sonst nähmen Sie einen Sachverhalt an, den wir nie geltend gemacht haben.
antwort ja angenommen oder bestritten.
begruendung bei Bestreitung Mindestens 10 Zeichen. Ohne sie bleibt der Vorgang für den Menschen, der ihn ansieht, unverständlich.
Eine Bestreitung löst bei uns keinen Automatismus aus. Sie wird festgehalten und einem Mitarbeiter vorgelegt. Es wird nichts automatisch zurückgebucht und nichts automatisch anerkannt — die Klärung führt ein Mensch.

Antworten: 200 mit {"status":"received"} bei Annahme, 200 mit {"status":"rejected","grund":"…"} wenn die Angaben nicht passen, 401 bei ungültigem Zugang. Ein rejected ist inhaltlich — wiederholen hilft nicht, ohne die Angaben zu korrigieren.

7. Vor dem ersten echten Lead

Zusätzlich, falls Sie Rückmeldungen möchten (Abschnitt 5):