ÖFFENTLICHE API V1
Verfügbar in Pro und Pro+
Verbinden Sie Scanlead mit Ihren Tools.
Lesen und erstellen Sie Leads aus Make, Zapier, CRM, ERP oder Skript.
In 3 Schritten starten
Erstellen Sie einen Schlüssel unter Einstellungen → API.
Senden Sie Ihren ersten curl-Aufruf mit Bearer.
Fügen Sie einen Webhook für neue Leads hinzu.
CRMlead verbinden
- 01In CRMlead → Einstellungen → Integrationen → Scanlead verbinden → Autorisieren.
- 02OAuth 2.0 mit PKCE teilt kein Geheimnis (Tarife Pro und Pro+).
Im Free-Tarif als CSV exportieren und anschließend in CRMlead importieren.
Für künftige Apps: GET /oauth/authorize und POST /oauth/token mit OAuth-2.0-Autorisierungscode und PKCE S256.
OAuth für Anwendungen
Registrieren Sie einen öffentlichen Client mit exakten Rücksprung-URLs und erlaubten Berechtigungen. Kein Client-Secret. Erzeugen Sie einen zufälligen code_verifier (43–128 Zeichen) und code_challenge = BASE64URL(SHA256(code_verifier)), ohne Padding. Der Code gilt 2 Minuten und nur einmal.
GET /oauth/authorize?response_type=code&client_id=crmlead&redirect_uri=<registered_uri>&scope=read&state=<random_state>&code_challenge=<S256_challenge>&code_challenge_method=S256
Tauschen Sie den Code per POST mit application/x-www-form-urlencoded aus. Die Antwort enthält access_token (API-v1-Schlüssel), token_type=Bearer, scope=read und workspace { id, name }. Schützen Sie den Token; unter Einstellungen → API kann er widerrufen werden. /oauth/token unterstützt kein CORS.
POST /oauth/token Content-Type: application/x-www-form-urlencoded grant_type=authorization_code&client_id=crmlead&code=<code>&redirect_uri=<registered_uri>&code_verifier=<original_verifier>
Für Zapier, Make oder eigene Skripte erstellen Sie stattdessen einen Schlüssel zum manuellen Einfügen unter Scanlead → Einstellungen → API.
Routen
Ereignislisten liefern { data: [...] }. Zum Erstellen eines Leads ist nur email erforderlich; alle anderen Felder sind optional. PATCH akzeptiert jede Auswahl, einschließlich event_id.
Das Feld status wird beim Erstellen und Aktualisieren akzeptiert. Zulässige Werte: hot, warm oder cold.
curl https://scanlead.io/api/v1/me \ -H "Authorization: Bearer slk_live_YOUR_KEY"
curl https://scanlead.io/api/v1/events \ -H "Authorization: Bearer slk_live_YOUR_KEY"
curl https://scanlead.io/api/v1/events/{id} \
-H "Authorization: Bearer slk_live_YOUR_KEY"curl https://scanlead.io/api/v1/leads?limit=50 \ -H "Authorization: Bearer slk_live_YOUR_KEY"
curl https://scanlead.io/api/v1/leads/{id} \
-H "Authorization: Bearer slk_live_YOUR_KEY"curl https://scanlead.io/api/v1/leads \
-H "Authorization: Bearer slk_live_YOUR_KEY" \
-X POST \
-H "Content-Type: application/json" \
-d '{"first_name":"Ada","last_name":"Lovelace","email":"ada@example.com","company":"Analytical Engines","tags":["vip"],"status":"hot"}'curl https://scanlead.io/api/v1/leads/{id} \
-H "Authorization: Bearer slk_live_YOUR_KEY" \
-X PATCH \
-H "Content-Type: application/json" \
-d '{"notes":"Follow up next week","status":"warm"}'Authentifizierung und Signaturen
Verwenden Sie Authorization: Bearer slk_live_…. Schlüssel haben den Umfang read oder read_write. Webhooks enthalten Scanlead-Signature: t=timestamp,v1=hex, berechnet als HMAC-SHA256(secret, timestamp.body).
Webhook-Signatur prüfen: Node.js
const crypto = require('node:crypto');
const expected = crypto.createHmac('sha256', secret).update(`${t}.${body}`).digest('hex');
if (expected !== signature) throw new Error('invalid signature');Python
import hmac, hashlib
expected = hmac.new(secret.encode(), f'{t}.{body}'.encode(), hashlib.sha256).hexdigest()
assert hmac.compare_digest(expected, signature)Limits
60 Anfragen pro Minute und Schlüssel. Lead-Listen akzeptieren 1–100 Einträge und verwenden einen undurchsichtigen Cursor.
Fehlercodes
- 401 invalid_api_key: Schlüssel fehlt, ist unbekannt oder widerrufen
- 403 insufficient_scope: ein read-Schlüssel wurde zum Schreiben verwendet
- 404 not_found: die Ressource gehört zu einem anderen Workspace
- 429 rate_limited: nach dem Retry-After-Header erneut versuchen
- 400 unknown_fields: nicht unterstützte Feldnamen stehen in error.fields. Beispiel: { error: { code: "unknown_fields", fields: ["full_name"] } }.
- 402 plan_required: Pro- oder Pro+-Abo erforderlich