Aller au contenu
FantomHunt
Se connecter

La référence de l’API.

Une clé par outil, des droits choisis un à un : lire votre compte, modifier le CRM, envoyer et dépenser des crédits. Chaque appel ci-dessous reflète exactement ce que répond le serveur.

120 requêtes par minute et par clé Pagination par curseur Erreurs normalisées

Référence API

Base : https://api.fantomhunt.com/v1 · Authentification : Authorization: Bearer fh_live_… · Quota : 120 requêtes par minute et par clé (en-têtes RateLimit-* sur chaque réponse). Une limite par adresse s’ajoute : 600 requêtes par minute. Les prospects et les contacts se paginent : la réponse est { donnees, curseur_suivant }, repassez curseur pour la page suivante (limite : 50 par défaut, 200 maximum ; curseur_suivant vaut null à la dernière page). Les autres listes renvoient { donnees } en une fois. Les dates sont en ISO 8601 (UTC), les montants des affaires en centimes.

AppelCe qu’il rend
GET /v1/moiLe compte derrière la clé : ses droits, les crédits IA et contact restants, les invitations LinkedIn du mois. L’appel de vérification de toute intégration.
GET /v1/etatCe que la machine fait pour vous : prospection en pause ou non, frein LinkedIn, prochaine action prévue, canaux connectés, usage du jour et de la semaine face aux limites.
GET /v1/prospectsVos prospects LinkedIn : liste filtrable et paginée, ou UNE fiche retrouvée par son email, son lien LinkedIn ou son téléphone.
GET /v1/prospects/:idUne fiche complète : coordonnées, statut, score, offre, étiquettes, campagnes en cours, dates clés.
GET /v1/prospects/:id/journalLe journal : le type d’événement et sa date ; avec le droit « messages », le contenu (note, compte rendu, texte du message).
GET /v1/prospects/:id/conversationDroit « messages » : le fil de la personne, LinkedIn, WhatsApp et email réunis, du plus récent au plus ancien ({ donnees, avant_suivant }).
GET /v1/contacts-whatsappLe répertoire WhatsApp (filtres : statut, q, telephone, cree_depuis, repondu_depuis).
GET /v1/contacts-whatsapp/:idLa fiche d’un contact WhatsApp : offre, étiquettes, campagnes (celles de sa fiche LinkedIn liée), dates.
GET /v1/contacts-whatsapp/:id/conversationDroit « messages » : la conversation WhatsApp du contact.
GET /v1/contacts-emailLe répertoire email (filtres : statut, q, email, cree_depuis, repondu_depuis).
GET /v1/contacts-email/:idLa fiche d’un contact email.
GET /v1/contacts-email/:id/conversationDroit « messages » : les emails échangés avec le contact, objet compris.
GET /v1/tachesVos tâches et la personne concernée (statut=a_faire, faites ou toutes ; en_retard=1 ; prospect ; echeance_avant, echeance_apres).
GET /v1/affairesVos affaires (vue Opérations) : montant, colonne, échéance ; statut=en_cours, gagnee ou perdue avec le motif.
GET /v1/affaires/:idUne affaire et ses personnes, avec leur importance.
GET /v1/affaires-colonnesLes colonnes de votre tableau d’affaires, dans l’ordre.
GET /v1/campagnesVos campagnes et leurs compteurs (inscrits, traités, actifs, stoppés, réponses).
GET /v1/campagnes/:idLe détail d’une campagne : canal, planning, étapes (types, délais, textes prévus) et compteurs.
GET /v1/campagnes/:id/prospectsOù en sont ses prospects : étape en cours, raison de sortie, prochaine action.
GET /v1/offresVos offres.
GET /v1/offres/:idLe contenu d’une offre, celui que lit l’IA : promesse, prix, objectif, ton, personas, angles, preuves, objections, consignes, et ce qui reste à confirmer.
GET /v1/offres/:id/messages-typesLes modèles de messages de l’offre.
GET /v1/statsLes totaux par canal, filtrables par date avec depuis.
GET /v1/stats/canauxPar canal : envois, personnes contactées, réponses, taux et délai médian de réponse, et la période précédente pour comparer (jours, défaut 30).
GET /v1/stats/quotidienEnvois et réponses jour par jour (jours : 7 à 90).
GET /v1/stats/etapesEnvois, réponses et taux par étape de campagne.
GET /v1/stats/abLes tests A/B en cours : versions, taux, probabilité d’être la meilleure et verdict (trop_tot, tendance, gagnante, egalite).
GET /v1/stats/horairesLes réponses par jour de la semaine (lundi en premier) et par heure, heure de Paris.
GET /v1/stats/segmentsLes taux de réponse par offre, par étiquette et par recherche.
GET /v1/stats/pipelineLe stock de prospects par étape et l’état des parcours de campagne.
GET /v1/stats/resultats-commerciauxAffaires gagnées et perdues, montants, taux de réussite, durée d’une affaire, motifs de perte, et la période précédente (jours, 0 = depuis toujours).
GET /v1/rdvLes rendez-vous des trois canaux (periode=a_venir ou passes).
GET /v1/recherchesVos recherches et leur récolte.
GET /v1/recherches/:idLe détail d’une recherche : paramètres, progression, erreur éventuelle.
GET /v1/recherches-automatiquesVos recherches programmées.
GET /v1/changements-posteLes prospects suivis qui ont changé de poste ou ont été promus (non_vus=1).
GET /v1/audiencesVos audiences.
GET /v1/equipeVotre équipe et les performances de ses membres, avec les mêmes règles de visibilité que l’application.
GET /v1/etiquettesVos étiquettes (pour donner leur sens aux filtres).

