- Description et paramètres de l’endpoint
- Mode Sandbox : pour tester en toute sécurité
- Champs obligatoires
- Recommandation sur l’envoi des données
- Exemple complet (XML brut)
- Attention à la duplication des balises XML
- Tableau des champs
- Réponse attendue
- Tester avec cURL
- Tester avec Postman
- Informations d’authentification requises
- En-têtes HTTP requis
- Exécution locale et fuseau horaire
- Exemple complet : envoi de plusieurs offres d’emploi via POST [PHP / XML] (avec cURL)
- Exemple complet : envoi de plusieurs offres d’emploi via POST [Python / XML] (avec requests)
- Exemple complet : envoi de plusieurs offres d’emploi via POST [C# / XML]
- Exemple complet : envoi de plusieurs offres d’emploi via POST [JavaScript / XML] (avec Node.js)
- Codes HTTP de réponse possibles
- Messages d’erreur possibles
L’endpoint jobs-posting XML (https://api.easyjobs.fr/v1/xml/jobs-posting)
accepte des requêtes POST permettant de transmettre plusieurs offres d’emploi dans un seul document XML. Il est conçu pour une intégration automatisée via des scripts ou systèmes externes (ERP/ATS, plateformes RH, outils internes). Le corps de la requête doit :
• inclure tous les champs obligatoires ;
• respecter les formats attendus ;
• encapsuler chaque offre dans une balise <job>
;
• être encodé en application/xml
.
En retour, l’API fournit une réponse structurée :
201 Created
si l’offre a été enregistrée avec succès.400 Bad Request
si un champ est manquant, mal formaté ou invalide.403 Forbidden
si l’authentification échoue ou si l’origine de la requête n’est pas autorisée.405 Method Not Allowed
si une méthode HTTP incorrecte est utilisée.500 Internal Server Error
en cas d’erreur inattendue côté serveur.
Pour publier une seule offre en XML, utilisez l’endpoint /job-posting
.
Tous les exemples ci-dessous sont conçus pour fonctionner en mode sandbox, afin de vous permettre de tester l’API EasyJobs sans impact réel. Pour passer en mode production, il suffit de remplacer v1-sandbox
par v1
dans l’URL. Il est fortement recommandé de réaliser tous vos tests en mode sandbox avant d’utiliser l’environnement réel.
Pour en savoir plus sur le fonctionnement du mode sandbox, les environnements disponibles et les bonnes pratiques de test, consultez la page dédiée : Mode Sandbox de l'API EasyJobs.
Les champs suivants sont requis pour cet endpoint :
- id : Identifiant unique de l’offre d’emploi (chaîne de caractères alphanumérique).
- date : Date de publication de l’offre (format : YYYY-MM-DD HH:mm:ss).
- title : Titre du poste (ex. : Développeur Web Fullstack - H/F).
- position : Description détaillée du poste et des missions principales.
- contract_type : Type de contrat (ex. : CDI, CDD, etc.).
- location : Ville où le poste est basé (ex. : Paris).
- country : Pays où le poste est basé (ex. : France).
- salary ou (salary_min et salary_max) : Un des deux formats suivants est requis :
- salary : Montant unique au format strict <montant><devise>/<période> (ex. : 30000€/an).
- salary_min et salary_max : Fourchette de rémunération, chacun au format strict <montant><devise>/<période> (ex. : 27400€/an – 32100€/an).
La devise et la période doivent correspondre au modèle suivant : €/heure, €/jour, €/mois, €/an.
Consultez la documentation complète des champs pour plus de détails sur chaque paramètre, leurs formats et leurs valeurs acceptées.
Pour optimiser la visibilité de vos offres d’emploi dans les résultats de recherche, il est fortement recommandé de fournir le maximum de champs disponibles.
Plus les informations transmises sont complètes (description, profil recherché, localisation détaillée, fourchette salariale, etc.), plus vos annonces seront pertinentes et attractives pour les candidats.
Une offre bien renseignée améliore non seulement le référencement interne sur EasyJobs, mais également l’expérience utilisateur en permettant aux candidats de filtrer et de trouver facilement les postes qui correspondent à leurs attentes.
Certains champs, bien que facultatifs, peuvent être utilisés pour améliorer l’indexation et affiner les résultats de recherche.
<?xml version="1.0" encoding="UTF-8"?>
<jobs>
<job>
<id><![CDATA[4M0123456N43N25]]></id>
<date><![CDATA[2025-04-22 10:00:00]]></date>
<valid_through><![CDATA[2025-05-22 10:00:00]]></valid_through>
<title><![CDATA[Développeur Web Fullstack - H/F]]></title>
<contract_type><![CDATA[CDI]]></contract_type>
<work_hours><![CDATA[35 heures]]></work_hours>
<employment_type><![CDATA[Temps-plein]]></employment_type>
<description><![CDATA[Nous recherchons un Développeur Web Fullstack, pour développer une application.]]></description>
<position><![CDATA[Nous recherchons un(e) développeur(se) web fullstack passionné(e) pour rejoindre notre équipe dynamique. Vous participerez à la conception et au développement d'applications web innovantes pour des clients internationaux.]]></position>
<profile><![CDATA[Vous avez une expérience de 3 ans minimum en PHP, JavaScript et frameworks modernes. Vous aimez travailler en équipe et relever de nouveaux défis.]]></profile>
<location><![CDATA[Paris]]></location>
<postcode><![CDATA[75001]]></postcode>
<region><![CDATA[Île-de-France]]></region>
<country><![CDATA[France]]></country>
<subsidiary><![CDATA[Agence Web]]></subsidiary>
<url><![CDATA[https://www.exemple.com/offre]]></url>
<salary><![CDATA[27400€/an]]></salary>
<salary_min></salary_min>
<salary_max></salary_max>
<rome><![CDATA[M1805]]></rome>
<available><![CDATA[1]]></available>
<experience><![CDATA[Débutant accepté]]></experience>
<company_logo_url><![CDATA[https://www.exemple.com/logo.png]]></company_logo_url>
<posted_via><![CDATA[My Company]]></posted_via>
</job>
<job>
<id><![CDATA[4M0123456N43N26]]></id>
<date><![CDATA[2025-04-22 11:30:00]]></date>
<valid_through><![CDATA[2025-05-22 11:30:00]]></valid_through>
<title><![CDATA[Ingénieur DevOps - H/F]]></title>
<contract_type><![CDATA[CDI]]></contract_type>
<work_hours><![CDATA[35 heures]]></work_hours>
<employment_type><![CDATA[Temps-plein]]></employment_type>
<description><![CDATA[Dans le cadre de notre croissance, nous recherchons un ingénieur DevOps pour renforcer notre équipe technique.]]></description>
<position><![CDATA[Vous participerez à l’automatisation, au déploiement et à la supervision des infrastructures cloud de nos clients.]]></position>
<profile><![CDATA[Connaissances solides en CI/CD, conteneurs (Docker/Kubernetes) et scripts d’automatisation (Bash, Python).]]></profile>
<location><![CDATA[Lyon]]></location>
<postcode><![CDATA[69000]]></postcode>
<region><![CDATA[Auvergne-Rhône-Alpes]]></region>
<country><![CDATA[France]]></country>
<subsidiary><![CDATA[Pôle Infrastructure]]></subsidiary>
<url><![CDATA[https://www.exemple.com/offre-devops]]></url>
<salary></salary>
<salary_min><![CDATA[39500€/an]]></salary_min>
<salary_max><![CDATA[42000€/an]]></salary_max>
<rome><![CDATA[M1810]]></rome>
<available><![CDATA[1]]></available>
<experience><![CDATA[Expérience exigée]]></experience>
<company_logo_url><![CDATA[https://www.exemple.com/logo-devops.png]]></company_logo_url>
<posted_via><![CDATA[My Company]]></posted_via>
</job>
</jobs>
Dans une même offre, chaque balise XML (comme <salary>
, <location>
, etc.) ne doit apparaître qu’une seule fois.
Si une balise est dupliquée accidentellement, le système interprète sa valeur comme un tableau (au lieu d’une chaîne de caractères simple), ce qui peut provoquer une erreur lors du traitement côté serveur :
{
"message":"Erreur de type: preg_match(): Argument #2 ($subject) must be of type string, array given"
}
Recommandation : vérifiez bien que vos fichiers XML ne contiennent pas de doublons de balises au même niveau.
Champ | Type | Obligatoire | Description |
---|---|---|---|
id | string | Oui | Identifiant unique de l’offre. Alphanumérique, entre 4 et 128 caractères. |
date | string | Oui | Date de création de l’offre au format YYYY-MM-DD HH:mm:ss . |
valid_through | string | Non | Date d’expiration de l’offre au format YYYY-MM-DD HH:mm:ss . Doit être postérieure à date. |
title | string | Oui | Titre de l’offre d’emploi. Entre 12 et 160 caractères. |
contract_type | string | Oui | Type de contrat (ex : CDI, CDD, Stage, etc). Entre 3 et 64 caractères. |
work_hours | string | Non | Temps de travail (ex : 35h/semaine, 35 heures, etc). Lettres, chiffres, espaces, / et -. |
employment_type | string | Non | Type d’emploi. Une des valeurs : Temps-plein, Temps-partiel, Temporaire, Freelance. |
description | string | Non | Description de l’entreprise. Entre 48 et 1024 caractères. |
position | string | Oui | Description du poste. Entre 64 et 12288 caractères. |
profile | string | Non | Profil recherché. Entre 64 et 12288 caractères. |
location | string | Oui | Lieu du poste. Entre 4 et 64 caractères. |
postcode | string | Non | Code postal (5 chiffres). |
region | string | Non | Région. Entre 5 et 32 caractères. Lettres, espaces et tiret uniquement. |
country | string | Oui | Pays. Entre 4 et 64 caractères. Lettres et tiret uniquement. |
subsidiary | string | Non | Nom de l'entreprise. Entre 2 et 64 caractères. |
url | string | Non | URL HTTPS de l’offre sur le site de l’entreprise. Doit commencer par https:// . |
salary | string | Conditionnel | Salaire global. Format : 1600€/mois , 2000$/an , etc. Si utilisé, ne pas remplir salary_min ni salary_max. |
salary_min | string | Conditionnel | Salaire minimum. Format : 1500€/mois , 2000$/an , etc. Obligatoire si salary n’est pas renseigné. |
salary_max | string | Conditionnel | Salaire maximum. Format : 2500€/mois , 3000$/an , etc. Obligatoire si salary n’est pas renseigné. |
rome | string | Non | Code ROME. Doit commencer par une lettre suivie de chiffres. |
available | int | Non | Nombre de postes à pourvoir (entier, jusqu’à 3 chiffres). |
experience | string | Non | Niveau d’expérience. Une des valeurs : Débutant accepté, Expérience exigée, Expérience souhaitée. |
company_logo_url | string | Non | URL HTTPS du logo de l’entreprise. Doit commencer par https:// . |
posted_via | string | Non | Source ou plateforme de publication. Entre 2 et 64 caractères. |
{
"status": "Offres d'emploi en file d'attente pour le traitement.",
"processed_jobs": 2,
"results": [
{
"job_id": "4M0123456N43N25",
"status": "success",
"message": "L'offre d'emploi 4M0123456N43N25 est en file d'attente pour le traitement."
},
{
"job_id": "4M0123456N43N26",
"status": "success",
"message": "L'offre d'emploi 4M0123456N43N26 est en file d'attente pour le traitement."
}
]
}
Pour l’endpoint jobs-posting XML, les offres envoyées par lot sont d’abord placées dans une file d’attente interne. Cette file (queue) est traitée presque en temps réel : le délai reste très court, mais il peut y avoir quelques secondes entre la réception et l’enregistrement définitif de chaque annonce. La réponse processed_jobs
indique combien d’offres ont été prises en charge, et le tableau results
confirme que chaque job_id
est « en file d’attente pour le traitement ». Une fois le traitement terminé, le statut final (création ou erreur) est disponible dans votre tableau de bord EasyJobs API : Tableau de bord → Accueil → Dernières logs.
Vous pouvez donc envoyer un lot important en une seule requête, puis suivre la progression depuis la section Dernières logs
sans attendre la fin du traitement dans la réponse immédiate de l’API.
En cas d’erreur, consultez la page Gestion des erreurs.
curl -X POST https://api.easyjobs.fr/v1-sandbox/xml/jobs-posting \
-H "Authorization: Bearer <API_TOKEN>" \
-H "Usersecretkey: <SECRET_KEY>" \
-H "Content-Type: application/xml" \
-H "Accept-Language: fr" \
-H "User-Agent: EasyJobsClient/1.0" \
-H "X-Client-Lang: <LANGAGE_CLIENT>" \
-H "Origin: https://www.domaine-origine.com" \
-d @exemple-offres.xml
Assurez-vous que le fichier exemple-offres.xml contient le XML brut montré ci-dessus.
- Méthode :
POST
- URL :
https://api.easyjobs.fr/v1-sandbox/xml/jobs-posting
- En-têtes requis :
- Authorization:
Bearer <API_TOKEN>
- Usersecretkey:
<SECRET_KEY>
- Content-Type:
application/xml
- Accept-Language:
fr
- User-Agent:
EasyJobsClient/1.0
- X-Client-Lang:
<LANGAGE_CLIENT>
- Origin:
https://www.domaine-origine.com
- Authorization:
- Corps (Body) : sélectionner
raw
, choisirXML
, et coller le contenu de l’exemple XML brut (voir section "Exemple complet (XML brut)").
Pour exécuter correctement vos requêtes, veillez à remplacer les valeurs par défaut par vos propres informations d’authentification :
- API_TOKEN : votre jeton d’authentification personnel, disponible dans le dashboard EasyJobs API, rubrique "Gestion des clés".
- SECRET_KEY : votre clé secrète utilisateur, accessible également dans la rubrique "Gestion des clés".
Ces informations sont obligatoires pour autoriser l’accès à l’API et assurer l’authentification de vos requêtes.
Pour que vos requêtes soient correctement interprétées par l’API, les en-têtes suivants sont obligatoires :
Authorization
: jeton d’authentification personnel (Bearer API_TOKEN).Usersecretkey
: votre clé secrète utilisateur.Content-Type
:application/xml
.Accept-Language
: définit la langue de la réponse (valeurs possibles :fr
,en
,es
).User-Agent
: identifiant de votre client (ex. :EasyJobsClient/1.0
). Obligatoire pour des raisons de sécurité.X-Client-Lang
: nom de la technologie utilisée (ex. :PHP
,Python
,JavaScript
,C#
), utile pour le formatage des réponses.Origin
: URL d’origine de la requête, qui doit être autorisée dans la section « Domaines autorisés » du dashboard.
Certains de nos exemples ont un décalage volontaire de +2 heures pour compenser la différence horaire entre le serveur (UTC) et l’heure locale française (UTC+2). Lorsque vous exécutez les scripts directement sur votre poste local (localhost), n’ajoutez pas ces 2 heures supplémentaires. En effet, en environnement local, votre PC étant déjà réglé sur l’heure de Paris, ajouter ces 2 heures entraînerait le rejet de votre requête par l’API, car la date serait considérée comme trop éloignée dans le futur.
// URL de l’endpoint API (mode sandbox)
$endpoint = "https://api.easyjobs.fr/v1-sandbox/xml/jobs-posting";
// Authentification
$apiToken = "API_TOKEN"; // Token d’authentification Bearer
$secretKey = "SECRET_KEY"; // Clé secrète utilisateur
// Génération des dates (maintenant +2h et validité +30 jours), format : YYYY-MM-DD HH:mm:ss
$date = date('Y-m-d H:i:s', strtotime('+2 hour'));
$valid_through = date('Y-m-d H:i:s', strtotime('+30 days', strtotime($date)));
// Données à envoyer dans le corps de la requête (payload)
$xmlData = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<jobs>
<job>
<id><![CDATA[4M0123456N43N25]]></id>
<date><![CDATA[$date]]></date>
<valid_through><![CDATA[$valid_through]]></valid_through>
<title><![CDATA[Développeur Web Fullstack - H/F]]></title>
<contract_type><![CDATA[CDI]]></contract_type>
<work_hours><![CDATA[35 heures]]></work_hours>
<employment_type><![CDATA[Temps-plein]]></employment_type>
<description><![CDATA[Nous recherchons un Développeur Web Fullstack, pour développer une application.]]></description>
<position><![CDATA[Nous recherchons un(e) développeur(se) web fullstack passionné(e) pour rejoindre notre équipe dynamique. Vous participerez à la conception et au développement d'applications web innovantes pour des clients internationaux.]]></position>
<profile><![CDATA[Vous avez une expérience de 3 ans minimum en PHP, JavaScript et frameworks modernes. Vous aimez travailler en équipe et relever de nouveaux défis.]]></profile>
<location><![CDATA[Paris]]></location>
<postcode><![CDATA[75001]]></postcode>
<region><![CDATA[Île-de-France]]></region>
<country><![CDATA[France]]></country>
<subsidiary><![CDATA[Agence Web]]></subsidiary>
<url><![CDATA[https://www.exemple.com/offre]]></url>
<salary><![CDATA[27400€/an]]></salary>
<salary_min></salary_min>
<salary_max></salary_max>
<rome><![CDATA[M1805]]></rome>
<available><![CDATA[1]]></available>
<experience><![CDATA[Débutant accepté]]></experience>
<company_logo_url><![CDATA[https://www.exemple.com/logo.png]]></company_logo_url>
<posted_via><![CDATA[My Company]]></posted_via>
</job>
<job>
<id><![CDATA[4M0123456N43N26]]></id>
<date><![CDATA[$date]]></date>
<valid_through><![CDATA[$valid_through]]></valid_through>
<title><![CDATA[Ingénieur DevOps - H/F]]></title>
<contract_type><![CDATA[CDI]]></contract_type>
<work_hours><![CDATA[35 heures]]></work_hours>
<employment_type><![CDATA[Temps-plein]]></employment_type>
<description><![CDATA[Dans le cadre de notre croissance, nous recherchons un ingénieur DevOps pour renforcer notre équipe technique.]]></description>
<position><![CDATA[Vous participerez à l’automatisation, au déploiement et à la supervision des infrastructures cloud de nos clients.]]></position>
<profile><![CDATA[Connaissances solides en CI/CD, conteneurs (Docker/Kubernetes) et scripts d’automatisation (Bash, Python).]]></profile>
<location><![CDATA[Lyon]]></location>
<postcode><![CDATA[69000]]></postcode>
<region><![CDATA[Auvergne-Rhône-Alpes]]></region>
<country><![CDATA[France]]></country>
<subsidiary><![CDATA[Pôle Infrastructure]]></subsidiary>
<url><![CDATA[https://www.exemple.com/offre-devops]]></url>
<salary></salary>
<salary_min><![CDATA[39500€/an]]></salary_min>
<salary_max><![CDATA[42000€/an]]></salary_max>
<rome><![CDATA[M1810]]></rome>
<available><![CDATA[1]]></available>
<experience><![CDATA[Expérience exigée]]></experience>
<company_logo_url><![CDATA[https://www.exemple.com/logo-devops.png]]></company_logo_url>
<posted_via><![CDATA[My Company]]></posted_via>
</job>
</jobs>
XML;
// En-têtes HTTP requis
$ch = curl_init($endpoint);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer $apiToken", // Token d’authentification
"Usersecretkey: $secretKey", // Clé secrète utilisateur
"Content-Type: application/xml", // Format XML
"Accept-Language: fr", // Langue de la réponse (valeurs possibles : en, fr, es)
"User-Agent: EasyJobsClient/1.0", // Identifiant de l’application appelante (nom + version)
"X-Client-Lang: PHP", // Indique au serveur la technologie cliente, afin d’adapter le formatage de la réponse
"Origin: https://www.domaine-origine.com", // Remplacez par l’URL depuis laquelle vous appelez l’API
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xmlData);
$response = curl_exec($ch);
// Affichage de la réponse API
if (curl_errno($ch)) {
echo "Erreur cURL : " . curl_error($ch);
} else {
echo "Réponse de l’API : " . $response;
}
curl_close($ch);
import requests
from datetime import datetime, timedelta
# URL de l’endpoint API (mode sandbox)
endpoint = "https://api.easyjobs.fr/v1-sandbox/xml/jobs-posting"
# Authentification
api_token = "API_TOKEN" # Token d’authentification Bearer
secret_key = "SECRET_KEY" # Clé secrète utilisateur
# Génération des dates (maintenant +2h et validité +30 jours), format : YYYY-MM-DD HH:mm:ss
date = (datetime.now() + timedelta(hours=2)).strftime('%Y-%m-%d %H:%M:%S')
valid_through = (datetime.now() + timedelta(days=30, hours=1)).strftime('%Y-%m-%d %H:%M:%S')
# Données à envoyer dans le corps de la requête (payload)
xml_payload = f"""<?xml version="1.0" encoding="UTF-8"?>
<jobs>
<job>
<id><![CDATA[4M0123456N43N25]]></id>
<date><![CDATA[{date}]]></date>
<valid_through><![CDATA[{valid_through}]]></valid_through>
<title><![CDATA[Développeur Web Fullstack - H/F]]></title>
<contract_type><![CDATA[CDI]]></contract_type>
<work_hours><![CDATA[35 heures]]></work_hours>
<employment_type><![CDATA[Temps-plein]]></employment_type>
<description><![CDATA[Nous recherchons un Développeur Web Fullstack, pour développer une application.]]></description>
<position><![CDATA[Nous recherchons un(e) développeur(se) web fullstack passionné(e) pour rejoindre notre équipe dynamique. Vous participerez à la conception et au développement d'applications web innovantes pour des clients internationaux.]]></position>
<profile><![CDATA[Vous avez une expérience de 3 ans minimum en PHP, JavaScript et frameworks modernes. Vous aimez travailler en équipe et relever de nouveaux défis.]]></profile>
<location><![CDATA[Paris]]></location>
<postcode><![CDATA[75001]]></postcode>
<region><![CDATA[Île-de-France]]></region>
<country><![CDATA[France]]></country>
<subsidiary><![CDATA[Agence Web]]></subsidiary>
<url><![CDATA[https://www.exemple.com/offre]]></url>
<salary><![CDATA[27400€/an]]></salary>
<salary_min></salary_min>
<salary_max></salary_max>
<rome><![CDATA[M1805]]></rome>
<available><![CDATA[1]]></available>
<experience><![CDATA[Débutant accepté]]></experience>
<company_logo_url><![CDATA[https://www.exemple.com/logo.png]]></company_logo_url>
<posted_via><![CDATA[My Company]]></posted_via>
</job>
<job>
<id><![CDATA[4M0123456N43N26]]></id>
<date><![CDATA[{date}]]></date>
<valid_through><![CDATA[{valid_through}]]></valid_through>
<title><![CDATA[Ingénieur DevOps - H/F]]></title>
<contract_type><![CDATA[CDI]]></contract_type>
<work_hours><![CDATA[35 heures]]></work_hours>
<employment_type><![CDATA[Temps-plein]]></employment_type>
<description><![CDATA[Dans le cadre de notre croissance, nous recherchons un ingénieur DevOps pour renforcer notre équipe technique.]]></description>
<position><![CDATA[Vous participerez à l’automatisation, au déploiement et à la supervision des infrastructures cloud de nos clients.]]></position>
<profile><![CDATA[Connaissances solides en CI/CD, conteneurs (Docker/Kubernetes) et scripts d’automatisation (Bash, Python).]]></profile>
<location><![CDATA[Lyon]]></location>
<postcode><![CDATA[69000]]></postcode>
<region><![CDATA[Auvergne-Rhône-Alpes]]></region>
<country><![CDATA[France]]></country>
<subsidiary><![CDATA[Pôle Infrastructure]]></subsidiary>
<url><![CDATA[https://www.exemple.com/offre-devops]]></url>
<salary></salary>
<salary_min><![CDATA[39500€/an]]></salary_min>
<salary_max><![CDATA[42000€/an]]></salary_max>
<rome><![CDATA[M1810]]></rome>
<available><![CDATA[1]]></available>
<experience><![CDATA[Expérience exigée]]></experience>
<company_logo_url><![CDATA[https://www.exemple.com/logo-devops.png]]></company_logo_url>
<posted_via><![CDATA[My Company]]></posted_via>
</job>
</jobs>
"""
# En-têtes HTTP requis
headers = {
"Authorization": f"Bearer {api_token}", # Token d’authentification
"Usersecretkey": secret_key, # Clé secrète utilisateur
"Content-Type": "application/xml", # Format XML
"Accept-Language": "fr", # Langue de la réponse (valeurs possibles : en, fr, es)
"User-Agent": "EasyJobsClient/1.0", # Identifiant de l’application appelante (nom + version)
"X-Client-Lang": "Python", # Indique au serveur la technologie cliente, afin d’adapter le formatage de la réponse
"Origin": "https://www.domaine-origine.com" # Remplacez par l’URL depuis laquelle vous appelez l’API
}
# Envoi de la requête POST
response = requests.post(endpoint, headers=headers, data=xml_payload.encode('utf-8'))
# Affichage de la réponse API
print("Réponse de l’API :", response.text)
using System;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
namespace EasyJobsApi
{
class Program
{
static async Task Main(string[] args)
{
// URL de l’endpoint API (mode sandbox)
var endpoint = "https://api.easyjobs.fr/v1-sandbox/xml/jobs-posting";
// Authentification : Token API et clé secrète utilisateur
var apiToken = "API_TOKEN";
var secretKey = "SECRET_KEY";
/* ---------------------------------------------------------
Génération des dates, format : YYYY-MM-DD HH:mm:ss
---------------------------------------------------------
- date : maintenant
- valid_through : date + 30 jours
--------------------------------------------------------- */
var date = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
var validThrough = DateTime.Now.AddDays(30).ToString("yyyy-MM-dd HH:mm:ss");
// Données à envoyer pour créer l’offre d’emploi (XML)
var xmlData = $@"<?xml version=""1.0"" encoding=""UTF-8""?>
<jobs>
<job>
<id><![CDATA[4M0123456N43N25]]></id>
<date><![CDATA[{date}]]></date>
<valid_through><![CDATA[{validThrough}]]></valid_through>
<title><![CDATA[Développeur Web Fullstack - H/F]]></title>
<contract_type><![CDATA[CDI]]></contract_type>
<work_hours><![CDATA[35 heures]]></work_hours>
<employment_type><![CDATA[Temps-plein]]></employment_type>
<description><![CDATA[Nous recherchons un Développeur Web Fullstack, pour développer une application.]]></description>
<position><![CDATA[Nous recherchons un(e) développeur(se) web fullstack passionné(e) pour rejoindre notre équipe dynamique. Vous participerez à la conception et au développement d'applications web innovantes pour des clients internationaux.]]></position>
<profile><![CDATA[Vous avez une expérience de 3 ans minimum en PHP, JavaScript et frameworks modernes. Vous aimez travailler en équipe et relever de nouveaux défis.]]></profile>
<location><![CDATA[Paris]]></location>
<postcode><![CDATA[75001]]></postcode>
<region><![CDATA[Île-de-France]]></region>
<country><![CDATA[France]]></country>
<subsidiary><![CDATA[Agence Web]]></subsidiary>
<url><![CDATA[https://www.exemple.com/offre]]></url>
<salary><![CDATA[27400€/an]]></salary>
<salary_min></salary_min>
<salary_max></salary_max>
<rome><![CDATA[M1805]]></rome>
<available><![CDATA[1]]></available>
<experience><![CDATA[Débutant accepté]]></experience>
<company_logo_url><![CDATA[https://www.exemple.com/logo.png]]></company_logo_url>
<posted_via><![CDATA[My Company]]></posted_via>
</job>
<job>
<id><![CDATA[4M0123456N43N26]]></id>
<date><![CDATA[{date}]]></date>
<valid_through><![CDATA[{validThrough}]]></valid_through>
<title><![CDATA[Ingénieur DevOps - H/F]]></title>
<contract_type><![CDATA[CDI]]></contract_type>
<work_hours><![CDATA[35 heures]]></work_hours>
<employment_type><![CDATA[Temps-plein]]></employment_type>
<description><![CDATA[Dans le cadre de notre croissance, nous recherchons un ingénieur DevOps pour renforcer notre équipe technique.]]></description>
<position><![CDATA[Vous participerez à l’automatisation, au déploiement et à la supervision des infrastructures cloud de nos clients.]]></position>
<profile><![CDATA[Connaissances solides en CI/CD, conteneurs (Docker/Kubernetes) et scripts d’automatisation (Bash, Python).]]></profile>
<location><![CDATA[Lyon]]></location>
<postcode><![CDATA[69000]]></postcode>
<region><![CDATA[Auvergne-Rhône-Alpes]]></region>
<country><![CDATA[France]]></country>
<subsidiary><![CDATA[Pôle Infrastructure]]></subsidiary>
<url><![CDATA[https://www.exemple.com/offre-devops]]></url>
<salary></salary>
<salary_min><![CDATA[39500€/an]]></salary_min>
<salary_max><![CDATA[42000€/an]]></salary_max>
<rome><![CDATA[M1810]]></rome>
<available><![CDATA[1]]></available>
<experience><![CDATA[Expérience exigée]]></experience>
<company_logo_url><![CDATA[https://www.exemple.com/logo-devops.png]]></company_logo_url>
<posted_via><![CDATA[My Company]]></posted_via>
</job>
</jobs>";
using (var client = new HttpClient())
{
// Ajout des en-têtes requis
client.DefaultRequestHeaders.Add("Authorization", $"Bearer {apiToken}"); // Token d'authentification
client.DefaultRequestHeaders.Add("Usersecretkey", secretKey); // Clé secrète utilisateur
client.DefaultRequestHeaders.Add("Accept-Language", "fr"); // Langue de la réponse (valeurs possibles : en, fr, es)
client.DefaultRequestHeaders.Add("User-Agent", "EasyJobsClient/1.0"); // Identifiant de l’application appelante (nom + version)
client.DefaultRequestHeaders.Add("X-Client-Lang", "C#"); // Indique au serveur la technologie cliente, afin d’adapter le formatage de la réponse
client.DefaultRequestHeaders.Add("Origin", "https://www.domaine-origine.com"); // Remplacez par l’URL depuis laquelle vous appelez l’API
// Création du corps de la requête (XML avec encodage UTF-8)
var content = new StringContent(xmlData, Encoding.UTF8, "application/xml");
try
{
// Envoi de la requête POST à l’API
var response = await client.PostAsync(endpoint, content);
// Lecture et affichage de la réponse de l’API
var responseContent = await response.Content.ReadAsStringAsync();
Console.WriteLine($"Code de réponse : {response.StatusCode}");
Console.WriteLine("Réponse de l’API :");
Console.WriteLine(responseContent);
}
catch (Exception ex)
{
// Gestion des erreurs réseau ou autres exceptions
Console.WriteLine($"Erreur : {ex.Message}");
}
}
}
}
}
// index.js
// Node.js 18+
/**
* Copiez ce code dans un fichier appelé `index.js`, dans un nouveau dossier sur votre ordinateur.
*
* Ouvrez ce dossier avec un éditeur de code comme Visual Studio Code (VS Code).
*
* Assurez-vous que Node.js est installé sur votre machine. Si ce n’est pas le cas, téléchargez-le ici : https://nodejs.org
*
* Dans le terminal, entrez cette commande pour initialiser :
* > npm install node
*
* Lancez le script depuis le terminal :
* > node index.js
*
* Si tout est correct, la réponse de l’API s’affichera dans la console.
* En cas d’erreur, un message clair s’affichera pour vous aider à corriger.
**/
// Date actuelle
const now = new Date();
// valid_through +30 jours
const validThrough = new Date(now);
validThrough.setDate(validThrough.getDate() + 30);
// Formater en "YYYY-MM-DD HH:mm:ss"
function formatDate(date) {
const pad = n => n.toString().padStart(2, '0');
return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())} ${pad(date.getHours())}:${pad(date.getMinutes())}:${pad(date.getSeconds())}`;
}
const dateFormatted = formatDate(now);
const validThroughFormatted = formatDate(validThrough);
// Données à envoyer (XML)
const xmlData = `<?xml version="1.0" encoding="UTF-8"?>
<jobs>
<job>
<id><![CDATA[4M0123456N43N25]]></id>
<date><![CDATA[${dateFormatted}]]></date>
<valid_through><![CDATA[${validThroughFormatted}]]></valid_through>
<title><![CDATA[Développeur Web Fullstack - H/F]]></title>
<contract_type><![CDATA[CDI]]></contract_type>
<work_hours><![CDATA[35 heures]]></work_hours>
<employment_type><![CDATA[Temps-plein]]></employment_type>
<description><![CDATA[Nous recherchons un Développeur Web Fullstack, pour développer une application.]]></description>
<position><![CDATA[Nous recherchons un(e) développeur(se) web fullstack passionné(e) pour rejoindre notre équipe dynamique. Vous participerez à la conception et au développement d'applications web innovantes pour des clients internationaux.]]></position>
<profile><![CDATA[Vous avez une expérience de 3 ans minimum en PHP, JavaScript et frameworks modernes. Vous aimez travailler en équipe et relever de nouveaux défis.]]></profile>
<location><![CDATA[Paris]]></location>
<postcode><![CDATA[75001]]></postcode>
<region><![CDATA[Île-de-France]]></region>
<country><![CDATA[France]]></country>
<subsidiary><![CDATA[Agence Web]]></subsidiary>
<url><![CDATA[https://www.exemple.com/offre]]></url>
<salary><![CDATA[27400€/an]]></salary>
<salary_min></salary_min>
<salary_max></salary_max>
<rome><![CDATA[M1805]]></rome>
<available><![CDATA[1]]></available>
<experience><![CDATA[Débutant accepté]]></experience>
<company_logo_url><![CDATA[https://www.exemple.com/logo.png]]></company_logo_url>
<posted_via><![CDATA[My Company]]></posted_via>
</job>
<job>
<id><![CDATA[4M0123456N43N26]]></id>
<date><![CDATA[${dateFormatted}]]></date>
<valid_through><![CDATA[${validThroughFormatted}]]></valid_through>
<title><![CDATA[Ingénieur DevOps - H/F]]></title>
<contract_type><![CDATA[CDI]]></contract_type>
<work_hours><![CDATA[35 heures]]></work_hours>
<employment_type><![CDATA[Temps-plein]]></employment_type>
<description><![CDATA[Dans le cadre de notre croissance, nous recherchons un ingénieur DevOps pour renforcer notre équipe technique.]]></description>
<position><![CDATA[Vous participerez à l’automatisation, au déploiement et à la supervision des infrastructures cloud de nos clients.]]></position>
<profile><![CDATA[Connaissances solides en CI/CD, conteneurs (Docker/Kubernetes) et scripts d’automatisation (Bash, Python).]]></profile>
<location><![CDATA[Lyon]]></location>
<postcode><![CDATA[69000]]></postcode>
<region><![CDATA[Auvergne-Rhône-Alpes]]></region>
<country><![CDATA[France]]></country>
<subsidiary><![CDATA[Pôle Infrastructure]]></subsidiary>
<url><![CDATA[https://www.exemple.com/offre-devops]]></url>
<salary></salary>
<salary_min><![CDATA[39500€/an]]></salary_min>
<salary_max><![CDATA[42000€/an]]></salary_max>
<rome><![CDATA[M1810]]></rome>
<available><![CDATA[1]]></available>
<experience><![CDATA[Expérience exigée]]></experience>
<company_logo_url><![CDATA[https://www.exemple.com/logo-devops.png]]></company_logo_url>
<posted_via><![CDATA[My Company]]></posted_via>
</job>
</jobs>`;
const apiToken = "API_TOKEN";
const secretKey = "SECRET_KEY";
async function postJob() {
try {
const response = await fetch("https://api.easyjobs.fr/v1-sandbox/xml/jobs-posting", {
method: "POST",
headers: {
"Authorization": `Bearer ${apiToken}`, // Token d’authentification
"Usersecretkey": secretKey, // Clé secrète utilisateur
"Content-Type": "application/xml", // Format XML
"Accept-Language": "fr", // Langue de la réponse (valeurs possibles : en, fr, es)
"User-Agent": "EasyJobsClient/1.0", // Identifiant de l’application appelante (nom + version)
"X-Client-Lang": "Javascript", // Indique au serveur la technologie cliente, afin d’adapter le formatage de la réponse
"Origin": "https://www.domaine-origine.com" // Remplacez par l’URL depuis laquelle vous appelez l’API
},
body: xmlData
});
const text = await response.text();
if (!response.ok) {
console.error(`Erreur HTTP : ${response.status}`);
}
try {
// Affichage de la réponse de l’API
console.log("Réponse de l’API :", JSON.parse(text));
} catch {
console.log("Réponse de l’API :", text);
}
} catch (error) {
console.error("Erreur lors de l’envoi de la requête :", error.message);
}
}
postJob();
Code HTTP | Signification | Description |
---|---|---|
201 | Created | Requête traitée avec succès. |
400 | Bad Request | Données invalides ou mal formées (exemple : champ manquant ou format incorrect). |
403 | Forbidden | Authentification échouée (jeton ou clé invalide), ou origine non autorisée. |
405 | Method Not Allowed | Méthode non autorisée (exemple : PUT au lieu de POST). |
500 | Internal Server Error | Erreur inattendue côté serveur. Contactez le support si nécessaire. |
Code | Message | Cause probable |
---|---|---|
400 | Le champ 'title' est obligatoire. | Le champ requis title est manquant. |
400 | Le champ 'date' doit avoir un format valide : YYYY-MM-DD HH:mm:ss | Format de date invalide. |
403 | Non autorisé. Jeton invalide. | Jeton d’authentification incorrect ou expiré. |
403 | Origine non autorisée. | L’en-tête Origin est manquant ou non autorisé. |
405 | Méthode non autorisée. | Méthode HTTP incorrecte (exemple : PUT au lieu de POST). |
500 | Erreur interne du serveur. | Problème inattendu côté serveur. |
Veillez à vérifier et valider les données envoyées avant l’envoi de la requête pour limiter les erreurs. En cas de doute, consultez la documentation des erreurs.