Documentation API

Conformément à l'article 6.2 de la rubrique API des Conditions Générales d'Utilisation de la plateforme 1élève1stage, l'utilisateur de l'API engage sa responsabilité par rapport aux offres qu'il publie sur la plateforme.

Pour diffuser des offres sur la plateforme 1élève1stage, une API est mise à disposition pour les associations, les collectivités, les ministères et les partenaires.

Il s'agit d'une API REST qui permet les opérations suivantes :

  • Ajouter une offre de stage sur 1élève1stage
  • Modifier une offre de stage sur 1élève1stage
  • Supprimer une offre de stage sur 1élève1stage
  • Récupérer ses offres de stage postées sur 1élève1stage
  • Rechercher des offres de stage sur 1élève1stage

Quelle version utiliser ?

L'API V2 est la version recommandée pour toute nouvelle intégration : authentification JWT, offres pour les classes de quatrième, troisième et seconde, semaines au format ISO 8601. L'API V1, limitée aux offres de seconde générale et technologique avec un token statique, reste disponible pour les intégrations existantes.

Environnements

L'API est disponible sur /api/v2 sur les environnements de pré-production et de production, soit les URL de base suivantes :

  • En pré-production : https://staging.1eleve1stage.education.gouv.fr/api/v2
  • En production : https://1eleve1stage.education.gouv.fr/api/v2

Dans les exemples ci-dessous, $BASE_URL désigne l'URL de base de l'environnement utilisé.

Authentification

Les API sont ouvertes uniquement aux acteurs concernés.

Créer un compte API

Merci d'effectuer une demande par mail pour créer un compte API. Le compte est différent selon l'environnement de pré-production ou de production.

L'authentification se fait par token via le header HTTP Authorization: Bearer #{token}. Ce token devra être présent à chaque requête.

L'utilisation est limitée à 100 appels par minute, au-delà une erreur 429 est renvoyée.

Vous avez la possibilité, lors de la création de votre compte, de préciser si vous souhaitez que l'ensemble de vos offres soient retournées via la fonction recherche de l'API pour les autres partenaires. Par défaut, toutes les offres sont publiques et visibles par les autres partenaires utilisant l'API.

Comment récupérer mon token d'authentification

Un token d'authentification est nécessaire pour accéder aux endpoints de l'API. Nous utilisons des JWT pour l'authentification, valables 24 heures.

POST$BASE_URL/auth/login

Paramètres de body :

  • email (chaîne, obligatoire)
  • password (chaîne, obligatoire)

Exemple curl

curl -H "Content-Type: application/json" \
     -X POST \
     -d '{"email": "votre-email@example.com", "password": "votre-mot-de-passe"}' \
     $BASE_URL/auth/login

Exemple de réponse :

{
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MTc5MzIwMzksInN1YiI6IjEifQ.687468746874687468746874687468746874"
}

Structures de données et référentiels

Offres de stage

Les offres de stage décrites ci-dessous sont réservées aux classes de quatrième , troisième et seconde générale et technologique . La colonne « À la création » indique si l'attribut est obligatoire lors de la création d'une offre.

Attributs d'une offre de stage
AttributTypeÀ la créationDescription
titleChaîne, 150 caractères max.ObligatoireTitre de l'offre de stage
descriptionTexte, 1 500 caractères max.ObligatoireDescription de l'offre de stage
employer_nameChaîne, 150 caractères max.ObligatoireNom de l'entreprise proposant le stage
employer_descriptionChaîne, 275 caractères max.ObligatoireDescription de l'entreprise proposant le stage
employer_websiteChaîne, 560 caractères max.OptionnelLien web vers le site de l'entreprise proposant le stage
siretChaîne, 14 chiffresOptionnelNuméro SIRET de l'entreprise proposant le stage
streetTexte, 500 caractères max.OptionnelNom de la rue où se déroule le stage
zipcodeChaîne, 5 caractères max.ObligatoireCode postal où se déroule le stage
cityChaîne, 50 caractères max.ObligatoireNom de la commune où se déroule le stage
coordinatesObjetOptionnelCoordonnées géographiques du lieu du stage, ex. {"latitude": 48.86, "longitude": 2.33}
sector_uuidChaîneObligatoireIdentifiant unique du secteur d'activité, voir référentiel
weeksTableau de chaînesObligatoireSemaines pendant lesquelles l'offre est accessible, voir référentiel
gradesTableau de chaînesObligatoireNiveaux scolaires pour lesquels l'offre est accessible, voir référentiel
daily_hoursObjetOptionnelHoraires de chaque journée de stage, voir référentiel
lunch_breakTexte, entre 11 et 500 caractèresOptionnelDétail de la pause déjeuner
remote_idChaîneObligatoireIdentifiant unique de l'offre côté opérateur / collectivité / association
permalinkURL, 200 caractères max.ObligatoireLien de redirection pour renvoyer vers l'offre sur le site du partenaire
max_candidatesEntierOptionnelNombre de candidats possible sur ce stage
published_atDatetime ISO 8601OptionnelDate de publication de l'offre (null = offre dépubliée)
is_publicBooléenOptionnelSecteur public ou privé
repBooléenOptionnelOffre réservée aux collégiens d'un établissement classé REP ou REP+
qpvBooléenOptionnelOffre réservée aux lycéens d'un établissement situé à proximité d'un quartier prioritaire de la ville

