Zum Hauptinhalt springen

REST-API-Referenz

Übersicht

LeadHub enthält eine vollständige REST-API, mit der externe Tools Ihre Daten lesen und schreiben können — Leads, Pipelines, Automatisierungen, Formulare und mehr. Nutzen Sie sie für die Integration mit Zapier, den Aufbau benutzerdefinierter Dashboards, die Verbindung Ihrer Website oder die Automatisierung von allem.


Basis-URL

Alle API-Anfragen gehen an:

https://yourdomain.com/api/v1

Ersetzen Sie yourdomain.com durch Ihre tatsächliche LeadHub-Domain.


Authentifizierung

Jede Anfrage (außer dem Health Check) erfordert einen API-Schlüssel.

Erstellen Sie API-Schlüssel im Admin-Panel unter Einstellungen → API-Schlüssel. Anleitungen finden Sie auf der Einstellungsseite.

Fügen Sie Ihren API-Schlüssel bei jeder Anfrage als Bearer-Token im Authorization-Header ein:

Authorization: Bearer lh_your_api_key_here

Wenn Sie eine Anfrage ohne API-Schlüssel oder mit einem ungültigen Schlüssel senden, erhalten Sie eine 401 Unauthorized-Antwort.


Rate Limiting

Jeder API-Schlüssel ist standardmäßig auf 1.000 Anfragen pro Stunde begrenzt (pro Schlüssel konfigurierbar). Wenn Sie dieses Limit überschreiten, erhalten Sie eine 429 Too Many Requests-Antwort.

Jede Antwort enthält diese Header, damit Sie Ihre Nutzung verfolgen können:

X-RateLimit-Limit: 1000
X-RateLimit-Remaining: 847
X-RateLimit-Reset: 1711580400

X-RateLimit-Reset ist ein Unix-Timestamp, wann sich Ihr Limit zurücksetzt.


Paginierung

Endpunkte, die Listen von Datensätzen zurückgeben, unterstützen Paginierung. Fügen Sie diese Query-Parameter hinzu:

ParameterStandardMaximum
page1
per_page15100

Beispiel: GET /api/v1/leads?page=2&per_page=25


Antwortformat

Erfolgreiche Antwort

{
"data": { ... },
"meta": {
"current_page": 1,
"last_page": 5,
"per_page": 15,
"total": 73,
"from": 1,
"to": 15
},
"links": {
"first": "https://yourdomain.com/api/v1/leads?page=1",
"last": "https://yourdomain.com/api/v1/leads?page=5",
"prev": null,
"next": "https://yourdomain.com/api/v1/leads?page=2",
"self": "https://yourdomain.com/api/v1/leads?page=1"
}
}

Bei Einzeldatensatz-Antworten (show, create, update) enthält data das Datensatzobjekt und meta wird weggelassen.

Fehlerantwort

{
"status": "error",
"message": "The given data was invalid.",
"code": "VALIDATION_FAILED",
"errors": {
"email": ["The email field must be a valid email address."]
}
}

Häufige Fehlercodes:

CodeHTTP-StatusBedeutung
UNAUTHORIZED401Fehlender oder ungültiger API-Schlüssel
FORBIDDEN403API-Schlüssel fehlt der erforderliche Scope
NOT_FOUND404Datensatz existiert nicht
VALIDATION_FAILED422Anfragedaten haben die Validierung nicht bestanden
RATE_LIMITED429Zu viele Anfragen
SERVER_ERROR500Unerwarteter Serverfehler

Health Check

Keine Authentifizierung erforderlich.

GET /api/v1/health

Antwort:

{
"status": "ok",
"version": "1.0.0",
"timestamp": "2026-03-28T09:15:00+00:00"
}

Damit können Sie prüfen, ob Ihre LeadHub-Instanz erreichbar ist, bevor Sie andere Anfragen stellen.


Leads

Erforderlicher Scope: read:leads zum Abrufen, write:leads zum Erstellen/Aktualisieren, delete:leads zum Löschen.

Leads auflisten

GET /api/v1/leads

Query-Parameter zum Filtern:

ParameterBeschreibung
sourceNach Quelle filtern (z. B. facebook, website)
statusNach Status filtern (z. B. new, contacted, qualified)
pipeline_idNach Pipeline-ID filtern
stage_idNach Pipeline-Stufen-ID filtern
assigned_user_idNach zugewiesener Benutzer-ID filtern
tagNach Tag-Name filtern
searchNach Name, E-Mail oder Telefon suchen
created_afterISO-8601-Datum — nur nach diesem Datum erstellte Leads
created_beforeISO-8601-Datum — nur vor diesem Datum erstellte Leads
starredtrue um nur markierte Leads anzuzeigen
sortSortierfeld: created_at, updated_at, lead_score, first_name, last_name, email
directionasc oder desc (Standard: desc)

Lead abrufen

GET /api/v1/leads/{id}

Lead erstellen

POST /api/v1/leads

Anfrage-Body (JSON):

{
"first_name": "Sarah",
"last_name": "Johnson",
"email": "[email protected]",
"phone": "+14155551234",
"source": "website",
"status": "new",
"pipeline_id": 1,
"pipeline_stage_id": 2,
"assigned_user_id": 5,
"notes": "Interested in the enterprise plan.",
"custom_fields": {
"budget": "10000"
},
"tags": ["hot-lead", "enterprise"]
}

first_name ist erforderlich. Alle anderen Felder sind optional.

Lead aktualisieren

PUT /api/v1/leads/{id}
PATCH /api/v1/leads/{id}

Senden Sie nur die Felder, die Sie aktualisieren möchten. Gleiche Felder wie beim Erstellen.

Lead löschen

DELETE /api/v1/leads/{id}

