# API-Schnittstelle (Web-to-CRM)

### API-Schnittstelle: Web-to-CRM Integration

Die CloudCRM API ist das digitale Bindeglied zwischen Ihrer eigenen Webseite und Ihrer Unternehmensverwaltung. Sie ermöglicht es, externe Datenquellen (wie Kontaktformulare, Landingpages oder Onlineshops) direkt mit Ihrem CRM zu verknüpfen. Eingehende Anfragen werden in Echtzeit verarbeitet, sicher gespeichert und lösen sofortige In-App-Benachrichtigungen an Ihr Team aus.

#### 1. Der API-Endpunkt (Die Adresse)

Alle Daten müssen per **HTTP POST** an die folgende zentrale Adresse gesendet werden:`https://cloudcrm.dwoberland.de/api/v1/lead.php`

#### 2. Authentifizierung

Damit das System die eingehenden Daten Ihrem Unternehmen zuordnen kann, muss bei jeder Anfrage Ihr persönlicher **API-Key** mitgesendet werden. Sie haben hierzu zwei Möglichkeiten:

<div _ngcontent-ng-c3490010122="" class="container" id="bkmrk-option-a-%28empfohlen%29"><div _ngcontent-ng-c2895962881="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel stronger enable-updated-hr-color" dir="ltr" inline-copy-host="">- **Option A (Empfohlen):** Übermittlung sicher im HTTP-Header als `X-API-KEY`.
- **Option B (Alternative):** Als URL-Parameter am Ende des Links: `.../lead.php?key=IHR_API_KEY`.

</div></div>#### 3. Unterstützte Datentypen (type)

Das System erkennt anhand des Feldes `"type"` im gesendeten JSON, wie die Daten im CRM verarbeitet werden sollen:

**Typ: Web-Bestellung (`"type": "order"`)** Verwenden Sie diesen Typ für Verkäufe oder verbindliche Buchungen auf Ihrer Webseite.

<div _ngcontent-ng-c3490010122="" class="container" id="bkmrk-speicherort%3A-die-dat"><div _ngcontent-ng-c2895962881="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel stronger enable-updated-hr-color" dir="ltr" inline-copy-host="">- **Speicherort:** Die Daten werden im Dashboard unter "Web-Bestellungen" (Posteingang) zur weiteren Prüfung abgelegt.
- **Team-Info:** Alle Mitarbeiter Ihres Unternehmens erhalten sofort eine Push-Benachrichtigung im CRM: *"Neue Bestellung! Eine Web-Bestellung über X,XX € ist eingegangen."*

</div></div>**Typ: Kontaktanfrage / Support (`"type": "ticket"`)** Verwenden Sie diesen Typ für allgemeine Kontaktanfragen oder Support-Formulare.

<div _ngcontent-ng-c3490010122="" class="container" id="bkmrk-speicherort%3A-erstell"><div _ngcontent-ng-c2895962881="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel stronger enable-updated-hr-color" dir="ltr" inline-copy-host="">- **Speicherort:** Erstellt automatisch ein neues Ticket in Ihrem Ticketsystem.
- **Intelligente Zuordnung:** Erkennt das CRM die übermittelte E-Mail-Adresse eines bereits existierenden Kunden, wird das Ticket automatisch in dessen digitaler Kundenakte hinterlegt.
- **Fallback:** Fehlt in der Datenübertragung ein Betreff (`subject`), wird das Ticket automatisch unter dem Titel *"Anfrage Webseite"* angelegt.

</div></div>#### 4. Technisches Format (JSON)

Die API erwartet den Daten-Payload zwingend im JSON-Format (`Content-Type: application/json`). Hier ist ein Beispiel für eine vollständige Übertragung:

<div _ngcontent-ng-c1824240726="" class="code-block ng-tns-c1824240726-228 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwi73tfY-auUAxUAAAAAHQAAAAAQugM" decode-data-ved="1" id="bkmrk-json" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_bdbfdcf3d12f0e10","c_55a27f63eee142d5",null,"rc_e682377b7c6892be",null,null,"de",null,1,null,null,1,0]]"><div _ngcontent-ng-c1824240726="" class="code-block-decoration header-formatted gds-title-s ng-tns-c1824240726-228 ng-star-inserted"><span class="ng-tns-c1824240726-228">JSON</span><div _ngcontent-ng-c1824240726="" class="buttons ng-tns-c1824240726-228 ng-star-inserted"><button aria-label="Code herunterladen" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-mdc-tooltip-trigger download-button ng-tns-c1824240726-228 mat-unthemed ng-star-inserted"></button><button aria-label="Code kopieren" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-mdc-tooltip-trigger copy-button ng-tns-c1824240726-228 mat-unthemed ng-star-inserted"></button>  
</div></div><div _ngcontent-ng-c1824240726="" class="formatted-code-block-internal-container ng-tns-c1824240726-228"><div _ngcontent-ng-c1824240726="" class="animated-opacity ng-tns-c1824240726-228"></div></div></div>```
{
  "type": "ticket",
  "email": "max.mustermann@beispiel.de",
  "subject": "Interesse an Beratung",
  "message": "Hallo, ich hätte gerne ein Angebot für Ihre Dienstleistungen.",
  "total": 0.00
}

```

