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.
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.
Basis-URL für die Produktion:
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.
?token=…): URLs werden protokolliert;
ein so übergebenes Geheimnis gilt als kompromittiert und wird gewechselt.Cookie-, Origin- oder
Referer-Header. Die Anlieferung ist ein reiner Server-zu-Server-Aufruf.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.
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.
5xx oder Zeitüberschreitung mit wachsendem Abstand
wiederholen, höchstens 5 Versuche.4xx nicht wiederholen — die Anfrage ist inhaltlich falsch,
eine Wiederholung ändert daran nichts.429 warten und danach langsamer senden.POST https://erp.sol-living.de/api/v2/lead-eingang
Content-Type: application/json; charset=utf-8
x-lead-secret: <Ihr Zugangsgeheimnis>
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.
| HTTP | Rumpf | Bedeutung | Ihre 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. |
| Feld | Pflicht | Regel | Beispiel |
|---|---|---|---|
| leadId | ja | Ihre eigene, dauerhaft eindeutige ID. Grundlage der Dublettenprüfung. | AB-2026-000123 |
| vorname / nachname | siehe unten | Alternativ name als ganzer Name. | Max / Mustermann |
| telefon | siehe unten | Mit Landesvorwahl. Wird für die Dublettenprüfung normalisiert. | +491701234567 |
| siehe unten | Eine Adresse, kein Verteiler. | max@example.de | |
| strasse / hausnummer | nein | Getrennt oder zusammen als adresse. |
Hauptstraße / 12a |
| plz | nein | Genau fünf Ziffern, als String. Siehe Hinweis unten. | 06846 |
| ort | nein | — | Dessau-Roßlau |
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.
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.
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.
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".
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.
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.
Nennen Sie Ihrem Ansprechpartner eine https-Adresse. Sie erhalten daraufhin ein
zweites Geheimnis — das Signatur-Geheimnis. Es ist nicht dasselbe wie Ihr
Zugangsgeheimnis:
| Geheimnis | Wofür | Richtung |
|---|---|---|
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.
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.
| Ereignis | Bedeutung |
|---|---|
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. |
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);
Vergleichen Sie zeitkonstant (crypto.timingSafeEqual bzw. hash_equals).
Stimmt die Signatur nicht, verwerfen Sie die Meldung.
2xx gilt als angenommen. Alles andere gilt als Fehlversuch.externe_id + ereignis.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.
Beanstanden wir einen Lead, melden wir Ihnen das mit einem eigenen Code
(SL-REK-…). Sie können darauf antworten — annehmen oder bestreiten.
erstattungsfaehig mit: derselbe Sachverhalt ist bei einem
Lieferanten erstattungsfähig und bei einem anderen ausdrücklich nicht.
| Code | Sachverhalt | Nachweis |
|---|---|---|
SL-REK-001 | Dublette — derselbe Kontakt wurde bereits geliefert | ja |
SL-REK-002 | Falsche Kontaktdaten — Rufnummer oder E-Mail falsch, nicht vergeben oder nicht die des Anfragenden | — |
SL-REK-003 | Nicht erreichbar nach dokumentierten Wählversuchen | ja |
SL-REK-004 | Objekt technisch nicht realisierbar (Dach, Statik, Netzanschluss) | — |
SL-REK-005 | Ausserhalb unseres Einzugsgebiets | — |
SL-REK-006 | Kein Interesse — die Anfrage wird bestritten oder war nicht ernsthaft | — |
SL-REK-007 | Kunde wollte nur ein Angebot, kein Beratungsgespräch | — |
SL-REK-008 | Anfragender ist nicht entscheidungsbefugt (z. B. Mieter statt Eigentümer) | — |
SL-REK-009 | Vorhaben vom Kunden nachweislich verworfen | ja |
SL-REK-010 | Technischer Fehler bei der Lieferung (unvollständiger oder unbrauchbarer Datensatz) | — |
SL-REK-999 | Sonstiger Grund — kein automatischer Erstattungsanspruch | ja |
Die Nummern werden nie neu vergeben. Ein Code, den Sie heute erhalten, bedeutet in zwei Jahren dasselbe. Neue Sachverhalte bekommen neue Nummern.
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
}
}
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.
| Feld | Pflicht | Regel |
|---|---|---|
lead_idoder 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. |
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.
5xx mit Abstand, 4xx nie,
429 langsamerZusätzlich, falls Sie Rückmeldungen möchten (Abschnitt 5):
https-Adresse genannt und Signatur-Geheimnis sicher hinterlegtexterne_id + ereignis)lead.test empfangen und Signatur erfolgreich geprüft