Les prospects, filtrés

statut (voir le tableau ci-dessous), etiquette, recherche, campagne, offre (identifiants), score_min, q (nom, entreprise ou poste), les dates cree_depuis, contacte_depuis, repondu_depuis, et modifie_depuis (date ISO) pour ne tirer que ce qui a bougé — le mécanisme idéal pour une synchronisation périodique. Plusieurs statuts à la fois : statut=replied,rdv. Pour retrouver la fiche d’une personne que votre CRM connaît : email, url_linkedin (avec ou sans https://) ou telephone (06…, +33 6… : même numéro).

Statut d’un prospect LinkedInCe qu’il veut dire
nouveauPas encore démarché.
pending_connectionInvitation envoyée, en attente.
contactedMessage envoyé.
connectedInvitation acceptée.
repliedA répondu.
rdvRendez-vous pris.
snoozedRelance programmée (mis en veille jusqu’à une date).
clientDevenu client.
not_interestedPas intéressé.
off_topicHors cible.
ecarteÉcarté.
archivedArchivé.

Un contact WhatsApp ou email a son propre statut dans son canal : actif tant qu’il n’en est pas sorti, puis rdv, client, not_interested, off_topic, ecarte, archived, et pour l’email bounced (adresse qui rejette les messages).

curl -H "Authorization: Bearer fh_live_VOTRE_CLE" \
  "https://api.fantomhunt.com/v1/prospects?statut=replied,rdv&repondu_depuis=2026-09-01&limite=50"

curl -H "Authorization: Bearer fh_live_VOTRE_CLE" \
  "https://api.fantomhunt.com/v1/prospects?email=martin@acme.fr"
{
  "donnees": [{
"id": "6f2b…", "nom": "Martin Dupont", "entreprise": "Acme",
"poste": "Directeur commercial", "url_linkedin": "https://www.linkedin.com/in/…",
"localisation": "Lyon", "email": "martin@acme.fr", "email_score": 95,
"telephone": "+33612345678", "statut": "replied", "score": 82,
"source": "extension", "recherche_id": "…", "offre_id": "…",
"offre": { "id": "…", "nom": "Paie externalisée" },
"etiquettes": [{ "id": "…", "nom": "Chaud", "couleur": "#ff5555" }],
"campagnes": [{ "id": "…", "nom": "Relance DAF" }],
"cree_le": "…", "modifie_le": "…", "contacte_le": "…",
"connecte_le": "…", "repondu_le": "…", "rdv_le": null
  }],
  "curseur_suivant": "eyJ0Ijoi…"
}

Les conversations

Avec une clé qui a le droit messages. Chaque message dit son canal, son sens (envoye ou recu), son texte et sa date ; un email porte aussi son objet, et deux marques : réponse automatique, expéditeur non authentifié. limite : 100 par défaut, 200 maximum ; pour remonter plus loin, repassez avant_suivant dans avant.

{
  "donnees": [
{ "canal": "email", "id": "…", "sens": "recu", "objet": "Re: votre offre",
  "texte": "Oui, appelons-nous jeudi.", "date": "2026-09-24T09:12:00.000Z",
  "media": null, "reponse_automatique": false, "non_verifie": false },
{ "canal": "linkedin", "id": "…", "sens": "envoye", "objet": null,
  "texte": "Bonjour Martin, …", "date": "2026-09-22T08:30:00.000Z",
  "media": null, "reponse_automatique": false, "non_verifie": false }
  ],
  "avant_suivant": null
}

Modifier le CRM

Avec une clé qui a le droit crm (« Modifier le CRM », décoché par défaut). Chaque modification passe par le même chemin que l’application : la personne est une (note, offre, étiquettes et statut client suivent sur ses autres canaux), le rendez-vous arrive dans votre agenda connecté, le journal et les webhooks suivent. Tout est vérifié avant d’écrire : une requête refusée ne laisse rien à moitié fait. Rien ne part vers un prospect et aucun crédit n’est dépensé.

AppelCe qu’il fait
POST /v1/prospectsAjouter un prospect par url_linkedin (plus offre_id, etiquettes_ajouter, note). La fiche entre « en lecture » et se complète quand l’extension lit le profil ; elle compte dans votre quota. Déjà présent : 200 et deja_present, rien n’est modifié.
PATCH /v1/prospects/:idModifier une fiche : statut, rdv_le et rdv_duree_min, rdv_debriefe, note, offre_id (null pour détacher), etiquettes_ajouter, etiquettes_retirer. Rend la fiche à jour.
POST /v1/prospects/:id/journalAjouter une note datée au journal (texte) : un appel, un échange hors FantomHunt.
POST /v1/contacts-whatsappAjouter un contact WhatsApp (telephone, nom, et les mêmes extras). Déjà présent : 200 et deja_present.
POST /v1/contacts-emailAjouter un contact email (email, nom, et les mêmes extras).
PATCH /v1/contacts-whatsapp/:idLes mêmes champs qu’un prospect ; statut : actif, rdv, client, not_interested, off_topic, archived, ecarte.
PATCH /v1/contacts-email/:idIdem pour un contact email.
POST /v1/contacts-whatsapp/:id/journalUne note au journal du contact (idem pour contacts-email).
POST /v1/tachesCréer une tâche : titre, echeance_le, et une personne au plus (prospect_id, contact_whatsapp_id ou contact_email_id), canal.
PATCH /v1/taches/:idtitre, echeance_le, faite (true ou false), canal.
DELETE /v1/taches/:idSupprimer une tâche.
POST /v1/affairesCréer une affaire : nom, montant_centimes, debut_le et echeance_le (AAAA-MM-JJ), colonne_id, personnes ([{ "prospect_id": "…" }]).
PATCH /v1/affaires/:idnom, montant, dates, colonne_id, et statut : gagnee, perdue (avec motif_de_perte) ou en_cours (rouvre une affaire close).
POST /v1/affaires/:id/personnesRattacher une personne à une affaire.
POST /v1/etiquettesCréer une étiquette (nom, couleur). Une étiquette inconnue passée dans etiquettes_ajouter est aussi créée.
curl -X PATCH https://api.fantomhunt.com/v1/prospects/6f2b… \
  -H "Authorization: Bearer fh_live_VOTRE_CLE" -H "Content-Type: application/json" \
  -d '{ "statut": "rdv", "rdv_le": "2026-10-02T09:30:00Z", "rdv_duree_min": 30,
    "etiquettes_ajouter": ["Chaud"], "note": "Budget validé en comité" }'