Semaines

Les stages se faisant sur des cycles hebdomadaires de travail (du lundi au vendredi), cette information est codifiée selon la norme ISO 8601.

Exemple : 2025-W20 correspond à l'année 2025, semaine numéro 20, du 12 au 18 mai 2025.

Exemple de ce que nous attendons dans nos API :

internship_offer.weeks: ["2025-W20", "2025-W21", "2025-W22"]

Secteurs d'activité

L'API attend en paramètre obligatoire un secteur d'activité associé à une offre. Voici la liste ainsi que leurs identifiants uniques.

Secteurs d'activité et leurs identifiants uniques
Secteur d'activitéIdentifiant unique
Agricultures51
Agroéquipements1
Architecture, urbanisme et paysages2
Armée - Défenses3
Art et designs4
Artisanat d'arts5
Arts du spectacles6
Audiovisuels7
Automobiles8
Banque et assurances9
Bâtiment et travaux publics (BTP)s10
Bien-êtres11
Commerce et distributions12
Communications13
Comptabilité, gestion, ressources humainess14
Conseil et audits15
Construction aéronautique, ferroviaire et navales16
Culture et patrimoines17
Droit et justices18
Édition, librairie, bibliothèques19
Électroniques20
Énergies21
Enseignements22
Environnements23
Filière boiss24
Fonction publiques25
Hôtellerie, restaurations26
Immobilier, transactions immobilièress27
Industrie alimentaires28
Industrie chimiques29
Industrie, ingénierie industrielles30
Informatique et réseauxs31
Jeu vidéos32
Journalismes33
Logistique et transports34
Maintenances35
Marketing, publicités36
Mécaniques37
Métiers d'arts38
Modes39
Papiers Cartonss40
Paramédicals41
Recherches42
Santés43
Sécurités44
Services postauxs45
Socials46
Sports47
Tourismes48
Traduction, interprétations49
Verre, béton, céramiques50

Exemple de ce que nous attendons dans nos API :

internship_offer.sector_uuid: "s33"

Niveaux scolaires

Les offres de stage peuvent être proposées pour trois niveaux scolaires différents : quatrième, troisième et seconde. Voici les identifiants uniques associés à chaque niveau :

  • quatrième : quatrieme
  • troisième : troisieme
  • seconde : seconde

Attention : il est impossible d'associer seconde avec troisieme ou quatrieme.

Exemple de ce que nous attendons dans nos appels API :

internship_offer.grades: ["troisieme", "quatrieme"]

ou

internship_offer.grades: ["seconde"]

Horaires quotidiens

Les stages se déroulant sur une semaine du lundi au vendredi, il est possible de préciser les horaires de chaque journée de la façon suivante :

{ JOUR: [HEURE_DEBUT, HEURE_FIN] }

Exemple de ce que nous attendons dans nos API :

internship_offer.daily_hours: {
  "lundi": ["8:30", "17:00"],
  "mardi": ["8:30", "17:00"],
  "mercredi": ["8:30", "17:00"],
  "jeudi": ["8:30", "17:00"],
  "vendredi": ["8:30", "17:00"]
}

Gestion d'erreurs

Les erreurs de requête sont signalées via un code HTTP supérieur ou égal à 400. Sur chaque requête, on pourra avoir les erreurs suivantes :

Codes d'erreur communs à tous les endpoints
CodeSignification
400 Bad RequestParamètres de requête mal renseignés. Exemple : secteur non indiqué dans la création d'une offre
401 UnauthorizedToken invalide
403 ForbiddenPas le droit d'effectuer cette requête. Exemple : modification d'une offre qui ne vous appartient pas
422 Unprocessable EntityPayload incorrect (impossible de traiter la requête car le format ne correspond pas), ou donnée invalide
429 Too Many RequestsLe nombre d'appels a dépassé 100 par minute
500 Internal Server ErrorService indisponible

