Suivi Prospects Desktop · v4.8.0

Bon retour.

Connecte-toi pour retrouver tes prospects.

ou

Réservé aux membres Pro.

La version ordinateur est incluse dans l'abonnement Pro. Passe Pro depuis l'application mobile (Paramètres › Abonnement), puis reviens ici.

⌘K
Synchronisé

Tes prospects

Chargement…

Nom ↑ Statut ↑ Ville ↑ Créé le ↑ Dernier échange ↑ Prochaine relance ↑ Notes ↑

Statistiques

Répartition et taux de conversion

À venir · Sprint 9

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.

Identifiant utilisateur —
Dernière connexion —
Méthode de connexion —

Apparence

Personnalise l'apparence de l'interface.

Mode sombre

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.

Version de l'app Desktop · v4.8.0
Projet Supabase mljljqxuahsadzgdamqd
Nombre de prospects 0
Sync temps réel —

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).

Chargement…

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/json pour 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)

ScopeAutorise
readTous les GET
writePOST (création / mise à jour) et PATCH
deleteDELETE 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

ChampTypeDescription
iduuidIdentifiant Suivi Prospects (lecture seule)
external_idstring ≤ 200Ton propre identifiant (ex. id dans ton CRM ou ton outil de campagne). Unique par compte. Sert à rendre les envois idempotents
prenom, nom, pseudostringAu moins un des trois est requis à la création
ville, situation_pro, po_video_call, freins, notesstring ≤ 5000Texte libre
ageentier 0–120
statutstringValeur libre ; idéalement un statut défini dans tes Paramètres (voir GET /config)
premier_msg, dernier_echange, prochaine_relancedateYYYY-MM-DD (ou JJ/MM/AAAA accepté en entrée, toujours renvoyé en ISO)
customobjetChamps personnalisés : { "cle": valeur }, valeurs texte / nombre / booléen. Clés = celles de Paramètres › Champs personnalisés
created_at, updated_atISO 8601Lecture 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ètreDescription
limit1–200, défaut 50
offsetPagination, défaut 0
qRecherche texte (prénom, nom, pseudo, ville, notes, external_id)
statutStatut exact
external_idRetrouver un prospect par ton identifiant
updated_since, created_sinceDate ISO 8601 : prospects modifiés / créés depuis
relance_beforeYYYY-MM-DD : à relancer jusqu'à cette date incluse
sort, ordercreated_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": "…" } }.

HTTPcodeSignification
400bad_request, bad_jsonParamètre ou JSON invalide
401missing_credentials, invalid_credentials, key_revoked, key_expiredClés absentes, fausses, révoquées ou expirées
403pro_required, insufficient_scopeAbonnement Pro expiré / permission manquante
404not_foundProspect ou route inconnu
409conflictexternal_id déjà pris
413batch_too_large, payload_too_largePlus de 100 éléments ou corps > 1 Mo
415unsupported_media_typeIl manque Content-Type: application/json
422validation_errorChamp invalide (le message précise lequel)
429rate_limitedTrop de requêtes — attendre Retry-After secondes
500server_errorErreur 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_id pour 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.