Les statuts d’un prospect : nouveau, pending_connection, contacted, connected, replied, rdv, snoozed, client, not_interested, off_topic, archived, ecarte. Les gardes de l’application s’appliquent aussi aux intégrations : un parcours ne recule pas, une fiche close (client, pas intéressé, archivée…) n’est pas rouverte. Dans ce cas la réponse reste 200, la fiche est rendue telle quelle et un champ avertissements l’explique. Un champ inconnu est refusé (400) plutôt qu’ignoré : une faute de frappe ne passe pas en silence.

Rejouer sans doublon : ajoutez l’en-tête Idempotency-Key (une valeur unique par action, 200 caractères au plus) à vos créations. Si Zapier ou votre script renvoie la même requête, la première réponse est rendue telle quelle (en-tête Idempotent-Replayed: true) au lieu de créer une seconde tâche. La clé vaut 24 heures, pour une seule requête.

Envoyer

Avec une clé qui a le droit envoyer (décoché par défaut). Ça part tout de suite, sans relecture dans l’application, exactement comme un envoi fait à la main : mêmes plafonds (invitations LinkedIn 100 par jour et 300 par semaine, vos limites WhatsApp et, pour l’email, celles de chaque boîte), même frein LinkedIn, même conversation. Donnez ce droit seulement à un outil de confiance.

