Scanlead

API PUBLIQUE V1

Disponible dans les formules Pro et Pro+

Connectez Scanlead à vos outils.

Lisez et créez vos leads depuis Make, Zapier, votre CRM, votre ERP ou un script.

Démarrage en 3 étapes

01

Créez une clé dans Réglages → API.

02

Envoyez votre premier appel curl avec Bearer.

03

Ajoutez un webhook pour recevoir les nouveaux leads.

Relier CRMlead

  1. 01Dans CRMlead → Réglages → Intégrations → Relier Scanlead → Autoriser.
  2. 02L’autorisation OAuth 2.0 avec PKCE ne partage aucun secret (formules Pro et Pro+).

En Free, exportez vos leads en CSV puis importez-les dans CRMlead.

Pour les futures applications : GET /oauth/authorize puis POST /oauth/token avec OAuth 2.0 code d’autorisation + PKCE S256.

OAuth pour les applications

Enregistrez un client public avec ses URL de retour exactes et ses droits autorisés. Aucun secret client. Générez un code_verifier aléatoire (43 à 128 caractères), puis code_challenge = BASE64URL(SHA256(code_verifier)), sans remplissage. Le code obtenu expire en 2 minutes et ne sert qu'une fois.

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

Échangez le code côté application par POST en application/x-www-form-urlencoded. La réponse contient access_token (clé API v1), token_type=Bearer, scope=read et workspace { id, name }. Conservez le jeton en sécurité ; Réglages → API permet de le révoquer. Aucun appel CORS à /oauth/token.

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>

Pour Zapier, Make ou vos scripts, créez plutôt une clé à coller manuellement dans Scanlead → Réglages → API.

Routes

Les listes d'événements renvoient { data: [...] }. Pour créer un lead, seul email est obligatoire ; les autres champs sont facultatifs. PATCH accepte n'importe quel sous-ensemble, y compris event_id.

Le champ status est accepté à la création et à la mise à jour. Valeurs autorisées : hot, warm ou cold.

GET/me
curl https://scanlead.io/api/v1/me \
  -H "Authorization: Bearer slk_live_YOUR_KEY"
GET/events
curl https://scanlead.io/api/v1/events \
  -H "Authorization: Bearer slk_live_YOUR_KEY"
GET/events/{id}
curl https://scanlead.io/api/v1/events/{id} \
  -H "Authorization: Bearer slk_live_YOUR_KEY"
GET/leads?limit=50
curl https://scanlead.io/api/v1/leads?limit=50 \
  -H "Authorization: Bearer slk_live_YOUR_KEY"
GET/leads/{id}
curl https://scanlead.io/api/v1/leads/{id} \
  -H "Authorization: Bearer slk_live_YOUR_KEY"
POST/leads
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"}'
PATCH/leads/{id}
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"}'

Authentification et signature

Utilisez Authorization: Bearer slk_live_…. Les clés ont les droits read ou read_write. Les webhooks incluent Scanlead-Signature: t=timestamp,v1=hex, calculée comme HMAC-SHA256(secret, timestamp.body).

Vérifier une signature webhook: 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)

Limites

60 requêtes par minute et par clé. Les listes de leads acceptent 1 à 100 éléments et utilisent un curseur opaque.

Codes d'erreur

  • 401 invalid_api_key : clé absente, inconnue ou révoquée
  • 403 insufficient_scope : une clé read est utilisée pour écrire
  • 404 not_found : la ressource appartient à un autre espace
  • 429 rate_limited : réessayez après le délai Retry-After
  • 400 unknown_fields : les champs non pris en charge sont refusés et leurs noms figurent dans error.fields. Exemple : { error: { code: "unknown_fields", fields: ["full_name"] } }.
  • 402 plan_required : abonnement Pro ou Pro+ requis
Voir le schéma OpenAPI 3.1 →