Créer une candidature
Le point de terminaison Créer une candidature permet à une intégration externe de soumettre la candidature d’un candidat à un poste Nextal précis. Il accepte une seule charge utile canonique, de sorte que n’importe quelle source d’intégration peut transmettre la même structure de corps.
Chemin de la ressource
| Propriété | Valeur |
|---|---|
| url | v2/applications/{source}/{jobId} |
| method | POST |
En-têtes
| Champ | Description |
|---|---|
| Content-Type | Type de média du corps de la requête. Doit être application/json. |
| Accept-Language | Langue du résultat; si aucune (ou une langue non configurée) n’est fournie, la langue par défaut sera utilisée |
Authentification
Chaque requête doit être authentifiée avec la clé d’API et la clé de domaine du tenant. Transmettez-les soit comme en-têtes HTTP :
X-APIKey: <apiKey>X-Tenant: <tenant domain>
soit comme paramètres d’URL :
napikey=<apiKey>ntenant=<tenant domain>
Si les deux sont fournis, les en-têtes HTTP ont préséance. Le tenant est déterminé à partir de la clé de domaine, ce qui explique pourquoi il n’est plus un segment de chemin. Voir la Référence de l’API pour plus de détails.
Paramètres
| Champ | Description |
|---|---|
| source | la clé de la source/du fournisseur d’intégration attribuée à votre intégration; elle identifie l’origine de la candidature et ne modifie pas le schéma du corps de la requête |
| jobId | le poste ciblé; le serveur injecte cette valeur dans job.jobId de la candidature, remplaçant tout jobId placé dans le corps |
Fonctionnement de source
Le segment de chemin source sert uniquement à identifier l’intégration qui soumet la
candidature — il est enregistré à des fins de suivi et de routage. Il ne modifie pas le
schéma du corps de la requête : chaque source transmet la même charge utile canonique
décrite ci-dessous. Transmettez la clé de fournisseur attribuée à votre intégration et le
jobId du poste visé par la candidature; le tenant est déterminé à partir de votre clé de
domaine (voir Authentification).
Consentement du candidat et renseignements personnels
Une candidature contient les renseignements personnels du candidat — nom, coordonnées, curriculum vitæ et réponses de présélection. Avant de soumettre une candidature, vous devez avoir obtenu le consentement éclairé du candidat pour recueillir ces renseignements et les transmettre à l’employeur par l’intermédiaire de Nextal, conformément aux lois applicables en matière de protection des renseignements personnels, dont la Loi 25 du Québec.
Ne transmettez que les renseignements personnels nécessaires à la candidature et conservez vos propres registres de consentement. L’employeur destinataire (le tenant) est responsable des renseignements personnels une fois la candidature soumise.
Corps de la requête
Le corps est un seul objet de candidature canonique. Tous les champs sont facultatifs sauf indication contraire; les champs inconnus ou null sont omis. La structure de premier niveau est la suivante :
| Champ | Type | Requis | Description |
|---|---|---|---|
locale | String | Non | Locale de la candidature (par exemple en, fr_CA). |
appliedOnMillis | Long | Non | Horodatage epoch (en millisecondes) du moment où la candidature a été soumise. |
job | Object (Job) | Non | Le poste auquel le candidat a postulé. Voir Objet Job. |
applicant | Object (Applicant) | Oui | Le candidat et son curriculum vitæ. Voir Objet Applicant. |
screenerQuestionsAndAnswers | Object (QuestionsAndAnswers) | Non | Questions de présélection et réponses du candidat. Voir Objet QuestionsAndAnswers. |
demographicQuestionsAndAnswers | Object (QuestionsAndAnswers) | Non | Questions et réponses démographiques (même structure que la présélection). Voir Objet QuestionsAndAnswers. |
analytics | Object (Analytics) | Non | Données analytiques de source/d’appareil pour la candidature. Voir Objet Analytics. |
Objet Job
Le jobId indiqué ici est remplacé par le paramètre de chemin jobId.
| Champ | Type | Requis | Description |
|---|---|---|---|
jobId | String | Non | Identifiant du poste ciblé. Remplacé par le jobId du chemin. |
jobTitle | String | Non | Titre du poste à la source. |
jobCompany | String | Non | Nom de l’entreprise à la source. |
jobLocation | String | Non | Lieu du poste à la source. |
jobUrl | String | Non | URL de l’affichage du poste à la source. |
jobMeta | String | Non | Métadonnées opaques de la source. |
Objet Applicant
| Champ | Type | Requis | Description |
|---|---|---|---|
id | String | Non | Identifiant du candidat à la source. |
fullName | String | Non | Nom complet du candidat. |
email | String | Non | Adresse courriel du candidat. |
phoneNumber | String | Non | Numéro de téléphone du candidat. |
coverletter | String | Non | Texte de la lettre de présentation. |
resume | Object (Resume) | Non | Le curriculum vitæ du candidat. Voir Objet Resume. |
Objet Resume
Fournissez le curriculum vitæ sous une ou plusieurs représentations; un fichier binaire
accompagné d’un json structuré est la forme la plus complète.
| Champ | Type | Requis | Description |
|---|---|---|---|
text | String | Non | Curriculum vitæ en texte brut. |
json | Object (Json) | Non | Curriculum vitæ structuré. Voir Objet Resume json. |
file | Object (File) | Non | Fichier binaire du curriculum vitæ. Voir Objet File. |
Objet File
| Champ | Type | Requis | Description |
|---|---|---|---|
contentType | String | Non | Type MIME du fichier (par exemple application/pdf). |
data | String | Non | Contenu du fichier encodé en Base64. |
fileName | String | Non | Nom de fichier d’origine. |
Objet Resume json
Données structurées du curriculum vitæ.
| Champ | Type | Requis | Description |
|---|---|---|---|
firstName | String | Non | Prénom. |
lastName | String | Non | Nom de famille. |
headline | String | Non | Titre professionnel. |
summary | String | Non | Sommaire professionnel. |
publicProfileUrl | String | Non | URL du profil public. |
additionalInfo | String | Non | Information additionnelle en format libre. |
phoneNumber | String | Non | Numéro de téléphone. |
location | Object (Location) | Non | Lieu du candidat. Voir Objet Location. |
skills | String | Non | Compétences (chaîne en format libre). |
positions | Object (Positions) | Non | Historique professionnel. Wrapper de liste, voir Wrappers de liste. |
educations | Object (Educations) | Non | Historique de formation. Wrapper de liste. |
links | Object (Links) | Non | Liens externes. Wrapper de liste. |
awards | Object (Awards) | Non | Prix et distinctions. Wrapper de liste. |
certifications | Object (Certifications) | Non | Certifications. Wrapper de liste. |
associations | Object (Associations) | Non | Associations professionnelles. Wrapper de liste. |
patents | Object (Patents) | Non | Brevets. Wrapper de liste. |
publications | Object (Publications) | Non | Publications. Wrapper de liste. |
militaryServices | Object (MilitaryServices) | Non | Dossiers de service militaire. Wrapper de liste. |
Objet Location
| Champ | Type | Requis | Description |
|---|---|---|---|
city | String | Non | Ville. |
country | String | Non | Pays. |
postalCode | String | Non | Code postal/ZIP. |
Wrappers de liste
Chaque collection à l’intérieur de resume.json (positions, educations, links, awards,
certifications, associations, patents, publications, militaryServices) utilise la
même structure de wrapper :
| Champ | Type | Requis | Description |
|---|---|---|---|
_total | Long | Non | Nombre d’entrées dans values. |
values | List of objects | Non | Les entrées; le type d’élément dépend de la collection (voir ci-dessous). |
positions[].values[] (PositionValues)
| Champ | Type | Description |
|---|---|---|
title | String | Titre du poste. |
company | String | Employeur. |
location | String | Lieu. |
startDateMonth | String | Mois de début. |
startDateYear | String | Année de début. |
endDateMonth | String | Mois de fin. |
endDateYear | String | Année de fin. |
endCurrent | Boolean | true s’il s’agit du poste actuel. |
description | String | Description. |
educations[].values[] (EducationValues)
| Champ | Type | Description |
|---|---|---|
degree | String | Diplôme obtenu. |
field | String | Domaine d’études. |
school | String | Nom de l’établissement. |
location | String | Lieu de l’établissement. |
startDate | String | Date de début. |
endDate | String | Date de fin. |
endCurrent | Boolean | true si toujours en cours. |
links[].values[] (LinkValues)
| Champ | Type | Description |
|---|---|---|
url | String | L’URL du lien. |
awards[].values[] (AwardValues)
| Champ | Type | Description |
|---|---|---|
title | String | Titre du prix. |
dateMonth | String | Mois du prix. |
dateYear | String | Année du prix. |
description | String | Description. |
certifications[].values[] (CertificationValues)
| Champ | Type | Description |
|---|---|---|
title | String | Titre de la certification. |
startDateMonth | String | Mois de début. |
startDateYear | String | Année de début. |
endDateMonth | String | Mois de fin. |
endDateYear | String | Année de fin. |
endCurrent | Boolean | true si toujours valide. |
description | String | Description. |
associations[].values[] (AssociationValues)
| Champ | Type | Description |
|---|---|---|
title | String | Titre de l’association. |
startDateMonth | String | Mois de début. |
startDateYear | String | Année de début. |
endDateMonth | String | Mois de fin. |
endDateYear | String | Année de fin. |
endCurrent | Boolean | true si toujours membre. |
description | String | Description. |
patents[].values[] (PatentValues)
| Champ | Type | Description |
|---|---|---|
patentNumber | String | Numéro de brevet. |
title | String | Titre du brevet. |
url | String | URL du brevet. |
dateMonth | String | Mois de la date. |
dateYear | String | Année de la date. |
description | String | Description. |
publications[].values[] (PublicationValues)
| Champ | Type | Description |
|---|---|---|
title | String | Titre de la publication. |
url | String | URL de la publication. |
dateDay | String | Jour de la date. |
dateMonth | String | Mois de la date. |
dateYear | String | Année de la date. |
description | String | Description. |
militaryServices[].values[] (MilitaryServiceValues)
| Champ | Type | Description |
|---|---|---|
serviceCountry | String | Pays de service. |
branch | String | Branche de service. |
rank | String | Grade atteint. |
startDateMonth | String | Mois de début. |
startDateYear | String | Année de début. |
endDateMonth | String | Mois de fin. |
endDateYear | String | Année de fin. |
endCurrent | Boolean | true si toujours en service. |
commendations | String | Mentions élogieuses. |
description | String | Description. |
Objet QuestionsAndAnswers
Utilisé à la fois par screenerQuestionsAndAnswers et demographicQuestionsAndAnswers.
| Champ | Type | Requis | Description |
|---|---|---|---|
url | String | Non | URL source d’où les questions ont été récupérées. |
retrievedOnMillis | Long | Non | Horodatage epoch (en millisecondes) du moment où les questions ont été récupérées. |
questionsAndAnswers | List of objects (QuestionsAndAnswer) | Non | Une entrée par paire question/réponse. |
questionsAndAnswers[] (QuestionsAndAnswer)
| Champ | Type | Requis | Description |
|---|---|---|---|
question | Object (Question) | Non | Les métadonnées de la question. Voir Objet Question. |
answer | String, Object, or List | Non | La réponse du candidat. Pour les questions à texte libre/nombre/date, il s’agit d’une chaîne; pour une sélection unique, il s’agit d’un objet { "label": ..., "value": ... }; pour une sélection multiple, il s’agit d’une liste de tels objets. |
Objet Question
| Champ | Type | Requis | Description |
|---|---|---|---|
id | String | Non | Identifiant de la question. |
question | String | Non | Le texte de la question. |
type | String | Non | Type de question (par exemple text, number, date, select, multiselect). |
required | Boolean | Non | Indique si une réponse est obligatoire. |
format | String | Non | Format de réponse attendu. |
min | String | Non | Contrainte de valeur/longueur minimale. |
max | String | Non | Contrainte de valeur/longueur maximale. |
limit | String | Non | Limite de réponse. |
options | List of objects (Option) | Non | Options sélectionnables, chacune { "label": ..., "value": ... }. |
hierarchicalOptions | List | Non | Options hiérarchiques, le cas échéant. |
Objet Analytics
| Champ | Type | Requis | Description |
|---|---|---|---|
device | String | Non | Appareil utilisé pour postuler. |
ip | String | Non | Adresse IP du candidat. |
referer | String | Non | URL de provenance (referer). |
userAgent | String | Non | Agent utilisateur du navigateur. |
sponsored | String | Non | Indique si la candidature provient d’un affichage commandité. |
targetedApplyAd | String | Non | Identifiant de l’annonce de candidature ciblée. |
Exemples
Exemple de requête complète :
{ "locale": "en", "appliedOnMillis": 1718380800000, "job": { "jobTitle": "Senior Software Engineer", "jobCompany": "Acme Corp", "jobLocation": "Montréal, QC", "jobUrl": "https://example.com/jobs/123", "jobMeta": "src=partner" }, "applicant": { "id": "appl_1029", "fullName": "Jane Doe", "email": "jane.doe@example.com", "phoneNumber": "+1-514-555-0142", "coverletter": "I am excited to apply for this role...", "resume": { "text": "Jane Doe — Senior Software Engineer ...", "json": { "firstName": "Jane", "lastName": "Doe", "headline": "Senior Software Engineer", "summary": "10+ years building distributed systems.", "publicProfileUrl": "https://example.com/in/janedoe", "phoneNumber": "+1-514-555-0142", "location": { "city": "Montréal", "country": "CA", "postalCode": "H2X 1Y4" }, "skills": "Java, Spring Boot, MongoDB, Kubernetes", "positions": { "_total": 1, "values": [ { "title": "Senior Software Engineer", "company": "Globex", "location": "Montréal, QC", "startDateMonth": "01", "startDateYear": "2019", "endCurrent": true, "description": "Lead backend engineer." } ] }, "educations": { "_total": 1, "values": [ { "degree": "B.Sc. Computer Science", "field": "Computer Science", "school": "McGill University", "location": "Montréal, QC", "startDate": "2011", "endDate": "2015", "endCurrent": false } ] }, "links": { "_total": 1, "values": [ { "url": "https://github.com/janedoe" } ] } }, "file": { "contentType": "application/pdf", "fileName": "jane-doe-resume.pdf", "data": "JVBERi0xLjQKJ..." } } }, "screenerQuestionsAndAnswers": { "url": "https://example.com/jobs/123/questions", "retrievedOnMillis": 1718380000000, "questionsAndAnswers": [ { "question": { "id": "q1", "question": "Are you legally authorized to work in Canada?", "type": "select", "required": true, "options": [ { "label": "Yes", "value": "yes" }, { "label": "No", "value": "no" } ] }, "answer": { "label": "Yes", "value": "yes" } }, { "question": { "id": "q2", "question": "Years of experience with Java?", "type": "number", "required": true }, "answer": "10" } ] }, "demographicQuestionsAndAnswers": { "questionsAndAnswers": [ { "question": { "id": "d1", "question": "How did you hear about us?", "type": "text", "required": false }, "answer": "Online job board" } ] }, "analytics": { "device": "desktop", "ip": "203.0.113.7", "referer": "https://www.example.com", "userAgent": "Mozilla/5.0", "sponsored": "false", "targetedApplyAd": "ad_55" }}Réponses et erreurs
En cas de succès, le point de terminaison retourne HTTP 200 OK avec un corps vide — la candidature est acceptée et mise en file pour traitement dans le tenant ciblé. Il n’y a aucune charge utile de réponse.
| Statut | Signification |
|---|---|
200 OK | Candidature acceptée. |
400 Bad Request | Le corps est mal formé ou échoue à la validation (par exemple données de candidat manquantes, JSON non analysable). |
404 Not Found | Le source ou le jobId n’a pas pu être résolu. |
415 Unsupported Media Type | Le Content-Type n’est pas application/json. |
500 Internal Server Error | Échec de traitement inattendu. |
Le corps des erreurs est retourné en JSON.
{ "timestamp": "2026-06-14T12:00:00.000+00:00", "status": 400, "error": "Bad Request", "message": "Malformed application body", "path": "/v2/applications/partner/5c875c8b2c17ca56a9806c9f"}