Aller au contenu

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 dérivée du riche modèle de candidature Indeed, de sorte que n’importe quelle source d’intégration peut transmettre la même structure de corps.

Point de terminaison

POST https://public-api.nextal.com/{source}/{tenant}/{jobId}
Type de contenuRôle
application/jsonPrincipal — recommandé pour toutes les nouvelles intégrations
application/xmlSecondaire — pris en charge pour la rétrocompatibilité

Paramètres de chemin

ParamètreTypeRequisDescription
sourceStringOuiLa clé de la source/du fournisseur d’intégration (par exemple indeed). Elle identifie l’origine de la candidature. Elle ne modifie pas le schéma du corps de la requête.
tenantStringOuiLe tenant Nextal auquel appartient le poste.
jobIdStringOuiLe poste ciblé. Le serveur injecte cette valeur dans job.jobId de la candidature, de sorte que tout jobId que vous placez dans le corps est remplacé par la valeur du chemin.

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 (par exemple indeed), le tenant ciblé et le jobId du poste visé par la candidature.

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 :

ChampTypeRequisDescription
localeStringNonLocale de la candidature (par exemple en, fr_CA).
appliedOnMillisLongNonHorodatage epoch (en millisecondes) du moment où la candidature a été soumise.
jobObject (Job)NonLe poste auquel le candidat a postulé. Voir Objet Job.
applicantObject (Applicant)OuiLe candidat et son curriculum vitæ. Voir Objet Applicant.
screenerQuestionsAndAnswersObject (QuestionsAndAnswers)NonQuestions de présélection et réponses du candidat. Voir Objet QuestionsAndAnswers.
demographicQuestionsAndAnswersObject (QuestionsAndAnswers)NonQuestions et réponses démographiques (même structure que la présélection). Voir Objet QuestionsAndAnswers.
analyticsObject (Analytics)NonDonné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.

ChampTypeRequisDescription
jobIdStringNonIdentifiant du poste ciblé. Remplacé par le jobId du chemin.
jobTitleStringNonTitre du poste à la source.
jobCompanyStringNonNom de l’entreprise à la source.
jobLocationStringNonLieu du poste à la source.
jobUrlStringNonURL de l’affichage du poste à la source.
jobMetaStringNonMétadonnées opaques de la source.

Objet Applicant

ChampTypeRequisDescription
idStringNonIdentifiant du candidat à la source.
fullNameStringNonNom complet du candidat.
emailStringNonAdresse courriel du candidat.
phoneNumberStringNonNuméro de téléphone du candidat.
coverletterStringNonTexte de la lettre de présentation.
resumeObject (Resume)NonLe 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.

ChampTypeRequisDescription
textStringNonCurriculum vitæ en texte brut.
hrXmlStringNonReprésentation HR-XML du curriculum vitæ.
htmlStringNonReprésentation HTML du curriculum vitæ.
jsonObject (Json)NonCurriculum vitæ structuré. Voir Objet Resume json.
fileObject (File)NonFichier binaire du curriculum vitæ. Voir Objet File.

Objet File

ChampTypeRequisDescription
contentTypeStringNonType MIME du fichier (par exemple application/pdf).
dataStringNonContenu du fichier encodé en Base64.
fileNameStringNonNom de fichier d’origine.

Objet Resume json

Données structurées du curriculum vitæ.

ChampTypeRequisDescription
firstNameStringNonPrénom.
lastNameStringNonNom de famille.
headlineStringNonTitre professionnel.
summaryStringNonSommaire professionnel.
publicProfileUrlStringNonURL du profil public.
additionalInfoStringNonInformation additionnelle en format libre.
phoneNumberStringNonNuméro de téléphone.
locationObject (Location)NonLieu du candidat. Voir Objet Location.
skillsStringNonCompétences (chaîne en format libre).
positionsObject (Positions)NonHistorique professionnel. Wrapper de liste, voir Wrappers de liste.
educationsObject (Educations)NonHistorique de formation. Wrapper de liste.
linksObject (Links)NonLiens externes. Wrapper de liste.
awardsObject (Awards)NonPrix et distinctions. Wrapper de liste.
certificationsObject (Certifications)NonCertifications. Wrapper de liste.
associationsObject (Associations)NonAssociations professionnelles. Wrapper de liste.
patentsObject (Patents)NonBrevets. Wrapper de liste.
publicationsObject (Publications)NonPublications. Wrapper de liste.
militaryServicesObject (MilitaryServices)NonDossiers de service militaire. Wrapper de liste.

Objet Location

ChampTypeRequisDescription
cityStringNonVille.
countryStringNonPays.
postalCodeStringNonCode 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 :

ChampTypeRequisDescription
_totalLongNonNombre d’entrées dans values.
valuesList of objectsNonLes entrées; le type d’élément dépend de la collection (voir ci-dessous).

positions[].values[] (PositionValues)

ChampTypeDescription
titleStringTitre du poste.
companyStringEmployeur.
locationStringLieu.
startDateMonthStringMois de début.
startDateYearStringAnnée de début.
endDateMonthStringMois de fin.
endDateYearStringAnnée de fin.
endCurrentBooleantrue s’il s’agit du poste actuel.
descriptionStringDescription.

educations[].values[] (EducationValues)

ChampTypeDescription
degreeStringDiplôme obtenu.
fieldStringDomaine d’études.
schoolStringNom de l’établissement.
locationStringLieu de l’établissement.
startDateStringDate de début.
endDateStringDate de fin.
endCurrentBooleantrue si toujours en cours.