AppelCe qu’il fait
POST /v1/prospects/:id/messageUn message LinkedIn (texte), ou programmé (programme_le, date à venir). Il entre dans la file de l’extension : 202, avec envoi_id et statut_envoi (en_file ou programme).
POST /v1/prospects/:id/invitationUne invitation LinkedIn, avec une note facultative (300 caractères). Refusée (409) si le prospect est déjà connecté ou plus loin dans le parcours.
POST /v1/contacts-whatsapp/:id/messageUn message WhatsApp (texte), envoyé immédiatement par votre session : 201.
POST /v1/contacts-email/:id/messageUn email (objet, texte), envoyé immédiatement par la boîte du fil ou celle de boite_id, avec votre signature (signature: false pour l’enlever) : 201.
POST /v1/campagnes/:id/prospectsInscrire des prospects (prospect_ids, 500 au plus) dans une campagne à liste manuelle. La réponse compte inscrits, ecartes_equipe et ignores (déjà dans une campagne en cours ou déjà passés par celle-ci).
PATCH /v1/campagnes/:idstatut : active (lancer ou reprendre) ou paused (mettre en pause).
POST /v1/recherchesLancer une recherche de prospects LinkedIn, exécutée par l’extension : source (mots_cles par défaut, avec cible et pays ; sales_navigator, groupe, evenement, engagement_post avec url ; reseau ; visiteurs_profil), volume (1 à 500), offre_id. Une à la fois ; compte dans la limite des profils trouvés (1 000 par jour, 3 000 par semaine).
POST /v1/recherches/:id/annulerAnnuler une recherche en attente ou en cours.

Un message ou une invitation LinkedIn part quand l’extension peut l’envoyer. La réponse dit, dans attentes, ce qui le ferait patienter : prospection en pause, LinkedIn freiné après des refus, hors de vos horaires d’envoi, plafond du jour atteint. Le webhook message.envoye (ou invitation.envoyee) vous prévient quand il est réellement parti. Une campagne dont les étapes rédigent avec l’IA consomme ses crédits comme dans l’application.

{
  "canal": "linkedin", "prospect_id": "6f2b…", "envoi_id": "a41c…",
  "statut_envoi": "en_file",
  "attentes": ["Hors de vos horaires d’envoi : l’envoi partira à la prochaine plage."]
}

Dépenser des crédits

