- Description et paramètres de l’endpoint
- Mode Sandbox : pour tester en toute sécurité
- Exemple d’une suppression simple (appel direct via URL)
- Réponse attendue
- Tester avec cURL
- Tester avec Postman
- Informations d’authentification requises
- En-têtes HTTP requis
- Exemple complet : Récupération de la liste des offres d’emploi via GET [PHP] (avec cURL)
- Exemple complet Front-end : Liste dynamique d’offres [JavaScript]
- Codes HTTP de réponse possibles
- Messages d’erreur possibles
L’endpoint jobs-list (https://api.easyjobs.fr/v1/jobs-list)
permet de récupérer la liste des offres d’emploi publiées par un utilisateur, via une requête GET. Il prend en charge plusieurs paramètres facultatifs pour affiner les résultats :
page
: Numéro de page (pagination). Valeur par défaut :1
.limit
: Nombre maximum d’offres par page (max.50
, défaut :10
).search
: Mot-clé à rechercher dans le titre ou la description.location
: Nom de la ville ou région pour filtrer les offres par lieu.job_id
: Identifiant unique d’une offre spécifique.date_created
: Date de création de l’offre (YYYY-MM-DD
).last_update
: Date de dernière mise à jour (YYYY-MM-DD
).
L’API renvoie un tableau d’offres d’emploi structurées correspondant aux critères indiqués, ou une erreur claire en cas de problème :
200 OK
si la récupération des offres a réussi.401 Unauthorized
si le jeton d’authentification est manquant ou invalide.403 Forbidden
si la clé secrète est absente ou si l’origine n’est pas autorisée.405 Method Not Allowed
si vous utilisez une méthode autre que GET.500 Internal Server Error
en cas d’erreur inattendue sur le serveur.
Pour plus de détails sur les champs renvoyés dans la réponse, consultez la référence complète des champs.
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.
GET https://api.easyjobs.fr/v1-sandbox/jobs-list?page=2&limit=5&search=developer&location=Paris
Cet exemple illustre une requête GET
vers l’endpoint jobs-list
avec pagination (page 2, 5 résultats), recherche par mot-clé “developer” et filtre de localisation sur “Paris”.
Aucun corps de requête n’est requis. Ajustez les paramètres selon vos besoins pour affiner les résultats.
{
"status": "success",
"jobs": [
{
"id": "4M0123456N43N25",
"title": "Développeur Web Fullstack - H/F",
"location": "Paris",
"date_created": "2025-06-16 10:00:00",
"last_update": "2025-06-18 14:30:00",
"url": "https://api.easyjobs.fr/ui/jobs/details/128/1/128685569580f90d/developpeur-fullstack.html"
},
{
"id": "4M0123456N43N26",
"title": "Ingénieur DevOps - H/F",
"location": "Lyon",
"date_created": "2025-06-15 09:00:00",
"last_update": "2025-06-17 16:45:00",
"url": "https://api.easyjobs.fr/ui/jobs/details/128/1/128685569610aaf2/ingenieur-devops.html"
},
… (8 offres supplémentaires) …
],
"pagination": {
"current_page": 1,
"total_pages": 51,
"total_jobs": 501
}
}
En cas d’erreur, consultez la page Gestion des erreurs.
curl -X GET "https://api.easyjobs.fr/v1/jobs-list?page=1&limit=10&search=développeur" \
-H "Authorization: Bearer <API_TOKEN>" \
-H "Usersecretkey: <SECRET_KEY>" \
-H "Accept-Language: fr" \
-H "User-Agent: EasyJobsClient/1.0" \
-H "X-Client-Lang: <LANGAGE_CLIENT>" \
-H "Origin: https://www.domaine-origine.com"
Exemple de récupération de la première page (10 résultats) filtrés par mot-clé “développeur”. Supprimez ou modifiez les paramètres selon vos besoins.
- Méthode :
GET
- URL :
https://api.easyjobs.fr/v1/jobs-list?page=1&limit=10&search=développeur
- Params (onglet « Params ») :
page
=1
(facultatif)limit
=10
(facultatif, max 50)search
=developer
(facultatif)location
=Paris
(facultatif)job_id
=4M0123456N43N25
(facultatif)date_created
=2025-06-16
(facultatif)last_update
=2025-06-18
(facultatif)
- En-têtes requis :
- Authorization:
Bearer {{API_TOKEN}}
- Usersecretkey:
{{SECRET_KEY}}
- Accept-Language:
fr
- User-Agent:
EasyJobsClient/1.0
- X-Client-Lang:
Postman
- Origin:
https://www.domaine-origine.com
- Authorization:
- Corps (Body) : aucun (GET).
Avant d’exécuter la requête, sélectionnez l’environnement easyjobs—sandbox pour que les variables {{API_TOKEN}}
et {{SECRET_KEY}}
soient automatiquement remplacées.
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.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.
// URL de l’endpoint avec paramètres GET (mode sandbox)
$endpoint = "https://api.easyjobs.fr/v1-sandbox/jobs-list?page=1&limit=10";
// Authentification
$apiToken = "API_TOKEN"; // Token d’authentification Bearer
$secretKey = "SECRET_KEY"; // Clé secrète utilisateur
// Initialisation cURL
$ch = curl_init($endpoint);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer $apiToken", // Token d’authentification
"Usersecretkey: $secretKey", // Clé secrète utilisateur
"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
]);
// Exécution et affichage
$response = curl_exec($ch);
if (curl_errno($ch)) {
echo 'Erreur cURL : ' . curl_error($ch);
} else {
echo 'Réponse de l’API : ' . $response;
}
curl_close($ch);
Cet exemple montre comment intégrer l’endpoint jobs-list
dans une interface JavaScript simple. Vous pouvez copier ce code dans un fichier index.html
, l’héberger sur votre serveur et interagir avec l’API EasyJobs pour afficher une liste paginée d’offres, filtrer par mot-clé et exporter les résultats en JSON ou XML.
Les filtres disponibles sont :
page
: numéro de page à afficher (pagination)limit
: nombre de résultats par page (max 50)search
: mot-clé à rechercher dans le titre ou la descriptionlocation
: ville ou région pour restreindre les résultatsjob_id
: identifiant exact d’une offre spécifiquedate_created
: date de création de l’offre (YYYY-MM-DD
)last_update
: date de dernière mise à jour (YYYY-MM-DD
)
Saisissez vos critères dans le champ “Endpoint”, puis cliquez sur Consulter pour interroger l’API. Ensuite, utilisez les boutons Exporter JSON ou Exporter XML pour récupérer les données dans le format souhaité.
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<title>Liste dynamique d’offres</title>
<style>
.jobs-container {
max-width: 600px;
margin: 0 auto;
}
.job-item {
border: 1px solid #ddd;
padding: 16px;
margin-bottom: 12px;
}
.job-item h3 {
margin: 0 0 8px 0;
}
.job-item p {
margin: 4px 0;
}
.pagination {
margin-top: 10px;
text-align: center;
}
.error-message {
color: red;
text-align: center;
margin-top: 20px;
}
.export-json-btn,
.export-xml-btn {
margin-top: 0px;
display: none; /* Masqué par défaut */
}
.div-input {
padding: 30px 0 0 0;
text-align:center;
}
</style>
</head>
<body>
<div class="div-input">
<!-- Champ de saisie pour modifier dynamiquement l’endpoint -->
<label for="endpointInput">Endpoint:</label>
<input type="text" id="endpointInput" size="70"
value="https://api.easyjobs.fr/v1-sandbox/jobs-list?limit=10&page=1&search=">
<button id="fetchButton">Consulter</button>
<button id="exportJsonButton" class="export-json-btn">Exporter JSON</button>
<button id="exportXmlButton" class="export-xml-btn">Exporter XML</button>
</div>
<div class="pagination" id="pagination-top"></div>
<div class="jobs-container" id="jobs-container"></div>
<div class="pagination" id="pagination-bottom"></div>
<div class="error-message" id="error-message"></div>
<script>
document.addEventListener('DOMContentLoaded', function() {
const endpointInput = document.getElementById('endpointInput');
const fetchButton = document.getElementById('fetchButton');
const exportJsonButton = document.getElementById('exportJsonButton');
const exportXmlButton = document.getElementById('exportXmlButton');
const container = document.getElementById('jobs-container');
const errorMessage = document.getElementById('error-message');
const paginationTop = document.getElementById('pagination-top');
const paginationBottom = document.getElementById('pagination-bottom');
// En-têtes d’authentification
const headersConfig = {
'Authorization': 'Bearer API_TOKEN',
'Usersecretkey': 'SECRET_KEY',
'Accept': 'application/json',
'Accept-Language': 'fr'
};
// Variable globale pour stocker la dernière réponse de l’API
let lastResponseData = null;
// Fonction pour convertir JSON en XML
function jsonToXml(data) {
let xml = '<response>';
if (data.status) {
xml += `<status>${data.status}</status>`;
}
// jobs (array)
if (Array.isArray(data.jobs)) {
xml += '<jobs>';
data.jobs.forEach(job => {
xml += '<job>';
if (job.id) xml += `<id>${job.id}</id>`;
if (job.title) xml += `<title>${job.title}</title>`;
if (job.location) xml += `<location>${job.location}</location>`;
if (job.date_created) xml += `<date_created>${job.date_created}</date_created>`;
if (job.last_update) xml += `<last_update>${job.last_update}</last_update>`;
if (job.friendly_url) xml += `<friendly_url>${job.friendly_url}</friendly_url>`;
if (job.url) xml += `<url>${job.url}</url>`;
xml += '</job>';
});
xml += '</jobs>';
}
// pagination (objet)
if (data.pagination) {
xml += '<pagination>';
if (data.pagination.current_page) {
xml += `<current_page>${data.pagination.current_page}</current_page>`;
}
if (data.pagination.total_pages) {
xml += `<total_pages>${data.pagination.total_pages}</total_pages>`;
}
if (data.pagination.total_jobs) {
xml += `<total_jobs>${data.pagination.total_jobs}</total_jobs>`;
}
xml += '</pagination>';
}
xml += '</response>';
return xml;
}
// Fonction pour récupérer et afficher les offres
function fetchJobs() {
const url = endpointInput.value.trim();
container.innerHTML = '';
paginationTop.innerHTML = '';
paginationBottom.innerHTML = '';
errorMessage.textContent = '';
exportJsonButton.style.display = 'none';
exportXmlButton.style.display = 'none';
fetch(url, {
method: 'GET',
headers: headersConfig
})
.then(response => {
if (!response.ok) {
throw new Error('Erreur lors de la récupération des données de l’API : ' + response.status);
}
return response.json();
})
.then(data => {
console.log('Réponse de l’API :', data);
if (!data || data.status !== 'success') {
throw new Error('L’API n’a pas renvoyé les données attendues');
}
// Stocker la réponse dans la variable globale
lastResponseData = data;
// Afficher les boutons d’export (JSON, XML)
exportJsonButton.style.display = 'inline-block';
exportXmlButton.style.display = 'inline-block';
const jobs = data.jobs || [];
if (jobs.length === 0) {
container.innerHTML = '<p>Aucune offre disponible.</p>';
return;
}
// Afficher les offres d’emploi
jobs.forEach(job => {
const jobItem = document.createElement('div');
jobItem.classList.add('job-item');
const titleElem = document.createElement('h3');
titleElem.textContent = job.title || 'Sans titre';
const locationElem = document.createElement('p');
locationElem.textContent = 'Localisation : ' + (job.location || 'Inconnue');
const dateElem = document.createElement('p');
dateElem.textContent = 'Date de création : ' + (job.date_created || 'N/A');
const linkElem = document.createElement('a');
linkElem.href = job.url || '#';
linkElem.textContent = 'Voir l’offre';
linkElem.target = '_blank';
jobItem.appendChild(titleElem);
jobItem.appendChild(locationElem);
jobItem.appendChild(dateElem);
jobItem.appendChild(linkElem);
container.appendChild(jobItem);
});
// Afficher la pagination (en haut et en bas)
if (data.pagination) {
const currentPage = data.pagination.current_page;
const totalPages = data.pagination.total_pages;
const totalJobs = data.pagination.total_jobs;
const paginationHTML = `
<p>Page ${currentPage} sur ${totalPages}</p>
<p>Total d’offres : ${totalJobs}</p>
`;
paginationTop.innerHTML = paginationHTML;
paginationBottom.innerHTML = paginationHTML;
}
})
.catch(error => {
console.error('Erreur détectée :', error);
errorMessage.textContent = error.message;
});
}
// Fonction pour exporter en JSON
function exportToJson() {
if (!lastResponseData) {
alert('Aucune donnée à exporter. Réalisez d’abord une recherche.');
return;
}
const jsonStr = JSON.stringify(lastResponseData, null, 2);
const blob = new Blob([jsonStr], { type: 'application/json' });
const url = URL.createObjectURL(blob);
// Simuler un clic sur le lien <a> pour télécharger
const link = document.createElement('a');
link.href = url;
link.download = 'export.json';
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
URL.revokeObjectURL(url);
}
// Fonction pour exporter en XML
function exportToXml() {
if (!lastResponseData) {
alert('Aucune donnée à exporter. Réalisez d’abord une recherche.');
return;
}
const xmlStr = jsonToXml(lastResponseData);
const blob = new Blob([xmlStr], { type: 'application/xml' });
const url = URL.createObjectURL(blob);
// Simuler un clic sur le lien <a> pour télécharger
const link = document.createElement('a');
link.href = url;
link.download = 'export.xml';
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
URL.revokeObjectURL(url);
}
// Événement pour le bouton “Consulter”
fetchButton.addEventListener('click', fetchJobs);
// Événement pour la touche “Enter” dans le champ de saisie
endpointInput.addEventListener('keydown', function(event) {
if (event.key === 'Enter') {
fetchJobs();
}
});
// Événements pour l’exportation
exportJsonButton.addEventListener('click', exportToJson);
exportXmlButton.addEventListener('click', exportToXml);
});
</script>
</body>
</html>
Code HTTP | Signification | Description |
---|---|---|
200 | OK | Liste des offres récupérée avec succès. |
400 | Bad Request | Paramètres invalides ou mal formés (ex. : page non numérique, limit hors limites, format de date incorrect). |
401 | Unauthorized | Jeton d’authentification manquant ou invalide. |
403 | Forbidden | Clé secrète utilisateur absente ou origine non autorisée. |
405 | Method Not Allowed | Méthode HTTP incorrecte (ex. : POST ou DELETE au lieu de GET). |
500 | Internal Server Error | Erreur inattendue côté serveur. Contactez le support si nécessaire. |
Code | Message | Cause probable |
---|---|---|
400 | Requête invalide. | Paramètres de requête manquants, mal formatés ou hors limites (page, limit, date_created, etc.). |
401 | Non autorisé. Jeton invalide. | Jeton d’authentification manquant, expiré ou incorrect. |
403 | Interdit. Origine non autorisée. | L’en-tête Origin est absent ou ne correspond pas à un domaine autorisé. |
405 | Méthode non autorisée. | Utilisation d’une méthode HTTP autre que GET . |
500 | Erreur interne du serveur. | Exception ou dysfonctionnement inattendu côté serveur. |
Avant d’envoyer une requête de récupération, vérifiez que vos paramètres (page
, limit
, filtres) sont corrects et respectent les plages autorisées (par ex. limit ≤ 50
). Utilisez la pagination et les filtres pour réduire la taille des réponses et optimiser les performances. En cas de doute ou d’erreur, consultez la documentation des erreurs.