Skip to main content

Documentation Index

Fetch the complete documentation index at: https://documentation.client-p.pylote.io/llms.txt

Use this file to discover all available pages before exploring further.

Deux obligations partenaires, de nature différente :
Whitelist recruteursTracking consultations
NatureIndispensable au bon fonctionnementEngagement contractuel
EndpointPOST /partners/whitelistPOST /partners/events
FréquenceUne fois par recruteurÀ chaque consultation de profil
Si absentLe recruteur ne peut pas contacter le freelanceSuspension de l’accès API

1. Whitelist : indispensable pour le contact recruteur-freelance

Pourquoi c’est indispensable

Pylote protège l’identité des freelances : leur email réel n’est jamais exposé. Tous les profils retournés par GET /freelances ont un email proxy en @freelance.pylote.io. Pour que le proxy fonctionne dans les deux sens, le recruteur doit lui aussi avoir un email proxy. Pylote en génère un quand vous le whitelistez : lutessa.marieg@recruiter.pylote.io. C’est ce couple d’emails proxy qui permet :
  • Au recruteur d’envoyer un mail au freelance (relayé par Pylote)
  • Au freelance de répondre (relayé dans l’autre sens)
  • À Pylote de mesurer les interactions dans le dashboard du freelance
Sans whitelist, le recruteur ne peut tout simplement pas joindre les freelances Pylote. Aucun message n’arrivera à destination, l’email proxy n’existe pas.Whitelistez chaque recruteur de votre plateforme dès qu’il accède à des profils Pylote.

Premier setup : whitelister tous vos recruteurs en une fois

À l’onboarding, vous avez probablement déjà des dizaines (voire des centaines) de recruteurs sur votre plateforme. Plutôt que de faire N appels unitaires, utilisez POST /partners/whitelist/batch qui en accepte jusqu’à 500 par appel.
curl -X POST "https://client-p.pylote.io/partners/whitelist/batch" \
  -H "x-api-key: votre-cle-partenaire" \
  -H "Content-Type: application/json" \
  -d '{
    "recruiters": [
      { "recruiterEmail": "marie.gilles@lutessa.com",  "firstname": "Marie",  "lastname": "Gilles",  "company": "Lutessa" },
      { "recruiterEmail": "paul.durand@tmc-europe.com", "firstname": "Paul",  "lastname": "Durand",  "company": "TMC Europe" }
    ]
  }'
Réponse (succès partiel possible — un recruteur en erreur ne fait pas échouer les autres) :
{
  "results": [
    { "recruiterEmail": "marie.gilles@lutessa.com",   "whitelistedEmail": "lutessa.marieg@recruiter.pylote.io" },
    { "recruiterEmail": "paul.durand@tmc-europe.com", "whitelistedEmail": "tmceurope.pauld@recruiter.pylote.io" }
  ]
}

Au fil de l’eau : whitelister un nouveau recruteur

Pour chaque nouveau recruteur ajouté ensuite à votre plateforme, l’endpoint unitaire :
curl -X POST "https://client-p.pylote.io/partners/whitelist" \
  -H "x-api-key: votre-cle-partenaire" \
  -H "Content-Type: application/json" \
  -d '{
    "recruiterEmail": "marie.gilles@lutessa.com",
    "firstname": "Marie",
    "lastname": "Gilles",
    "company": "Lutessa"
  }'
Réponse :
{
  "whitelistedEmail": "lutessa.marieg@recruiter.pylote.io"
}
Le champ company doit être l’entreprise du recruteur (ex : “Lutessa”), pas la vôtre (ex : “Agrega”). C’est ce nom qui apparaît dans le dashboard du freelance.

2. Tracking : obligation contractuelle

Pourquoi c’est obligatoire

Pylote offre aux freelances une fonctionnalité de visibilité : ils voient en temps réel quelles entreprises consultent leur profil, avec quels mots-clés et quelles actions. C’est une feature premium et un levier de conversion majeur pour Pylote. Sans le tracking des partenaires, les freelances ne voient rien des consultations passant par votre plateforme - ce qui dégrade l’expérience produit et la valeur de Pylote.
Le tracking est un engagement contractuel. Tout partenaire utilisant l’API Pylote s’engage à remonter chaque interaction recruteur via POST /partners/events.Le non-respect peut entraîner la suspension de l’accès API.