Tag zu einem Lead hinzufügen

POST /api/v1/leads/{id}/tags

Body: { "tag": "vip-client" }

Tag von einem Lead entfernen

DELETE /api/v1/leads/{id}/tags/{tag}

Pipelines

Erforderlicher Scope: read:pipelines oder write:pipelines

GET    /api/v1/pipelines
POST /api/v1/pipelines
GET /api/v1/pipelines/{id}
PUT /api/v1/pipelines/{id}
PATCH /api/v1/pipelines/{id}
DELETE /api/v1/pipelines/{id}

Pipeline-Stufen

GET    /api/v1/pipelines/{pipeline_id}/stages
POST /api/v1/pipelines/{pipeline_id}/stages
GET /api/v1/pipelines/{pipeline_id}/stages/{stage_id}
PUT /api/v1/pipelines/{pipeline_id}/stages/{stage_id}
PATCH /api/v1/pipelines/{pipeline_id}/stages/{stage_id}
DELETE /api/v1/pipelines/{pipeline_id}/stages/{stage_id}

Tags

Erforderlicher Scope: read:tags oder write:tags

GET    /api/v1/tags
POST /api/v1/tags
GET /api/v1/tags/{id}
PUT /api/v1/tags/{id}
PATCH /api/v1/tags/{id}
DELETE /api/v1/tags/{id}

Benutzer

Erforderlicher Scope: read:users, write:users oder delete:users

GET    /api/v1/users
POST /api/v1/users
GET /api/v1/users/{id}
PUT /api/v1/users/{id}
PATCH /api/v1/users/{id}
DELETE /api/v1/users/{id}

Formulare

Erforderlicher Scope: read:forms, write:forms oder delete:forms

GET    /api/v1/forms
POST /api/v1/forms
GET /api/v1/forms/{id}
PUT /api/v1/forms/{id}
PATCH /api/v1/forms/{id}
DELETE /api/v1/forms/{id}

Formular absenden

POST /api/v1/forms/{id}/submissions

Body: die Formularfeldwerte als Schlüssel-Wert-Paare.


Automatisierungen

Erforderlicher Scope: read:automations, write:automations oder delete:automations

GET    /api/v1/automations
POST /api/v1/automations
GET /api/v1/automations/{id}
PUT /api/v1/automations/{id}
PATCH /api/v1/automations/{id}
DELETE /api/v1/automations/{id}

Integrationen

Erforderlicher Scope: read:integrations oder write:integrations

GET    /api/v1/integrations/types
GET /api/v1/integrations
POST /api/v1/integrations
GET /api/v1/integrations/{id}
PUT /api/v1/integrations/{id}
PATCH /api/v1/integrations/{id}
DELETE /api/v1/integrations/{id}

GET /api/v1/integrations/types gibt die Liste der verfügbaren Integrationstypen zurück (Facebook, Google Ads, Mailgun usw.).


Eingehende Lead-Aufnahme

Ein vereinfachter Endpunkt zum Erstellen von Leads aus externen Quellen, Webhooks oder No-Code-Tools wie Zapier und Make.

POST /api/inbound/leads?tenant={workspace-slug}

Authentifizieren Sie sich mit Authorization: Bearer {api_key} und übergeben Sie den Workspace-Slug als Query-Parameter.

Anfrage-Body:

{
"email": "[email protected]",
"first_name": "Sarah",
"last_name": "Johnson",
"phone": "+14155551234",
"company": "Tech Corp",
"source": "zapier",
"notes": "Came from newsletter signup",
"tags": ["newsletter"],
"custom_fields": {
"utm_campaign": "spring-promo"
}
}

email ist erforderlich. Alle anderen Felder sind optional.

Erfolgsantwort (201):

{
"status": "created",
"lead_id": 1842,
"is_duplicate": false
}

Wenn der Lead bereits existiert (identifiziert per E-Mail oder Telefon), ist is_duplicate true und die ID des vorhandenen Leads wird zurückgegeben.


Codebeispiele

cURL

curl -X GET "https://yourdomain.com/api/v1/leads?status=new&per_page=25" \
-H "Authorization: Bearer lh_your_api_key_here" \
-H "Accept: application/json"
curl -X POST "https://yourdomain.com/api/v1/leads" \
-H "Authorization: Bearer lh_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{"first_name":"Sarah","email":"[email protected]","source":"api"}'

PHP

$apiKey = 'lh_your_api_key_here';
$baseUrl = 'https://yourdomain.com/api/v1';

// List leads
$response = file_get_contents($baseUrl . '/leads', false, stream_context_create([
'http' => [
'header' => "Authorization: Bearer {$apiKey}\r\nAccept: application/json\r\n",
],
]));
$leads = json_decode($response, true);

// Create a lead
$ch = curl_init($baseUrl . '/leads');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer {$apiKey}",
"Content-Type: application/json",
"Accept: application/json",
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
'first_name' => 'Sarah',
'email' => '[email protected]',
'source' => 'api',
]));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = json_decode(curl_exec($ch), true);
curl_close($ch);

JavaScript (fetch)

const apiKey = 'lh_your_api_key_here';
const baseUrl = 'https://yourdomain.com/api/v1';

// List leads
const response = await fetch(`${baseUrl}/leads?status=new`, {
headers: {
'Authorization': `Bearer ${apiKey}`,
'Accept': 'application/json',
},
});
const { data, meta } = await response.json();

// Create a lead
const createResponse = await fetch(`${baseUrl}/leads`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${apiKey}`,
'Content-Type': 'application/json',
'Accept': 'application/json',
},
body: JSON.stringify({
first_name: 'Sarah',
email: '[email protected]',
source: 'website',
}),
});
const newLead = await createResponse.json();