**Datenfelder im Überblick:**

<div _ngcontent-ng-c3490010122="" class="container" id="bkmrk-feld-pflicht%3F-beschr"><div _ngcontent-ng-c2895962881="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel stronger enable-updated-hr-color" dir="ltr" inline-copy-host=""><div class="horizontal-scroll-wrapper"><div class="table-block-component"><div _ngcontent-ng-c2468766887="" class="table-block has-export-button new-table-style is-at-scroll-start is-at-scroll-end"><div _ngcontent-ng-c2468766887="" class="table-content" data-hveid="0" data-ved="0CAAQ3ecQahgKEwi73tfY-auUAxUAAAAAHQAAAAAQuwM" decode-data-ved="1" jslog="275421;track:impression,attention" not-end-of-paragraph=""><table data-path-to-node="19"><thead><tr><th><span data-path-to-node="19,0,0,0">Feld</span></th><th><span data-path-to-node="19,0,1,0">Pflicht?</span></th><th><span data-path-to-node="19,0,2,0">Beschreibung</span></th></tr></thead><tbody><tr><td><span data-path-to-node="19,1,0,0">`type`</span></td><td><span data-path-to-node="19,1,1,0">**Ja**</span></td><td><span data-path-to-node="19,1,2,0">Entweder `"order"` oder `"ticket"`.</span></td></tr><tr><td><span data-path-to-node="19,2,0,0">`email`</span></td><td><span data-path-to-node="19,2,1,0">**Ja**</span></td><td><span data-path-to-node="19,2,2,0">E-Mail-Adresse des Absenders (wird zur intelligenten Kundenzuordnung genutzt).</span></td></tr><tr><td><span data-path-to-node="19,3,0,0">`message`</span></td><td><span data-path-to-node="19,3,1,0">**Ja**</span></td><td><span data-path-to-node="19,3,2,0">Der eigentliche Textinhalt der Anfrage (nur bei Tickets zwingend).</span></td></tr><tr><td><span data-path-to-node="19,4,0,0">`subject`</span></td><td><span data-path-to-node="19,4,1,0">Nein</span></td><td><span data-path-to-node="19,4,2,0">Der Titel des Tickets oder der Bestellung.</span></td></tr><tr><td><span data-path-to-node="19,5,0,0">`total`</span></td><td><span data-path-to-node="19,5,1,0">Nein</span></td><td><span data-path-to-node="19,5,2,0">Nur bei `order`: Der Bruttobetrag der Bestellung als Zahl (z.B. `49.90`).</span></td></tr></tbody></table>

</div><div _ngcontent-ng-c2468766887="" class="table-footer hide-from-message-actions" hide-from-message-actions=""><button class="mdc-button mat-mdc-button-base export-sheets-button-container mat-mdc-button mat-unthemed ng-star-inserted"><span class="mdc-button__label"><span class="export-sheets-button">In Google Sheets exportieren</span></span></button><button aria-label="Tabelle kopieren" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-mdc-tooltip-trigger copy-button mat-unthemed ng-star-inserted" data-test-id="copy-table-button"></button></div></div></div></div></div></div>#### 5. Rückgabewerte &amp; Fehler

Nach dem Absenden der Daten liefert die API eine Antwort (HTTP Status Code) im JSON-Format zurück:

<div _ngcontent-ng-c3490010122="" class="container" id="bkmrk-erfolg-%28200-ok%29%3A-%7B%22s"><div _ngcontent-ng-c2895962881="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel stronger enable-updated-hr-color" dir="ltr" id="bkmrk-erfolg-%28200-ok%29%3A-%7B%22s-1" inline-copy-host="">- **Erfolg (200 OK):** `{"status":"success","message":"Daten verarbeitet","type":"..."}`
- **Format-Fehler (400):** Wenn das JSON ungültig ist oder das Pflichtfeld `type` fehlt.
- **Fehlender Key (401):** Wenn der API-Key nicht mitgesendet wurde.
- **Ungültiger Key (403):** Wenn der API-Key falsch ist oder im System deaktiviert wurde.
- **Systemfehler (500):** Ein interner Serverfehler (z. B. Datenbankverbindung).

</div></div>