Ce que voit le freelance

Quand un recruteur de Lutessa consulte un profil via Agrega, le freelance voit dans son dashboard :
Lutessa via Agrega - a consulté votre profil - il y a 2h
Lutessa via Agrega - a téléchargé votre CV - il y a 1h

Events à tracker

Chaque interaction recruteur-freelance doit générer un appel à POST /partners/events.
ActionQuand l’envoyerObligatoire
profile_viewLe recruteur ouvre la fiche du freelanceOui
click_cvLe recruteur clique sur le lien CVOui
click_linkedinLe recruteur clique sur le lien LinkedInOui
click_phoneLe recruteur clique sur le téléphoneOui
click_emailLe recruteur clique sur l’emailOui
Au minimum, profile_view, click_cv et click_linkedin doivent être trackés. Les events click_phone et click_email sont également attendus si ces actions sont disponibles sur votre plateforme.

Envoyer un event

curl -X POST "https://client-p.pylote.io/partners/events" \
  -H "x-api-key: votre-cle-partenaire" \
  -H "Content-Type: application/json" \
  -d '{
    "recruiterEmail": "marie.gilles@lutessa.com",
    "freelanceId": "bc1d49cf-1cc7-4afe-92aa-0ebd545fcd12",
    "action": "profile_view"
  }'
Réponse :
{ "status": "ok" }
ChampDescription
recruiterEmailEmail réel du recruteur (doit être dans la whitelist)
freelanceIdChamp meta.id du JSON Resume retourné par GET /freelances
actionType d’interaction (profile_view, click_cv, click_linkedin, click_phone, click_email)

Exemple d’implémentation (Node.js)

async function trackProfileView(recruiterEmail, freelanceId) {
  await axios.post(
    `https://client-p.pylote.io/partners/events`,
    {
      recruiterEmail,
      freelanceId,
      action: 'profile_view'
    },
    {
      headers: {
        'x-api-key': process.env.PYLOTE_PARTNER_KEY,
        'Content-Type': 'application/json'
      }
    }
  );
}

// Dans votre handler d'affichage de profil :
app.get('/freelance/:id', async (req, res) => {
  const freelance = await getFreelanceFromDB(req.params.id);
  const recruiter = req.user;

  // Tracker AVANT d'afficher le profil
  await trackProfileView(recruiter.email, freelance.pyloteId);

  res.render('freelance-profile', { freelance });
});

Flow complet

Obligations de suppression

En plus du tracking, vous devez supprimer les profils deleted de votre base dans un délai de 30 jours suivant la réception du statut de suppression. Quand GET /freelances retourne un profil avec meta.status: "deleted" :
  1. Supprimez le profil de votre base de données
  2. Supprimez toutes les données associées (CV caché, notes, etc.)
  3. Ne conservez que l’ID pour éviter de ré-importer le profil
Le délai de 30 jours est contractuel. Passé ce délai, Pylote se réserve le droit de suspendre l’accès API.
Les statuts de suppression sont :
  • account_deleted - le freelance a supprimé son compte
  • account_banned - compte banni par Pylote
  • account_excluded - compte exclu
  • account_invisible - profil rendu invisible
Utilisez la route GET /freelances/deleted-freelances pour récupérer la liste complète des profils à supprimer si vous avez manqué des synchronisations.

Destruction des données en cas de résiliation

En cas de résiliation du contrat de partenariat (quelle qu’en soit la cause) :
  1. Votre Clé API sera révoquée à la date d’effet de la résiliation
  2. Vous devez cesser toute utilisation de l’API immédiatement
  3. Vous devez détruire toutes les données issues de l’API stockées dans vos systèmes
Exception : les données déjà intégrées dans les profils de vos clients recruteurs et traitées sous leur propre responsabilité ne sont pas concernées par cette obligation de destruction.