Skip to main content

Réception des candidatures

La réception de candidatures depuis ATS Connect au format unique HelloWork ATS Partner requiert la mise à disposition, par les ATS, d'un endpoint de réception des candidatures.


Endpoint

Le endpoint de réception doit respecter les critères suivants :

  • Méthode : POST
  • URL : libre (exemple recommandé : https://ats.yourdomain.com/api/applications)
  • Format : application/json

💡 Le couple endpoint / apiKey est commun à tous les clients et doit être communiqué au groupe HelloWork.


Format de la requête

Le corps de la requête JSON est structuré comme suit :

{
"applicationId": "string",
"job": {
"jobId": "string",
"jobAtsUrl": "string"
},
"applicant": {
"firstName": "string",
"lastName": "string",
"email": "string",
"phoneNumber": "string"
},
"resume": {
"file": {
"fileName": "string",
"contentType": "string",
"data": "string"
}
},
"source": "string or object",
"statusApiUrl": "string",
"screenerQuestions": [
{
"id": "string",
"question": "string",
"type": "text | textarea | number | select | multiselect | boolean | date",
"answer": "string | string(date format YYYY-MM-DD) | number | boolean | string[]",
"options": [
{ "value": "string", "label": "string" }
]
}
]
}

Définition des champs

ChampTypeDescription
applicationIdstringIdentifiant unique de la candidature côté HelloWork ATS Partner.
jobobjetInformations relatives à l’offre concernée.
job.jobIdstringIdentifiant unique de l’offre dans l’ATS.
job.jobAtsUrlstringURL de l’offre sur le site carrière.
applicantobjetInformations sur le candidat.
applicant.firstNamestringPrénom du candidat.
applicant.lastNamestringNom du candidat.
applicant.emailstringAdresse e-mail du candidat.
applicant.phoneNumberstringNuméro de téléphone du candidat.
resume.fileobjetFichier CV transmis au format Base64 avec ses métadonnées.
sourcestring / objetProvenance de la candidature.
statusApiUrlstringURL d’API permettant à l’ATS de notifier HelloWork des changements de statut.
screenerQuestionsarrayListe des questions de présélection.

Structure screenerQuestions (Format normalisé)

La clé screenerQuestions contient un tableau de questions structurées selon un format standardisé.

Chaque question possède :

  • id : identifiant unique
  • question : libellé affiché
  • type : type normalisé (voir tableau ci-dessous)
  • answer : réponse du candidat

Types supportés

TypeDescriptionFormat answer
textTexte courtstring
textareaTexte longstring
numberValeur numériquenumber
selectChoix uniquestring = id d’une option
multiselectChoix multiplesstring[] = liste d’ids
booleanOui / Nontrue / false
dateDate ISO 8601string = YYYY-MM-DD

Exemple détaillé

"screenerQuestions": [
{
"id": "availability_weeks",
"question": "Dans combien de semaines êtes-vous disponible ?",
"type": "number",
"answer": 5
},
{
"id": "languages",
"question": "Quelles langues parlez-vous ?",
"type": "multiselect",
"options": [
{ "value": "fr", "label": "Français" },
{ "value": "en", "label": "Anglais" },
{ "value": "es", "label": "Espagnol" }
],
"answer": ["fr", "en"]
},
{
"id": "remote_ok",
"question": "Acceptez-vous le télétravail ?",
"type": "boolean",
"answer": true
},
{
"id": "why_us",
"question": "Pourquoi souhaitez-vous rejoindre notre entreprise ?",
"type": "textarea",
"answer": "Je partage vos valeurs et votre approche de l'innovation."
},
{
"id": "start_date",
"question": "À quelle date pouvez-vous commencer ?",
"type": "date",
"answer": "2025-03-15"
},
{
"id": "work_mode",
"question": "Quel mode de travail préférez-vous ?",
"type": "select",
"options": [
{ "value": "onsite", "label": "Présentiel" },
{ "value": "remote", "label": "Télétravail" },
{ "value": "hybrid", "label": "Hybride" }
],
"answer": "hybrid"
}
]

Authentification

Pour l'authentification, il a été choisi d'utiliser une API key qui sera transmise en header de chaque requête.

  • Cette API key est à fournir à l'équipe ATS Connect HelloWork par l'équipe en charge de l'ATS.
  • Le nom du header est au choix des ATS

La gestion de la source

La source est un champ permettant à l'ATS de déterminer la source de la candidature. En fonction du besoin de l'ATS, elle peut être une chaîne de caractères ou un objet plus complexe (voir les 2 exemples ci-dessous avec les 2 types de source) Par défaut, ce sera une chaîne de caractères qui prendra l'une des valeurs du paragraphe 'Gestion des sources de candidatures'.

Exemple de requête contenant source complexe

Ci-après un exemple de requête (format cURL) envoyée à l'ATS depuis HelloWork :

curl -L -X POST 'https://ats.yourdomain.com/api/applications' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'YourAuthorizationHeader: token' \
--data-raw '{
"applicationId": "4b0492a6-d2f6-4baf-9b80-3a0dd0c798c0",
"job": {
"jobId": "2022-001-developer",
"jobAtsUrl": "https://sitecarriere.yourdomain.com/job/2022-001-developer"
},
"applicant": {
"firstName": "Michel",
"lastName": "Ducpond",
"email": "michel-dupond@internet.com",
"phoneNumber": "0601020304",
},
"resume": {
"file": {
"fileName": "resume.pdf",
"contentType": "application/pdf",
"data": "Base64Content"
}
},
"source": {
"sourceTypeId": "DIRECT_SOURCING",
"sourceSubTypeId": "ClientId",
"sourceId": "CVCatcherWebsite"
},
"statusApiUrl": "https://ats-partner.hellowork.com/v1/applications/4b0492a6-d2f6-4baf-9b80-3a0dd0c798c0/status"
}'