En plus de ces erreurs transverses, les erreurs spécifiques à un appel sont détaillées pour chacun d'entre eux.

Endpoints

Création d'une offre

POST$BASE_URL/internship_offers

Paramètres de body : voir les attributs d'une offre de stage ; les attributs marqués « Obligatoire » sont requis.

Exemple curl

curl -H "Authorization: Bearer $API_TOKEN" \
     -H "Accept: application/json" \
     -H "Content-Type: application/json" \
     -X POST \
     -d '{"internship_offer": {
           "title": "Découverte du métier de développeur web",
           "description": "Venez découvrir le métier de développeur web au sein de notre agence.",
           "employer_name": "ACME",
           "employer_description": "Agence web",
           "employer_website": "https://www.example.com",
           "siret": "11122233300000",
           "street": "128 rue de Brancion",
           "zipcode": "75015",
           "city": "Paris",
           "coordinates": {"latitude": 48.8317, "longitude": 2.3061},
           "sector_uuid": "s31",
           "weeks": ["2026-W25", "2026-W26"],
           "grades": ["seconde"],
           "remote_id": "1234",
           "permalink": "https://www.example.com/stages/1234",
           "max_candidates": 2,
           "is_public": false
         }}' \
     $BASE_URL/internship_offers

Erreurs

  • 409 Conflict : une offre avec le même remote_id existe déjà

Récupérer mes offres

GET$BASE_URL/internship_offers

Exemple curl

curl -H "Authorization: Bearer $API_TOKEN" \
     -H "Accept: application/json" \
     $BASE_URL/internship_offers

Recherche d'offres

GET$BASE_URL/internship_offers/search

Paramètres d'URL :

  • latitude (flottant, optionnel) : latitude du point de recherche
  • longitude (flottant, optionnel) : longitude du point de recherche
  • radius (entier, optionnel) : le rayon de recherche en mètres
  • keyword (chaîne, optionnel) : les mots-clés à rechercher dans le titre et la description des offres

Exemple curl

curl -H "Authorization: Bearer $API_TOKEN" \
     -H "Accept: application/json" \
     "$BASE_URL/internship_offers/search?latitude=44.8624&longitude=-0.5848&radius=10000&keyword=avocat"

Modification d'une offre

PATCH$BASE_URL/internship_offers/$REMOTE_ID

L'offre est identifiée par son remote_id dans l'URL. Tous les attributs d'une offre de stage sont modifiables individuellement, aucun n'est obligatoire.

Note : la dépublication s'opère en passant null dans le paramètre published_at.

Exemple curl

curl -H "Authorization: Bearer $API_TOKEN" \
     -H "Accept: application/json" \
     -H "Content-Type: application/json" \
     -X PATCH \
     -d '{"internship_offer": {"title": "Mon offre de stage", "description": "Description mise à jour"}}' \
     $BASE_URL/internship_offers/$REMOTE_ID

Erreurs

  • 404 Not Found : aucune offre n'a été trouvée avec le remote_id spécifié
  • 422 Unprocessable Entity : aucun paramètre n'a été spécifié pour la modification

Suppression d'une offre

DELETE$BASE_URL/internship_offers/$REMOTE_ID

L'offre est identifiée par son remote_id dans l'URL.

Exemple curl

curl -H "Authorization: Bearer $API_TOKEN" \
     -H "Accept: application/json" \
     -X DELETE \
     $BASE_URL/internship_offers/$REMOTE_ID

Erreurs

  • 404 Not Found : aucune offre n'a été trouvée avec le remote_id spécifié

Environnements

L'API est disponible sur /api/v1 sur les environnements de pré-production et de production, soit les URL de base suivantes :

  • En pré-production : https://stagedeseconde.recette.1jeune1solution.gouv.fr/api/v1
  • En production : https://1eleve1stage.education.gouv.fr/api/v1

Dans les exemples ci-dessous, $BASE_URL désigne l'URL de base de l'environnement utilisé.

Authentification

Les API sont ouvertes uniquement aux acteurs concernés.

Créer un compte API

Merci d'effectuer une demande par mail pour créer un compte API. Une fois le compte créé, le token d'API pourra être récupéré via notre interface web. Il est différent selon l'environnement de pré-production ou de production.