links[].values[] (LinkValues)

ChampTypeDescription
urlStringL’URL du lien.

awards[].values[] (AwardValues)

ChampTypeDescription
titleStringTitre du prix.
dateMonthStringMois du prix.
dateYearStringAnnée du prix.
descriptionStringDescription.

certifications[].values[] (CertificationValues)

ChampTypeDescription
titleStringTitre de la certification.
startDateMonthStringMois de début.
startDateYearStringAnnée de début.
endDateMonthStringMois de fin.
endDateYearStringAnnée de fin.
endCurrentBooleantrue si toujours valide.
descriptionStringDescription.

associations[].values[] (AssociationValues)

ChampTypeDescription
titleStringTitre de l’association.
startDateMonthStringMois de début.
startDateYearStringAnnée de début.
endDateMonthStringMois de fin.
endDateYearStringAnnée de fin.
endCurrentBooleantrue si toujours membre.
descriptionStringDescription.

patents[].values[] (PatentValues)

ChampTypeDescription
patentNumberStringNuméro de brevet.
titleStringTitre du brevet.
urlStringURL du brevet.
dateMonthStringMois de la date.
dateYearStringAnnée de la date.
descriptionStringDescription.

publications[].values[] (PublicationValues)

ChampTypeDescription
titleStringTitre de la publication.
urlStringURL de la publication.
dateDayStringJour de la date.
dateMonthStringMois de la date.
dateYearStringAnnée de la date.
descriptionStringDescription.

militaryServices[].values[] (MilitaryServiceValues)

ChampTypeDescription
serviceCountryStringPays de service.
branchStringBranche de service.
rankStringGrade atteint.
startDateMonthStringMois de début.
startDateYearStringAnnée de début.
endDateMonthStringMois de fin.
endDateYearStringAnnée de fin.
endCurrentBooleantrue si toujours en service.
commendationsStringMentions élogieuses.
descriptionStringDescription.

Objet QuestionsAndAnswers

Utilisé à la fois par screenerQuestionsAndAnswers et demographicQuestionsAndAnswers.

ChampTypeRequisDescription
urlStringNonURL source d’où les questions ont été récupérées.
retrievedOnMillisLongNonHorodatage epoch (en millisecondes) du moment où les questions ont été récupérées.
questionsAndAnswersList of objects (QuestionsAndAnswer)NonUne entrée par paire question/réponse.

questionsAndAnswers[] (QuestionsAndAnswer)

ChampTypeRequisDescription
questionObject (Question)NonLes métadonnées de la question. Voir Objet Question.
answerString, Object, or ListNonLa 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

ChampTypeRequisDescription
idStringNonIdentifiant de la question.
questionStringNonLe texte de la question.
typeStringNonType de question (par exemple text, number, date, select, multiselect).
requiredBooleanNonIndique si une réponse est obligatoire.
formatStringNonFormat de réponse attendu.
minStringNonContrainte de valeur/longueur minimale.
maxStringNonContrainte de valeur/longueur maximale.
limitStringNonLimite de réponse.
optionsList of objects (Option)NonOptions sélectionnables, chacune { "label": ..., "value": ... }.
hierarchicalOptionsListNonOptions hiérarchiques, le cas échéant.

Objet Analytics

ChampTypeRequisDescription
deviceStringNonAppareil utilisé pour postuler.
ipStringNonAdresse IP du candidat.
refererStringNonURL de provenance (referer).
userAgentStringNonAgent utilisateur du navigateur.
sponsoredStringNonIndique si la candidature provient d’un affichage commandité.
targetedApplyAdStringNonIdentifiant de l’annonce de candidature ciblée.

Exemples

Une requête complète est présentée d’abord en JSON, puis sous sa forme XML équivalente.

{
"locale": "en",
"appliedOnMillis": 1718380800000,
"job": {
"jobTitle": "Senior Software Engineer",
"jobCompany": "Acme Corp",
"jobLocation": "Montréal, QC",
"jobUrl": "https://example.com/jobs/123",
"jobMeta": "src=indeed"
},
"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": "Indeed"
}
]
},
"analytics": {
"device": "desktop",
"ip": "203.0.113.7",
"referer": "https://www.indeed.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.

StatutSignification
200 OKCandidature acceptée.
400 Bad RequestLe corps est mal formé ou échoue à la validation (par exemple données de candidat manquantes, JSON/XML non analysable).
404 Not FoundLe source, le tenant ou le jobId n’a pas pu être résolu.
415 Unsupported Media TypeLe Content-Type n’est ni application/json ni application/xml.
500 Internal Server ErrorÉchec de traitement inattendu.

Le corps des erreurs respecte le type de contenu demandé. Exemples — JSON d’abord, puis XML.

{
"timestamp": "2026-06-14T12:00:00.000+00:00",
"status": 400,
"error": "Bad Request",
"message": "Malformed application body",
"path": "/indeed/demo/5c875c8b2c17ca56a9806c9f"
}

Migration

Ce point de terminaison généralisé remplace les anciens points de terminaison de candidature propres à un fournisseur — les points de terminaison de candidature Indeed indeed/{tenant}/{jobId} et Neuvoo neuvoo/{tenant}/{jobId}. Ceux-ci demeurent documentés pour la rétrocompatibilité sous Ancienne version → Candidatures (v1) → Créer une candidature.

Les nouvelles intégrations devraient cibler {source}/{tenant}/{jobId} avec la charge utile canonique ci-dessus.