Avec une clé qui a le droit credits. Cette clé porte deux plafonds mensuels obligatoires, en crédits IA et en crédits contact (100 et 20 proposés à la création, modifiables dans Réglages sans changer de clé). Chaque action est d’abord estimée par le même calcul que la fenêtre de confirmation de l’application, puis comptée sur la clé à son coût réellement débité. Au-delà du plafond, rien n’est lancé (402 plafond_atteint). Le solde du compte reste la seconde barrière.

AppelCe qu’il fait
POST /v1/ia/estimerGratuit, pour toute clé : le coût d’une action avant de la lancer (action : rediger_message, scorer, modeles_offre, sequence_campagne, trouver_email, trouver_telephone, avec ses paramètres).
POST /v1/ia/messageRédiger avec l’IA un message pour un prospect (prospect_id ; mode : premier_message ou reponse à la conversation en cours ; offre_id, par défaut celle de la fiche ; contexte). Rend message, conseils et stade : le texte n’est pas envoyé.
POST /v1/ia/scorerScorer des prospects rattachés à une offre (offre_id, prospect_ids), toujours au niveau rapide : classement, synthèse, profil idéal.
POST /v1/ia/modeles-offreGénérer les modèles de messages d’une offre, enregistrés dans l’offre.
POST /v1/ia/sequence-campagneRédiger les textes des étapes d’une campagne (campagne_id). Proposés, pas appliqués.
POST /v1/prospects/:id/trouver-emailTrouver l’email professionnel : 1 crédit contact, rendu si introuvable. Rend trouve et valeur.
POST /v1/prospects/:id/trouver-telephoneTrouver le téléphone mobile : 10 crédits contact, rendus si introuvable.

Chaque réponse porte un bloc credits : ce qui était estimé, ce qui a été débité, et où en est la clé ce mois-ci. GET /v1/moi donne aussi les plafonds de la clé et sa dépense du mois.

{
  "prospect_id": "6f2b…", "mode": "premier_message",
  "message": "Bonjour Martin, j’ai vu votre parcours chez Acme…",
  "conseils": "Si réponse positive : proposer un créneau…",
  "credits": { "type": "ia", "estimes": 4, "debites": 4,
           "cle_ce_mois": { "depenses": 12, "plafond": 100 } }
}

Les erreurs, normalisées

Toujours { "error": code_stable, "message": explication } — le code se teste en machine, le message se lit.

HTTPCodeQuand
401cle_manquanteAucune clé dans Authorization.
401cle_invalideClé inconnue ou révoquée.
403plan_requisLe compte n’est plus sur un plan payant.
403compte_desactiveLe compte a été désactivé.
403compte_en_suppressionLa suppression du compte est demandée : l’API est fermée.
403droit_manquantLa clé n’a pas le droit demandé (le champ droit dit lequel) : créez une clé qui l’a.
403quota_atteintAjout d’un prospect au-delà du quota de votre plan.
402plafond_atteintLe plafond du mois de la clé ne couvre pas cette action : rien n’est lancé (plafond, depense et estimation sont joints).
402credits_insuffisantsLe compte n’a plus assez de crédits.
422hors_cadreL’IA a jugé la demande hors du cadre de la prospection.
503indisponibleLe service (IA ou recherche de coordonnées) ne répond pas : rien n’est débité.
400parametre_invalideUn filtre, une date, un curseur ou un champ illisible ; en écriture, aussi un champ inconnu.
404introuvableIdentifiant inconnu sur ce compte.
409conflitL’action contredit l’état de la fiche (ex. personne déjà rattachée à l’affaire, invitation à un prospect déjà connecté, recherche déjà en cours).
409canal_deconnecteWhatsApp ou la boîte email n’est pas connecté : rien n’est parti.
429limite_atteinteUn plafond d’envoi est atteint (invitations, WhatsApp, email) : rien n’est parti.
409requete_en_coursUne requête avec la même Idempotency-Key n’est pas encore terminée.
422cle_reutiliseeCette Idempotency-Key a déjà servi pour une autre requête.
429trop_de_requetesQuota dépassé — réessayez dans une minute.
Prêt à brancher vos outils ?Créez votre clé et votre premier webhook dans les réglages de votre espace.
Ouvrir mes réglages