$ man api
Consommer une API publique
L'API « Mes évènements emploi » de France Travail, de l'authentification à l'affichage. Un cas concret d'intégration d'une API d'organisme d'État, en accès libre sous licence Etalab.
01Ce qui a bougé
Pôle emploi est devenu France Travail, et l'API a changé de forme.
| avant | maintenant | |
|---|---|---|
| Portail | pole-emploi.io | francetravail.io |
| Jeton | entreprise.pole-emploi.fr | entreprise.francetravail.fr |
| Appel | GET via un proxy PHP externe | POST /mee/evenements |
| Pagination | curseur | page / size |
02La démarche
- 01
Obtenir un jeton
OAuth2 en client_credentials sur entreprise.francetravail.fr, avec le scope api_evenementsv1 evenements. Le jeton vit environ 25 minutes.
- 02
Le garder en cache
Le jeton est conservé en mémoire côté serveur jusqu'à son expiration, moins une marge d'une minute, plutôt que redemandé à chaque requête.
- 03
Interroger les évènements
POST /partenaire/evenements/v1/mee/evenements, avec les filtres en corps de requête : dates, départements, type, objectifs, secteur.
- 04
Protéger la clé secrète
Identifiant client et clé secrète vivent dans les variables d'environnement, derrière une route d'API Next.js. Le navigateur ne voit jamais le jeton.
- 05
Paginer et mettre en cache
Pagination par page / size, enchaînée côté client avec useSWRInfinite. Les réponses sont mises en cache cinq minutes avec stale-while-revalidate.
03En pratique
POST https://entreprise.francetravail.fr/connexion/oauth2/access_token
?realm=%2Fpartenaire
grant_type=client_credentials
client_id=${FT_CLIENT_ID}
client_secret=${FT_CLIENT_SECRET}
scope=api_evenementsv1 evenements
→ { "access_token": "…", "expires_in": 1499 }POST https://api.francetravail.io/partenaire/evenements/v1
/mee/evenements?page=1&size=6
Authorization: Bearer ${access_token}
Content-Type: application/json
{ "dateDebut": "2026-10-27",
"departements": ["83"],
"typeEvenement": 18 }
→ { "totalElements": 15083, "content": [ … ] }const getKey = (pageIndex, previousPageData) => {
if (previousPageData && pageIndex + 1 > previousPageData.pageMax) {
return null;
}
return `/api/evenements?page=${pageIndex + 1}&size=6`;
};
const { data, size, setSize } = useSWRInfinite(getKey, fetcher);04Les filtres
Les filtres ne sont pas documentés dans le détail : ils ont été vérifiés un par un contre l'API.
| champ | type | exemple |
|---|---|---|
| dateDebut | chaîne AAAA-MM-JJ | aujourd'hui par défaut |
| dateFin | chaîne AAAA-MM-JJ | borne haute de la période |
| departements | tableau de codes | ["83"] pour le Var |
| typeEvenement | entier | 18 pour « Job dating » |
| objectifs | tableau d'entiers | [19] pour « Recrutement » |
Les identifiants de type et d'objectif sont ceux des étiquettes du service grand public, lisibles sur son référentiel ouvert. Ils sont recopiés dans le code plutôt que rechargés à chaque visite : ils bougent rarement, et cela épargne un appel réseau avant l'affichage du formulaire.
La route d'API ne transmet que les valeurs présentes dans ces référentiels. Comme l'API accepte n'importe quel champ sans broncher, un filtre mal orthographié passerait sinon inaperçu, et la liste semblerait simplement ne pas filtrer.
05La fiche API
Document d'époque : il décrit l'ancienne API Évènements Pôle emploi.
La documentation à jour se trouve sur le catalogue de francetravail.io.