Sommaire
v1API Partenaire
Intégration de l'API Bypass Monitor
Sachez quand vos présentations sont embauchées
Transmettez les candidats que vous avez présentés à vos clients et détectez leur arrivée dans ces entreprises, avec les éléments justificatifs et l'analyse des dates.
Particulièrement adapté à
Les agences de recrutement et de placement qui suivent leurs présentations clients
Les prestataires RPO qui vérifient l'issue de leurs présentations
Les éditeurs d'ATS qui ajoutent la détection de contournement aux flux des agences
Les équipes qui présentent des candidats à plusieurs clients et veulent savoir qui est embauché
Les partenaires qui enregistrent déjà les dates de présentation et le nom des entreprises clientes
Déroulé de l'intégration
Faites approuver votre accès et recevez une clé d'API
Demandez l'accès à TieTalent. Une fois approuvé, vous recevez une clé X-API-Key pour votre intégration.
Envoyez une vérification de contournement
POST vers /api/v1/bypass-checks avec les éléments d'identification du candidat, les submissions clients et l'experience déclarée (ou profile_urls si vous n'avez pas d'expérience à transmettre).
Recevez un 202 Accepted
La réponse contient un id de vérification, status: pending, candidate_id, ainsi que les objets additifs credits / plan. Il n'y a pas de booléen cached au niveau racine (contrairement à Talent Update) ; credits.cached est présent et vaut false car les vérifications de contournement ne sont pas réutilisées. Interrogez l'API ou attendez le webhook.
Interrogez l'API ou attendez un webhook
GET /api/v1/bypass-checks/{id} jusqu'à ce que status soit completed ou failed. Les webhooks (bypass_check_ready / bypass_check_failed) sont à privilégier lorsqu'ils sont configurés.
Agissez sur les éléments constatés
Lorsque bypass.detected vaut true, examinez bypass.matches : entreprise présentée, employeur trouvé, qualité de la correspondance et date d'embauche par rapport à votre date de présentation.
Authentification
X-API-Key à chaque requête, comme pour Candidate Intelligence et Talent Update. Une requête peut contenir au maximum 50 candidats, et chaque candidat consomme une unité de votre limite de débit par minute.En-têtes de la requête
X-API-Key: ats_your_api_key_here Content-Type: application/json
Créer une vérification
Crée une vérification de contournement asynchrone. TieTalent exécute une mise à jour de profil en interne, puis compare les employeurs découverts à votre liste de présentations.
Transmettez des submissions complètes avec leurs dates dès que vous en disposez ; l'analyse des dates repose sur submitted_at.
{
"candidate": {
"id": "cand-9911",
"first_name": "Alex",
"last_name": "Rivera",
"email": "alex.rivera@example-corp.com",
"employer_website": "example-corp.com",
"role": "Software Engineer",
"location": "London, UK",
"profile_urls": [
"https://linkedin.com/in/alex-rivera-example"
],
"experience": [
{
"company": "Previous Corp",
"role": "Engineer",
"start_date": "2014-01",
"end_date": "2016-01",
"is_current": false
}
],
"submissions": [
{ "company": "Acme Client Ltd", "submitted_at": "2025-03" },
{ "company": "Beta Industries AG", "submitted_at": "2024-11" }
]
}
}Champs de la requête
candidate (objet requis)
Contient tous les champs d'identification de Talent Update, plus submissions, ainsi qu'experience sauf si vous fournissez profile_urls. Voir aussi les champs de requête de Talent Update.
Combinaison d'identification (au moins une)
Champs
Précision
A
first_name + last_name + profile_urls
La plus fiable et la moins coûteuse. Une URL de profil lève tout doute sur la personne recherchée.
B
first_name + last_name + (employer_website or company)
Fiable. L'employeur confirme qu'il s'agit bien de votre candidat et non d'un homonyme.
C
email (professionnel)
Bon. Un domaine d'entreprise nous donne l'employeur et le nom est lu dans l'adresse, donc il suffit seul. Envoyez aussi un nom lorsque vous en avez un.
D
email (personnel) + (employer_website ou company)
Bon lorsque l'adresse contient le nom, par exemple jane.doe@gmail.com. Un domaine personnel ne dit rien de l'employeur : c'est l'entreprise qui ancre la recherche, et elle est obligatoire. Envoyez aussi first_name et last_name lorsque vous les avez : une adresse comme jdoe92@ nous laisse peu d'éléments et le profil peut revenir vide.
E
employer_website + role
La plus faible, à réserver aux candidats dont vous n'avez pas le nom. Elle identifie un poste et non une personne : nous ne répondons que si une seule personne occupe ce poste, jamais au-delà d'une confiance moyenne.
idVotre identifiant pour le candidat. Renvoyé tel quel dans candidate_id.first_name, last_name, email, employer_website, company, role, location, profile_urlsMêmes règles que pour Talent Update.experienceFacultatif si profile_urls est fourni, sinon requis (40 maximum). Les emplois que vous connaissez déjà, utilisés pour distinguer une nouvelle embauche d'un employeur déjà connu. Transmettez un tableau vide si vous n'en avez aucun et fournissez une URL de profil à la place.submissionsRequis. Au moins une entrée (100 maximum). Chaque présentation : company (le client auquel vous avez présenté le candidat) et, facultativement, submitted_at (YYYY-MM ou YYYY-MM-DD).submissions[] object
companyNom de l'entreprise cliente tel que vous avez enregistré la présentation. Requis.submitted_atDate à laquelle vous avez présenté le candidat à ce client. Sert à l'analyse des dates.Champs facultatifs de premier niveau
mode"precompute" pour des vérifications par lot en arrière-plan. Voir Précalcul des vérifications.Non accepté
Ni CV ni fichier. Uniquement des éléments d'identification et des données de présentation structurées.
Règles de validation
Les échecs de validation renvoient un 422 au format application/problem+json.
experienceRequis sauf si vous transmettez profile_urls. Chaque entrée exige company. Indiquez start_date et end_date lorsque vous les avez : elles nous permettent de distinguer un passage antérieur chez un client d'une nouvelle arrivée.submissionsAu moins une entrée. Chacune exige company. Maximum 100 par candidat.submitted_atYYYY-MM ou YYYY-MM-DD lorsqu'elles sont fournies.emailProfessionnel ou personnel (mêmes règles que Talent Update). Une adresse personnelle doit être accompagnée de company ou employer_website.Champs optionnelsPeuvent être omis ou envoyés à null. Les deux sont traités comme absents : "end_date": null sur un poste actuel est accepté.Précalcul des vérifications
Utilisez POST /api/v1/bypass-checks avec mode: "precompute" pour préparer les vérifications en arrière-plan, avant qu'un recruteur n'ouvre la fiche de présentation.
candidates. Les appels en direct exigent un seul objet candidate. Les vérifications de contournement n'ont ni force_refresh ni indicateur de cache à la création.Précalcul par lot
Envoyez mode: "precompute" avec candidates au lieu de candidate. Chaque candidat doit comporter des submissions, ainsi qu'experience ou profile_urls.
{
"mode": "precompute",
"candidates": [
{
"id": "cand-9911",
"first_name": "Alex",
"last_name": "Rivera",
"email": "alex.rivera@example-corp.com",
"experience": [
{ "company": "Previous Corp", "is_current": false }
],
"submissions": [
{ "company": "Acme Client Ltd", "submitted_at": "2025-03" }
]
}
]
}Le volume d'usage est mesuré par vos crédits de plan ; la vitesse à laquelle vous pouvez les dépenser est mesurée par la limite de requêtes par minute de votre forfait, partagée entre les appels live, les appels precompute et l'enrichissement CSV. Un dépassement de la limite de débit renvoie 429 Too Many Requests avec l'erreur rate-limit-exceeded et un Retry-After ; réessayez après ce délai. Voir Limites de débit pour les limites par forfait et les en-têtes de réponse.
Réponse à la création
Une création réussie renvoie 202 Accepted avec status: pending, ainsi que les objets additifs credits (solde restant et débit de cet appel) et plan (plan actuel). Ces champs sont non-breaking et ne nécessitent pas de changement de version. Le précalcul par lot renvoie un tableau items ainsi que credits / plan au niveau racine. Il n'y a pas de booléen cached au niveau racine (contrairement à Talent Update) ; credits.cached est présent et toujours false car les vérifications de contournement ne sont pas réutilisées.
Réponse pour un candidat
{
"id": "bc_01JCXY",
"status": "pending",
"candidate_id": "cand-9911",
"created_at": "2026-08-28T12:56:44.642Z",
"credits": {
"balance": 140,
"plan_credits": 118,
"rollover_credits": 22,
"charged": 2,
"cached": false
},
"plan": {
"code": "growth",
"cycle": "monthly",
"credits_per_cycle": 200,
"requests_per_minute": 300,
"period_ends_at": "2026-10-28T12:00:00.000Z"
}
}Réponse au précalcul par lot
Chaque élément contient id, status: pending, candidate_id, created_at, ainsi que credits et plan par élément.
{
"items": [
{
"id": "bc_01JCXY",
"status": "pending",
"candidate_id": "cand-9911",
"created_at": "2026-08-28T12:56:44.642Z",
"credits": {
"balance": 138,
"plan_credits": 116,
"rollover_credits": 22,
"charged": 2,
"cached": false
},
"plan": {
"code": "growth",
"cycle": "monthly",
"credits_per_cycle": 200,
"requests_per_minute": 300,
"period_ends_at": "2026-10-28T12:00:00.000Z"
}
},
{
"id": "bc_01JCXZ",
"status": "pending",
"candidate_id": "cand-9912",
"created_at": "2026-08-28T12:56:45.102Z",
"credits": {
"balance": 138,
"plan_credits": 116,
"rollover_credits": 22,
"charged": 1,
"cached": false
},
"plan": {
"code": "growth",
"cycle": "monthly",
"credits_per_cycle": 200,
"requests_per_minute": 300,
"period_ends_at": "2026-10-28T12:00:00.000Z"
}
}
],
"credits": {
"balance": 138,
"plan_credits": 116,
"rollover_credits": 22,
"charged": 3,
"cached": false
},
"plan": {
"code": "growth",
"cycle": "monthly",
"credits_per_cycle": 200,
"requests_per_minute": 300,
"period_ends_at": "2026-10-28T12:00:00.000Z"
}
}credits.balance est le solde restant ; plan_credits et rollover_credits sont les compartiments de solde ; charged est le nombre de crédits réservés ou débités pour cette vérification (souvent proportionnel aux entreprises présentées uniques), ou null si non applicable sur GET ; credits.cached vaut toujours false pour les vérifications de contournement. plan inclut code (free, starter, growth ou custom), cycle (monthly, annual ou null), credits_per_cycle et period_ends_at. Ignorez ces champs s'ils ne vous sont pas utiles.
Récupérer une vérification
Appelez GET /api/v1/bypass-checks/{id} pour récupérer le résultat de la vérification.
Valeurs de status
pendingVérification en cours (y compris la mise à jour de profil interne).completedVérification terminée. bypass et, le cas échéant, talent_update sont renseignés.failedLa vérification a échoué. Voir error.Tant que status vaut pending
{
"id": "bc_01JCXY",
"status": "pending",
"candidate_id": "cand-9911",
"created_at": "2026-08-28T12:56:44.642Z",
"completed_at": null,
"bypass": {
"detected": false,
"note": null,
"matches": []
},
"talent_update": null,
"error": null,
"credits": {
"balance": 140,
"plan_credits": 118,
"rollover_credits": 22,
"charged": 2,
"cached": false
},
"plan": {
"code": "growth",
"cycle": "monthly",
"credits_per_cycle": 200,
"requests_per_minute": 300,
"period_ends_at": "2026-10-28T12:00:00.000Z"
}
}Lorsque status vaut completed
{
"id": "bc_01JCXY",
"status": "completed",
"candidate_id": "cand-9911",
"created_at": "2026-08-28T12:56:44.642Z",
"completed_at": "2026-08-28T12:58:12.441Z",
"error": null,
"bypass": {
"detected": true,
"note": "Confirmed: Alex Rivera was found working at Acme Client Limited, another name for Acme Client Ltd, the company the candidate was put forward to in March 2025, having joined in April 2025.",
"matches": [
{
"submitted_company": "Acme Client Ltd",
"found_company": "Acme Client Limited",
"match_type": "variant",
"submitted_at": "2025-03",
"employment_start": "2025-04",
"timing": "joined_after_submission",
"confidence": "confirmed"
}
]
},
"talent_update": {
"identity": {
"confidence": "high",
"full_name": "Alex Rivera",
"headline": "Software Engineer at Acme Client Limited",
"current_employer": "Acme Client Limited",
"location": "London, UK"
},
"work_experience": [
{
"company": "Acme Client Limited",
"role": "Software Engineer",
"start_date": "2025-04",
"end_date": null,
"is_current": true,
"confidence": "high"
}
],
"education": [],
"online_presence": []
},
"credits": {
"balance": 140,
"plan_credits": 118,
"rollover_credits": 22,
"charged": 2,
"cached": false
},
"plan": {
"code": "growth",
"cycle": "monthly",
"credits_per_cycle": 200,
"requests_per_minute": 300,
"period_ends_at": "2026-10-28T12:00:00.000Z"
}
}Champs de la réponse
La réponse contient toujours un objet bypass. Une fois la vérification terminée, un profil talent_update imbriqué peut également être présent. Les réponses GET incluent aussi les mêmes objets additifs credits et plan que la création.
bypass.detectedtrue lorsqu'au moins une entreprise présentée correspond à un employeur nouvellement découvert.bypass.noteUne ou deux phrases simples destinées à une personne. Elles commencent par le niveau de revue (Confirmé, Probable ou À vérifier) ou par Non signalé, puis expliquent pourquoi : où le candidat a été trouvé en poste, le lien avec l'entreprise à laquelle vous l'avez présenté, et sa date d'arrivée. null tant que la vérification est en cours, ou si la note n'a pas pu être rédigée.bypass.matches[]Lignes de preuve : submitted_company, found_company, match_type, submitted_at, employment_start, timing, confidence.talent_updateProfil imbriqué facultatif (même structure que Talent Update) lorsque l'identification a abouti.creditsSolde restant et débit de cette vérification : balance, plan_credits, rollover_credits, charged, cached.planPlan actuel : code, cycle, credits_per_cycle, period_ends_at.timing compare le mois de présentation au mois de début d'emploi : joined_after_submission, already_employed, ou not_determinable lorsque les dates manquent. Si le candidat a rejoint l'entreprise correspondante plus d'un an avant votre présentation, la correspondance n'est pas signalée et bypass.note en explique la raison.
confidence indique le niveau de vérification nécessaire. confirmed : fortement corroboré, les noms d'entreprise concordent et la date de début est postérieure à votre soumission. likely : corroboré, mais la correspondance porte sur une société mère ou une filiale, ou l'identité était moins certaine. needs_review : corroboration plus faible, société sœur du même groupe que l'entreprise à laquelle vous avez soumis le profil, date d'emploi inexploitable, candidat déjà en poste avant votre soumission, ou identité moins fiable. Vérifiez vous-même un résultat needs_review avant d'agir.
Énumérations
Les énumérations peuvent accueillir de nouvelles valeurs au fil du temps.
statuspending, completed, failedbypass.matches[].match_typeexact, variant, groupbypass.matches[].timingjoined_after_submission, already_employed, not_determinablebypass.matches[].confidenceconfirmed, likely, needs_reviewplan.codefree, starter, growth, customplan.cyclemonthly, annual, nullErreurs
Les réponses non 2xx utilisent application/problem+json (RFC 9457).
Statut
Cas
401
Clé d'API absente ou invalide.
402
Crédits épuisés (<code>insufficient-credits</code>). Réessayer ne servira à rien avant un rechargement ou une montée de forfait.
404
Identifiant de vérification inconnu ou appartenant à un autre partenaire.
422
Combinaison d'identification manquante, présentations absentes, ou expérience absente sans profile_urls.
429
Limite de débit dépassée (<code>rate-limit-exceeded</code>). Respectez <code>Retry-After</code>, puis réessayez.
500
Impossible de démarrer ou de terminer la vérification.
Exemple de réponse d'erreur
{
"type": "https://intelligence.tietalent.com/errors/invalid-request",
"title": "Unprocessable Entity",
"status": 422,
"detail": "Provide a corporate email, or first_name and last_name together with company, employer_website or profile_urls, or a personal email with company or employer_website, or employer_website with role."
}Limites de débit et versionnage
Limites de débit
Votre forfait définit la vitesse à laquelle vous pouvez appeler l'API, en requêtes par minute : Free 10, Starter 60, Growth 300. Sur un forfait Custom, la limite est définie avec vous. Une unité correspond à une unité de travail : un lot en consomme une par candidat. Candidate Intelligence, Talent Update, Bypass Monitor et l'enrichissement CSV partagent cette même réserve. Les réponses réussies et les 429 contiennent RateLimit-Limit, RateLimit-Remaining et RateLimit-Reset ; un 429 ajoute Retry-After (secondes). Appliquez un back-off exponentiel avec jitter. Voir Candidate Intelligence › Limites de débit pour la référence complète. Les crédits sont un contrôle distinct : ils mesurent combien vous pouvez consommer, pas à quelle vitesse.
Retry-After: 42
Versionnage
La version figure dans le chemin (/v1). Des champs supplémentaires (y compris credits et plan) peuvent apparaître sans changement de version.
Webhooks
Livraison au moins une fois. Vos gestionnaires doivent être idempotents sur l'id de l'événement. Considérez GET /api/v1/bypass-checks/{id} comme la source de vérité à tout moment.
Types d'événements
bypass_check_readyLa vérification s'est terminée avec succès.bypass_check_failedLa vérification a échoué. Contient error_code dans data.Vérification de la signature
Chaque livraison porte un en-tête X-CI-Signature : t=<unix>,v1=<hmac-sha256> calculé sur "{t}.{raw_body}", en HMAC-SHA256 avec votre secret whsec_.... Même schéma que pour Candidate Intelligence et Talent Update.
X-CI-Signature: t=<unix>,v1=<hmac-sha256>
# Signed over "{t}.{raw_body}". Reject timestamps older than five minutes.La charge utile contient result_url, bypass_check_id et candidate_id. Récupérez le résultat complet par un GET authentifié.
api_environment reprend le libellé de la clé d'API ayant authentifié l'exécution (Production, Staging ou Test).
bypass_check_ready
{
"id": "evt_01JDABC",
"type": "bypass_check_ready",
"created_at": "2026-08-28T12:58:12.441Z",
"api_environment": "Production",
"data": {
"candidate_id": "cand-9911",
"status": "completed",
"result_url": "https://intelligence.tietalent.com/api/v1/bypass-checks/bc_01JCXY",
"bypass_check_id": "bc_01JCXY"
}
}bypass_check_failed
{
"id": "evt_01JDABD",
"type": "bypass_check_failed",
"created_at": "2026-08-28T12:58:15.441Z",
"api_environment": "Production",
"data": {
"candidate_id": "cand-9911",
"status": "failed",
"result_url": "https://intelligence.tietalent.com/api/v1/bypass-checks/bc_01JCXY",
"bypass_check_id": "bc_01JCXY",
"error_code": "internal_error"
}
}Limites connues
Connaître ces limites permet d'avoir les bonnes attentes.
- Une vérification ne rapporte que ce qui peut être attribué à votre candidat. Lorsque son identité ne peut pas être confirmée, le profil revient vide, et les entreprises que vous avez transmises sont tout de même vérifiées séparément.
- La correspondance d'entreprises s'appuie sur une résolution de noms approximative ;
match_typeen indique la qualité. - Lorsque
submitted_atou la date de début d'emploi manque,timingvautnot_determinable. - Un employeur déjà présent dans votre liste
experienceest tout de même signalé, car vous avez pu l'enregistrer après l'arrivée du candidat. Il est renvoyé enneeds_review, sauf si les dates montrent qu'il est parti puis revenu après votre présentation, auquel cas il est évalué normalement. Seules les entreprises figurant dans vossubmissionssont signalées. - Une vérification avec
bypass.detected: falsesignifie qu'aucun nouvel employeur ne correspond à une présentation, et non que le candidat n'a pas été embauché. - Maximum 100 présentations et 40 expériences par candidat ; 50 candidats par lot de précalcul.
Programme Partenaire
Commencez à intégrer Bypass Monitor
Demandez l'accès et nous activerons vos identifiants d'API partenaire pour la surveillance des contournements.