Gestion des sources de candidature

Le tableau ci-dessous contient les valeurs par défaut du champ source. Elles correspondent aux différents produits du groupe Hellowork auxquels les clients peuvent souscrire.

Product NameSource à afficher dans l'ATSSource dans le payload
Site Carrière by HelloworkHellowork Career Site (Hellowork)"source": "hellowork-career-site"
BasileBasile (Hellowork)"source": "basile"
SeekubeSeekube (Hellowork)"source": "seekube"
Hellowork.comHellowork.com (Hellowork)"source": "hellowork.com"
JobijobaJobijoba (Hellowork)"source": "jobijoba"
SmartForumSmartForum (Hellowork)"source": "smartforum"
StoriStori by Hellowork (Hellowork)"source": "stori-by-hellowork"
Site Carrière Interne by HelloworkHellowork Career Site Internal (Hellowork)"source": "hellowork-career-site-internal"

Réponse attendue

✅ En cas de succès

{
"atsApplicationId": "string",
"atsApplicantId": "string"
}

La définition des champs est la suivante :

ChampObligatoire / FacultatifDéfinition
atsApplicationIdFacultatifIdentifiant de la candidature au sein de l'ATS si l'information est disponible au moment de la réponse
atsApplicantIdFacultatifIdentifiant du candidat au sein de l'ATS si l'information est disponible au moment de la réponse

❌ En cas d’erreur fonctionnelle

{
"message": "L'offre n'a pas été trouvée",
"code": "Offer"
}

La définition des champs est la suivante :

ChampObligatoire / FacultatifDéfinition
messageObligatoireDescription de l'erreur
codeObligatoireCode permettant de qualifier l'erreur

La définition des code disponible :

valeur de codedescription
AuthenticationProblème d'authentification
ApplicationExistsLa candidature a déjà été envoyée à l'ATS
RejectedCandidateLe candidat est rejeté par l'ATS
AttachmentProblème de pièce jointe (CV ou lettre de motivation)
OfferL'offre n'est plus disponible ou est expirée
OfferFormatLe format de l'id de l'offre n'est pas celui attendu
OfferExpiredOrUnpublished L'offre à expirée, à été supprimée ou est dépubliée
FieldSizeProblème de taille de champ
FieldsValidationErreur de validation de champ requis

Exemple

{
"message": "L'offre n'a pas été trouvée",
"code": "Offer"
}

Gestion des status code

Il est conseillé d'associer les status code suivant au code suivant :

status codevaleur de codedescription
401 - UnauthorizedAuthenticationProblème d'authentification
400 - BadRequestApplicationExistsLa candidature a déjà été envoyée à l'ATS
400 - BadRequestRejectedCandidateLe candidat est rejeté par l'ATS - Présicez pourquoi dans le message
400 - BadRequestAttachmentProblème de pièce jointe (CV ou lettre de motivation)
400 - BadRequestOfferL'offre n'est plus disponible ou est expirée
400 - BadRequestOfferFormatLe format de l'id de l'offre n'est pas celui attendu - Présicez le format attendu dans le message
400 - BadRequestFieldSizeProblème de taille de champ
400 - BadRequestFieldsValidationErreur de validation de champ requis