Skip to main content

Stratégie de synchronisation

La méthode recommandée pour synchroniser les freelances Pylote dans votre base :

Synchronisation initiale

Utilisez modifiedTime=0 pour récupérer tous les freelances, puis paginez :
const axios = require('axios');

async function syncAllFreelances() {
  const API_URL = 'https://client-p.pylote.io/v1/freelances';
  const API_KEY = process.env.PYLOTE_API_KEY;
  const limit = 1000;
  let page = 1;
  let totalPages = 1;
  let allFreelances = [];

  while (page <= totalPages) {
    const response = await axios.get(API_URL, {
      headers: { 'x-api-key': API_KEY },
      params: { modifiedTime: 0, page, limit, showDeleted: false }
    });

    allFreelances.push(...response.data.freelances);
    totalPages = response.data.infos.totalPages;
    page++;
  }

  console.log(`${allFreelances.length} freelances synchronisés`);
  return allFreelances;
}

Synchronisation incrémentale

Stockez le timestamp de votre dernière synchronisation, puis récupérez uniquement les profils modifiés depuis :
async function syncUpdatedFreelances(lastSyncTimestamp) {
  const response = await axios.get(API_URL, {
    headers: { 'x-api-key': API_KEY },
    params: {
      modifiedTime: lastSyncTimestamp,  // Unix timestamp en secondes
      page: 1,
      limit: 1000,
      showDeleted: true  // inclure les profils supprimés
    }
  });

  for (const freelance of response.data.freelances) {
    if (freelance.meta.status === 'deleted') {
      // OBLIGATOIRE : supprimer de votre base
      await deleteFromYourDB(freelance.meta.id);
    } else {
      await upsertInYourDB(freelance);
    }
  }

  // Stocker le nouveau timestamp pour le prochain sync
  return Math.floor(Date.now() / 1000);
}
Les freelances avec status: deleted doivent être supprimés de votre base dans un délai de 30 jours. C’est un engagement contractuel. Les statuts de suppression possibles sont : account_deleted, account_banned, account_excluded, account_invisible.

Pagination

Les réponses sont paginées avec les paramètres page et limit. Chaque réponse inclut un objet infos :
{
  "freelances": [...],
  "infos": {
    "total": 1234,
    "page": 1,
    "limit": 50,
    "totalPages": 25
  }
}
ParamètreTypeRequisDescription
pageintegerOuiNuméro de page (commence à 1)
limitintegerOuiFreelances par page (max 1000)
modifiedTimeintegerOuiTimestamp Unix (secondes). 0 = tous
showDeletedbooleanNonInclure les supprimés (default: true)
Utilisez limit=1000 pour minimiser le nombre de requêtes. Un sync initial de ~22 000 freelances prend environ 22 pages.

Dédoublonnage

Un même freelance peut être présent sur plusieurs plateformes. Le champ meta.personalEmail (hash SHA-256 de l’email personnel) vous permet de dédoublonner :
// Si deux profils ont le même personalEmail, c'est le même freelance.
// Gardez celui avec le updatedAt le plus récent.
const seen = new Map();
for (const f of freelances) {
  const hash = f.meta.personalEmail;
  if (!seen.has(hash) || f.meta.updatedAt > seen.get(hash).meta.updatedAt) {
    seen.set(hash, f);
  }
}

URLs trackées (hive.pylote.io)

Les champs basics.url (LinkedIn) et le lien CV dans basics.profiles passent par le proxy hive.pylote.io. Ces URLs :
  • Trackent les consultations pour les stats du freelance
  • Contiennent un watermark (IP de l’appelant encodée en base64)
  • Ne doivent pas être partagées en dehors de votre plateforme
Format :
https://hive.pylote.io/linkedin/{id_chiffre}/{clientPk}?t={watermark}
https://hive.pylote.io/cv/{id_chiffre}/{clientPk}?t={watermark}

Récupérer des freelances spécifiques

Si vous avez besoin de re-synchroniser un sous-ensemble de profils (par exemple après un incident), utilisez POST /freelances avec une liste d’IDs :
curl -X POST "https://client-p.pylote.io/v1/freelances?modifiedTime=0&page=1&limit=100" \
  -H "x-api-key: votre-cle" \
  -H "Content-Type: application/json" \
  -d '{
    "ids": [
      "bc1d49cf-1cc7-4afe-92aa-0ebd545fcd12",
      "960a1c67-645d-4ac5-b8b2-875fb2f740d3"
    ]
  }'

Fréquence de synchronisation recommandée

StratégieFréquenceCas d’usage
Cron classiqueToutes les heuresSuffisant pour la plupart des clients
Semi-temps réelToutes les 15 minSi la fraîcheur de la dispo est critique
Sync initialUne foisPremier peuplement de votre base
Le cache de l’API est rafraîchi toutes les heures. Synchroniser plus souvent que toutes les heures n’apporte pas de données supplémentaires.