L'authentification se fait par token via le header HTTP Authorization: Bearer #{token}. Ce token devra être présent à chaque requête.

L'utilisation est limitée à 100 appels par minute, au-delà une erreur 429 est renvoyée.

Comment récupérer mon token d'authentification

  1. Se connecter avec votre compte opérateur.
  2. Depuis la page Mon profil, se rendre sur la page API.
  3. Depuis la page API, récupérer le token.

Structures de données et référentiels

Offres de stage

Les offres de stage décrites ci-dessous sont réservées aux classes de seconde générale et technologique . La colonne « À la création » indique si l'attribut est obligatoire lors de la création d'une offre.

Attributs d'une offre de stage
AttributTypeÀ la créationDescription
titleChaîneObligatoireTitre de l'offre de stage
descriptionTexte, 1 500 caractères max.ObligatoireDescription de l'offre de stage
employer_nameChaîneObligatoireNom de l'entreprise proposant le stage
employer_descriptionChaîne, 275 caractères max.ObligatoireDescription de l'entreprise proposant le stage
employer_websiteChaîneOptionnelLien web vers le site de l'entreprise proposant le stage
streetTexteOptionnelNom de la rue où se déroule le stage
zipcodeChaîneObligatoireCode postal où se déroule le stage
cityChaîneObligatoireNom de la commune où se déroule le stage
coordinatesObjetOptionnelCoordonnées géographiques du lieu du stage, ex. {"latitude": 48.86, "longitude": 2.33}
sector_uuidChaîneObligatoireIdentifiant unique du secteur d'activité, voir référentiel
periodEntierObligatoireDurée du stage, voir référentiel
daily_hoursObjetOptionnelHoraires de chaque journée de stage, voir référentiel
lunch_breakTexte, entre 11 et 500 caractèresOptionnelDétail de la pause déjeuner
remote_idChaîneObligatoireIdentifiant unique de l'offre côté opérateur / collectivité / association
permalinkURLObligatoireLien de redirection pour renvoyer vers l'offre sur le site du partenaire
max_candidatesEntierOptionnelNombre de candidats possible sur ce stage
published_atDatetime ISO 8601OptionnelDate de publication de l'offre (null = offre dépubliée)
is_publicBooléenOptionnelSecteur public ou privé

Période de stage

L'API attend en paramètre obligatoire la durée du stage, qui peut être :

Valeurs possibles pour la période de stage
ValeurPériode
0Plein temps - du 16 au 27 juin 2025
1Semaine 1 - du 16 au 20 juin 2025
2Semaine 2 - du 23 au 27 juin 2025

Secteurs d'activité

L'API attend en paramètre obligatoire un secteur d'activité associé à une offre. Voici la liste ainsi que leurs identifiants uniques.

Secteurs d'activité et leurs identifiants uniques
Secteur d'activitéIdentifiant unique
Agricultures51
Agroéquipements1
Architecture, urbanisme et paysages2
Armée - Défenses3
Art et designs4
Artisanat d'arts5
Arts du spectacles6
Audiovisuels7
Automobiles8
Banque et assurances9
Bâtiment et travaux publics (BTP)s10
Bien-êtres11
Commerce et distributions12
Communications13
Comptabilité, gestion, ressources humainess14
Conseil et audits15
Construction aéronautique, ferroviaire et navales16
Culture et patrimoines17
Droit et justices18
Édition, librairie, bibliothèques19
Électroniques20
Énergies21
Enseignements22
Environnements23
Filière boiss24
Fonction publiques25
Hôtellerie, restaurations26
Immobilier, transactions immobilièress27
Industrie alimentaires28
Industrie chimiques29
Industrie, ingénierie industrielles30
Informatique et réseauxs31
Jeu vidéos32
Journalismes33
Logistique et transports34
Maintenances35
Marketing, publicités36
Mécaniques37
Métiers d'arts38
Modes39
Papiers Cartonss40
Paramédicals41
Recherches42
Santés43
Sécurités44
Services postauxs45
Socials46
Sports47
Tourismes48
Traduction, interprétations49
Verre, béton, céramiques50

Exemple de ce que nous attendons dans nos API :

internship_offer.sector_uuid: "s33"

Horaires quotidiens

Les stages se déroulant sur une semaine du lundi au vendredi, il est possible de préciser les horaires de chaque journée de la façon suivante :

{ JOUR: [HEURE_DEBUT, HEURE_FIN] }

Exemple de ce que nous attendons dans nos API :

