Tes prospects
Chargement…
| Nom ↑ | Statut ↑ | Ville ↑ | Créé le ↑ | Dernier échange ↑ | Prochaine relance ↑ | Notes ↑ |
|---|
Statistiques
Répartition et taux de conversion
Graphiques
Courbes d'évolution, comparatifs par réseau, funnel de conversion.
Import / Export
Sauvegarde et migration de tes données
Exporter
Télécharge tous tes prospects au format JSON, compatible avec l'app mobile.
Importer
Dépose ici un fichier JSON exporté depuis l'app mobile ou desktop. Les prospects existants ayant le même ID seront mis à jour.
Paramètres
Personnalisation et gestion du compte
Mon compte
Informations de ton compte Supabase.
Apparence
Personnalise l'apparence de l'interface.
Déconnexion
Déconnecte-toi de ce navigateur. Tes données restent synchronisées.
Statuts des prospects
Personnalise les libellés et couleurs de tes statuts. Glisse-dépose pour réordonner. Ces changements s'appliquent au tableau et aux chips.
Champs personnalisés
Ajoute des champs supplémentaires pour tes prospects. Ils apparaîtront dans le formulaire d'édition.
Export
Télécharge tes prospects et ta configuration. Format compatible avec l'app mobile.
Import
Importe un fichier JSON exporté depuis l'app mobile ou desktop.
Informations techniques
Données utiles pour le support ou le débogage.
Zone dangereuse
Ces actions sont irréversibles. Fais un export avant.
Réinitialiser la configuration
Rétablit les statuts, listes déroulantes et champs personnalisés à leurs valeurs par défaut. Tes prospects ne sont pas touchés.
Supprimer tous mes prospects
Supprime définitivement tous tes prospects. Cette action est irréversible.
API
Connecte tes outils et applications : ajoute, lis, modifie et retire des prospects en temps réel.
Créer une clé
Une clé = une paire clé publique (pk_…, identifie la clé) + clé secrète (sk_…, prouve que c'est bien toi). La clé secrète n'est affichée qu'une seule fois : copie-la tout de suite dans ton application.
Mes clés
Révoquer une clé la désactive immédiatement. Les appels de ton application avec cette clé échoueront (401).
Introduction
L'API REST de Suivi Prospects te permet de lire et d'écrire les prospects de ton compte depuis n'importe quel serveur. Elle est réservée aux comptes Pro : si l'abonnement expire, l'API répond 403 pro_required.
- Format : JSON (UTF-8),
Content-Type: application/jsonpour les requêtes avec corps. - Version :
v1(incluse dans l'URL). Les ajouts de champs ne casseront pas la v1. - Accès limité à ton compte : une clé ne voit jamais les données d'un autre utilisateur.
URL de base
Authentification
Chaque requête envoie la paire de clés dans deux en-têtes HTTP :
X-Public-Key: pk_xxxxxxxxxxxxxxxxxxxxxxxx
X-Secret-Key: sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
La clé secrète n'est jamais stockée en clair chez nous (seule son empreinte SHA-256 l'est). Stocke-la dans une variable d'environnement de ton serveur, jamais dans le code source ni côté navigateur.
Permissions (scopes)
| Scope | Autorise |
|---|---|
read | Tous les GET |
write | POST (création / mise à jour) et PATCH |
delete | DELETE et POST /prospects/delete |
Une clé sans la permission requise reçoit 403 insufficient_scope.
Test rapide
curl "/me" \
-H "X-Public-Key: $SP_PUBLIC_KEY" \
-H "X-Secret-Key: $SP_SECRET_KEY"
L'objet Prospect
| Champ | Type | Description |
|---|---|---|
id | uuid | Identifiant Suivi Prospects (lecture seule) |
external_id | string ≤ 200 | Ton propre identifiant (ex. id dans ton CRM ou ton outil de campagne). Unique par compte. Sert à rendre les envois idempotents |
prenom, nom, pseudo | string | Au moins un des trois est requis à la création |
ville, situation_pro, po_video_call, freins, notes | string ≤ 5000 | Texte libre |
age | entier 0–120 | |
statut | string | Valeur libre ; idéalement un statut défini dans tes Paramètres (voir GET /config) |
premier_msg, dernier_echange, prochaine_relance | date | YYYY-MM-DD (ou JJ/MM/AAAA accepté en entrée, toujours renvoyé en ISO) |
custom | objet | Champs personnalisés : { "cle": valeur }, valeurs texte / nombre / booléen. Clés = celles de Paramètres › Champs personnalisés |
created_at, updated_at | ISO 8601 | Lecture seule |
Les champs inconnus sont ignorés. Envoyer null ou "" vide un champ.
{
"id": "3f1c9a52-8d1e-4c36-9b0a-6d1c2e7f4a10",
"external_id": "crm-48213",
"prenom": "Camille",
"nom": "Durand",
"pseudo": "@camille.d",
"ville": "Lyon",
"age": 34,
"situation_pro": "Infirmière",
"statut": "Chaud",
"premier_msg": "2026-10-12",
"dernier_echange": "2026-10-13",
"prochaine_relance": "2026-10-16",
"freins": "Manque de temps",
"notes": "Vient de la campagne Instagram d'octobre",
"custom": { "campagne": "oct-2026", "source": "instagram" },
"created_at": "2026-10-13T09:12:44.120Z",
"updated_at": "2026-10-13T09:12:44.120Z"
}
Lister les prospects GET /prospects
Paramètres de requête (tous optionnels) :
| Paramètre | Description |
|---|---|
limit | 1–200, défaut 50 |
offset | Pagination, défaut 0 |
q | Recherche texte (prénom, nom, pseudo, ville, notes, external_id) |
statut | Statut exact |
external_id | Retrouver un prospect par ton identifiant |
updated_since, created_since | Date ISO 8601 : prospects modifiés / créés depuis |
relance_before | YYYY-MM-DD : à relancer jusqu'à cette date incluse |
sort, order | created_at (défaut), updated_at, prochaine_relance, dernier_echange, nom, prenom · asc / desc (défaut) |
curl "/prospects?statut=Chaud&limit=20" \
-H "X-Public-Key: $SP_PUBLIC_KEY" -H "X-Secret-Key: $SP_SECRET_KEY"
{
"data": [ { …prospect… }, … ],
"pagination": { "total": 128, "limit": 20, "offset": 0, "has_more": true }
}
Lire un prospect GET /prospects/{id}
Par identifiant Suivi Prospects. Pour utiliser ton propre identifiant : GET /prospects?external_id=crm-48213 (renvoie une liste de 0 ou 1 élément).
curl "/prospects/3f1c9a52-8d1e-4c36-9b0a-6d1c2e7f4a10" \
-H "X-Public-Key: $SP_PUBLIC_KEY" -H "X-Secret-Key: $SP_SECRET_KEY"
Réponse : { "data": { …prospect… } } — 404 not_found si absent.
Ajouter / mettre à jour POST /prospects
Accepte un objet, un tableau ou { "prospects": [ … ] } (100 maximum par requête). Si un prospect fournit un external_id déjà connu, il est mis à jour (seuls les champs envoyés changent ; custom est fusionné) au lieu d'être dupliqué. Tu peux donc rejouer un envoi sans risque.
curl -X POST "/prospects" \
-H "X-Public-Key: $SP_PUBLIC_KEY" -H "X-Secret-Key: $SP_SECRET_KEY" \
-H "Content-Type: application/json" \
-d '{
"external_id": "crm-48213",
"prenom": "Camille",
"nom": "Durand",
"ville": "Lyon",
"statut": "Chaud",
"premier_msg": "2026-10-12",
"prochaine_relance": "2026-10-16",
"custom": { "campagne": "oct-2026" }
}'
Réponse unitaire : 201 (créé) ou 200 (mis à jour) avec { "data": {…}, "status": "created" | "updated" }.
Réponse en lot :
{
"data": [ {…}, {…} ],
"results": [ { "index": 0, "status": "created", "id": "…" }, { "index": 1, "status": "updated", "id": "…" } ],
"summary": { "created": 1, "updated": 1 }
}
Un lot est validé en entier avant écriture : une erreur de validation (422) rejette tout le lot et indique l'indice fautif (prospects[3] : …).
Modifier PATCH /prospects/{id}
Modification partielle : seuls les champs envoyés changent. Dans custom, les clés sont fusionnées ; une clé à null est supprimée. Alternative sans connaître l'id : PATCH /prospects?external_id=crm-48213.
curl -X PATCH "/prospects?external_id=crm-48213" \
-H "X-Public-Key: $SP_PUBLIC_KEY" -H "X-Secret-Key: $SP_SECRET_KEY" \
-H "Content-Type: application/json" \
-d '{ "statut": "Client", "dernier_echange": "2026-10-14" }'
Retirer DELETE /prospects/{id}
Nécessite le scope delete. Suppression définitive. Aussi possible par DELETE /prospects?external_id=…. Réponse : { "deleted": true, "id": "…" }.
Suppression en lot POST /prospects/delete
curl -X POST "/prospects/delete" \
-H "X-Public-Key: $SP_PUBLIC_KEY" -H "X-Secret-Key: $SP_SECRET_KEY" \
-H "Content-Type: application/json" \
-d '{ "external_ids": ["crm-48213", "crm-48214"] }'
Corps : ids (UUID) ou external_ids, 100 maximum. Réponse : { "deleted": 2, "ids": ["…", "…"] }. Les identifiants inconnus sont simplement ignorés.
Configuration et statistiques
GET /config
Tes statuts et champs personnalisés — pour que ton application utilise exactement les mêmes valeurs.
{ "data": {
"statuses": [ { "value": "Chaud", "color": "#E94B3C", "bg": "#FBE3DF" }, … ],
"custom_fields": [ { "key": "campagne", "label": "Campagne", "type": "text" } ]
} }
GET /stats
{ "data": { "total": 128, "by_status": { "Chaud": 12, "Froid": 40, "": 3 } } }
GET /me
Vérifie qu'une paire de clés fonctionne et renvoie ses permissions.
Erreurs et limites
Toute erreur a la forme { "error": { "code": "…", "message": "…" } }.
| HTTP | code | Signification |
|---|---|---|
| 400 | bad_request, bad_json | Paramètre ou JSON invalide |
| 401 | missing_credentials, invalid_credentials, key_revoked, key_expired | Clés absentes, fausses, révoquées ou expirées |
| 403 | pro_required, insufficient_scope | Abonnement Pro expiré / permission manquante |
| 404 | not_found | Prospect ou route inconnu |
| 409 | conflict | external_id déjà pris |
| 413 | batch_too_large, payload_too_large | Plus de 100 éléments ou corps > 1 Mo |
| 415 | unsupported_media_type | Il manque Content-Type: application/json |
| 422 | validation_error | Champ invalide (le message précise lequel) |
| 429 | rate_limited | Trop de requêtes — attendre Retry-After secondes |
| 500 | server_error | Erreur côté serveur : réessayer plus tard |
Limite : 120 requêtes par minute et par clé (en-têtes X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset). Pour importer beaucoup de prospects, utilise les lots de 100.
Exemples d'intégration
Node.js / TypeScript (côté serveur)
const BASE = '';
const headers = {
'X-Public-Key': process.env.SP_PUBLIC_KEY,
'X-Secret-Key': process.env.SP_SECRET_KEY,
'Content-Type': 'application/json',
};
async function sp(method, path, body) {
const res = await fetch(BASE + path, { method, headers, body: body ? JSON.stringify(body) : undefined });
const json = await res.json();
if (res.status === 429) { // trop de requêtes : on attend puis on réessaie
await new Promise(r => setTimeout(r, (+res.headers.get('Retry-After') || 5) * 1000));
return sp(method, path, body);
}
if (!res.ok) throw new Error(`${json.error.code}: ${json.error.message}`);
return json;
}
// Ajouter / mettre à jour un lead de campagne (idempotent grâce à external_id)
await sp('POST', '/prospects', {
external_id: 'crm-48213', prenom: 'Camille', nom: 'Durand',
statut: 'Chaud', custom: { campagne: 'oct-2026' },
});
// Passer le prospect en « Client »
await sp('PATCH', '/prospects?external_id=crm-48213', { statut: 'Client' });
// Le retirer de la liste
await sp('DELETE', '/prospects?external_id=crm-48213');
// Relire les prospects modifiés depuis hier
const { data } = await sp('GET', '/prospects?updated_since=2026-10-12T00:00:00Z&limit=200');
PHP
$ch = curl_init('/prospects');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
'X-Public-Key: ' . getenv('SP_PUBLIC_KEY'),
'X-Secret-Key: ' . getenv('SP_SECRET_KEY'),
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'external_id' => 'crm-48213', 'prenom' => 'Camille', 'statut' => 'Chaud',
]),
]);
$res = json_decode(curl_exec($ch), true);
Python
import os, requests
H = {"X-Public-Key": os.environ["SP_PUBLIC_KEY"], "X-Secret-Key": os.environ["SP_SECRET_KEY"]}
r = requests.post("/prospects", headers=H,
json={"external_id": "crm-48213", "prenom": "Camille", "statut": "Chaud"})
r.raise_for_status()
print(r.json()["data"]["id"])
Bonnes pratiques de sécurité
- Garde la clé secrète côté serveur uniquement (variable d'environnement). Si elle fuite : révoque-la ici, crée-en une nouvelle.
- Une clé par application / environnement, avec le minimum de permissions (lecture seule si tu ne fais que consulter).
- Utilise une expiration pour les clés temporaires.
- Utilise toujours
external_idpour tes envois automatiques : un rejeu ne crée pas de doublons. - Les données importées via l'API apparaissent immédiatement dans l'application desktop (rafraîchis la liste) et dans ton compte cloud.