Aller au contenu
~/lylylinked

$ 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.

OAuth2client_credentialsRESTSWREtalab

01Ce qui a bougé

Pôle emploi est devenu France Travail, et l'API a changé de forme.

diff --api
 avantmaintenant
Portailpole-emploi.iofrancetravail.io
Jetonentreprise.pole-emploi.frentreprise.francetravail.fr
AppelGET via un proxy PHP externePOST /mee/evenements
Paginationcurseurpage / size

02La démarche

  1. 01

    Obtenir un jeton

    OAuth2 en client_credentials sur entreprise.francetravail.fr, avec le scope api_evenementsv1 evenements. Le jeton vit environ 25 minutes.

  2. 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.

  3. 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.

  4. 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.

  5. 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

1 - le jeton d'accès
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 }
2 - la recherche d'évènements
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": [ … ] }
3 - côté navigateur
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.

corps de POST /mee/evenements
champtypeexemple
dateDebutchaîne AAAA-MM-JJaujourd'hui par défaut
dateFinchaîne AAAA-MM-JJborne haute de la période
departementstableau de codes["83"] pour le Var
typeEvenemententier18 pour « Job dating »
objectifstableau 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.

fiche-api-evenements.pdfarchive
Chargement de la fiche…

La documentation à jour se trouve sur le catalogue de francetravail.io.