internship_offer.daily_hours: {
  "lundi": ["8:30", "17:00"],
  "mardi": ["8:30", "17:00"],
  "mercredi": ["8:30", "17:00"],
  "jeudi": ["8:30", "17:00"],
  "vendredi": ["8:30", "17:00"]
}

Gestion d'erreurs

Les erreurs de requête sont signalées via un code HTTP supérieur ou égal à 400. Sur chaque requête, on pourra avoir les erreurs suivantes :

Codes d'erreur communs à tous les endpoints
CodeSignification
400 Bad RequestParamètres de requête mal renseignés. Exemple : secteur non indiqué dans la création d'une offre
401 UnauthorizedToken invalide
403 ForbiddenPas le droit d'effectuer cette requête. Exemple : modification d'une offre qui ne vous appartient pas
422 Unprocessable EntityPayload incorrect (impossible de traiter la requête car le format ne correspond pas), ou donnée invalide
429 Too Many RequestsLe nombre d'appels a dépassé 100 par minute
500 Internal Server ErrorService indisponible

En plus de ces erreurs transverses, les erreurs spécifiques à un appel sont détaillées pour chacun d'entre eux.

Endpoints

Création d'une offre

POST$BASE_URL/internship_offers

Paramètres de body : voir les attributs d'une offre de stage ; les attributs marqués « Obligatoire » sont requis.

Exemple curl

curl -H "Authorization: Bearer $API_TOKEN" \
     -H "Accept: application/json" \
     -H "Content-Type: application/json" \
     -X POST \
     -d '{"internship_offer": {
           "title": "Découverte du métier de développeur web",
           "description": "Venez découvrir le métier de développeur web au sein de notre agence.",
           "employer_name": "ACME",
           "employer_description": "Agence web",
           "employer_website": "https://www.example.com",
           "street": "128 rue de Brancion",
           "zipcode": "75015",
           "city": "Paris",
           "coordinates": {"latitude": 48.8317, "longitude": 2.3061},
           "sector_uuid": "s31",
           "period": 0,
           "remote_id": "1234",
           "permalink": "https://www.example.com/stages/1234",
           "max_candidates": 2,
           "is_public": false
         }}' \
     $BASE_URL/internship_offers

Erreurs

  • 409 Conflict : une offre avec le même remote_id existe déjà

Récupérer mes offres

GET$BASE_URL/internship_offers

Exemple curl

curl -H "Authorization: Bearer $API_TOKEN" \
     -H "Accept: application/json" \
     $BASE_URL/internship_offers

Recherche d'offres

GET$BASE_URL/internship_offers/search

Paramètres d'URL :

  • latitude (flottant, optionnel) : latitude du point de recherche
  • longitude (flottant, optionnel) : longitude du point de recherche
  • radius (entier, optionnel) : le rayon de recherche en mètres
  • keyword (chaîne, optionnel) : les mots-clés à rechercher dans le titre et la description des offres

Exemple curl

curl -H "Authorization: Bearer $API_TOKEN" \
     -H "Accept: application/json" \
     "$BASE_URL/internship_offers/search?latitude=44.8624&longitude=-0.5848&radius=10000&keyword=avocat"

Modification d'une offre

PATCH$BASE_URL/internship_offers/$REMOTE_ID

L'offre est identifiée par son remote_id dans l'URL. Tous les attributs d'une offre de stage sont modifiables individuellement, aucun n'est obligatoire.

Note : la dépublication s'opère en passant null dans le paramètre published_at.

Exemple curl

curl -H "Authorization: Bearer $API_TOKEN" \
     -H "Accept: application/json" \
     -H "Content-Type: application/json" \
     -X PATCH \
     -d '{"internship_offer": {"title": "Mon offre de stage", "description": "Description mise à jour"}}' \
     $BASE_URL/internship_offers/$REMOTE_ID

Erreurs

  • 404 Not Found : aucune offre n'a été trouvée avec le remote_id spécifié
  • 422 Unprocessable Entity : aucun paramètre n'a été spécifié pour la modification

Suppression d'une offre

DELETE$BASE_URL/internship_offers/$REMOTE_ID

L'offre est identifiée par son remote_id dans l'URL.

Exemple curl

curl -H "Authorization: Bearer $API_TOKEN" \
     -H "Accept: application/json" \
     -X DELETE \
     $BASE_URL/internship_offers/$REMOTE_ID

Erreurs

  • 404 Not Found : aucune offre n'a été trouvée avec le remote_id spécifié