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/loginExemple 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.
| Attribut | Type | À la création | Description |
|---|---|---|---|
title | Chaîne, 150 caractères max. | Obligatoire | Titre de l'offre de stage |
description | Texte, 1 500 caractères max. | Obligatoire | Description de l'offre de stage |
employer_name | Chaîne, 150 caractères max. | Obligatoire | Nom de l'entreprise proposant le stage |
employer_description | Chaîne, 275 caractères max. | Obligatoire | Description de l'entreprise proposant le stage |
employer_website | Chaîne, 560 caractères max. | Optionnel | Lien web vers le site de l'entreprise proposant le stage |
siret | Chaîne, 14 chiffres | Optionnel | Numéro SIRET de l'entreprise proposant le stage |
street | Texte, 500 caractères max. | Optionnel | Nom de la rue où se déroule le stage |
zipcode | Chaîne, 5 caractères max. | Obligatoire | Code postal où se déroule le stage |
city | Chaîne, 50 caractères max. | Obligatoire | Nom de la commune où se déroule le stage |
coordinates | Objet | Optionnel | Coordonnées géographiques du lieu du stage, ex. {"latitude": 48.86, "longitude": 2.33} |
sector_uuid | Chaîne | Obligatoire | Identifiant unique du secteur d'activité, voir référentiel |
weeks | Tableau de chaînes | Obligatoire | Semaines pendant lesquelles l'offre est accessible, voir référentiel |
grades | Tableau de chaînes | Obligatoire | Niveaux scolaires pour lesquels l'offre est accessible, voir référentiel |
daily_hours | Objet | Optionnel | Horaires de chaque journée de stage, voir référentiel |
lunch_break | Texte, entre 11 et 500 caractères | Optionnel | Détail de la pause déjeuner |
remote_id | Chaîne | Obligatoire | Identifiant unique de l'offre côté opérateur / collectivité / association |
permalink | URL, 200 caractères max. | Obligatoire | Lien de redirection pour renvoyer vers l'offre sur le site du partenaire |
max_candidates | Entier | Optionnel | Nombre de candidats possible sur ce stage |
published_at | Datetime ISO 8601 | Optionnel | Date de publication de l'offre (null = offre dépubliée) |
is_public | Booléen | Optionnel | Secteur public ou privé |
rep | Booléen | Optionnel | Offre réservée aux collégiens d'un établissement classé REP ou REP+ |
qpv | Booléen | Optionnel | Offre 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.
| Secteur d'activité | Identifiant unique |
|---|---|
| Agriculture | s51 |
| Agroéquipement | s1 |
| Architecture, urbanisme et paysage | s2 |
| Armée - Défense | s3 |
| Art et design | s4 |
| Artisanat d'art | s5 |
| Arts du spectacle | s6 |
| Audiovisuel | s7 |
| Automobile | s8 |
| Banque et assurance | s9 |
| Bâtiment et travaux publics (BTP) | s10 |
| Bien-être | s11 |
| Commerce et distribution | s12 |
| Communication | s13 |
| Comptabilité, gestion, ressources humaines | s14 |
| Conseil et audit | s15 |
| Construction aéronautique, ferroviaire et navale | s16 |
| Culture et patrimoine | s17 |
| Droit et justice | s18 |
| Édition, librairie, bibliothèque | s19 |
| Électronique | s20 |
| Énergie | s21 |
| Enseignement | s22 |
| Environnement | s23 |
| Filière bois | s24 |
| Fonction publique | s25 |
| Hôtellerie, restauration | s26 |
| Immobilier, transactions immobilières | s27 |
| Industrie alimentaire | s28 |
| Industrie chimique | s29 |
| Industrie, ingénierie industrielle | s30 |
| Informatique et réseaux | s31 |
| Jeu vidéo | s32 |
| Journalisme | s33 |
| Logistique et transport | s34 |
| Maintenance | s35 |
| Marketing, publicité | s36 |
| Mécanique | s37 |
| Métiers d'art | s38 |
| Mode | s39 |
| Papiers Cartons | s40 |
| Paramédical | s41 |
| Recherche | s42 |
| Santé | s43 |
| Sécurité | s44 |
| Services postaux | s45 |
| Social | s46 |
| Sport | s47 |
| Tourisme | s48 |
| Traduction, interprétation | s49 |
| Verre, béton, céramique | s50 |
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 :
| Code | Signification |
|---|---|
400 Bad Request | Paramètres de requête mal renseignés. Exemple : secteur non indiqué dans la création d'une offre |
401 Unauthorized | Token invalide |
403 Forbidden | Pas le droit d'effectuer cette requête. Exemple : modification d'une offre qui ne vous appartient pas |
422 Unprocessable Entity | Payload incorrect (impossible de traiter la requête car le format ne correspond pas), ou donnée invalide |
429 Too Many Requests | Le nombre d'appels a dépassé 100 par minute |
500 Internal Server Error | Service 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_offersErreurs
-
409 Conflict: une offre avec le mêmeremote_idexiste 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_offersRecherche 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_IDErreurs
-
404 Not Found: aucune offre n'a été trouvée avec leremote_idspé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_IDErreurs
-
404 Not Found: aucune offre n'a été trouvée avec leremote_idspé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
- Se connecter avec votre compte opérateur.
- Depuis la page Mon profil, se rendre sur la page API.
- 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.
| Attribut | Type | À la création | Description |
|---|---|---|---|
title | Chaîne | Obligatoire | Titre de l'offre de stage |
description | Texte, 1 500 caractères max. | Obligatoire | Description de l'offre de stage |
employer_name | Chaîne | Obligatoire | Nom de l'entreprise proposant le stage |
employer_description | Chaîne, 275 caractères max. | Obligatoire | Description de l'entreprise proposant le stage |
employer_website | Chaîne | Optionnel | Lien web vers le site de l'entreprise proposant le stage |
street | Texte | Optionnel | Nom de la rue où se déroule le stage |
zipcode | Chaîne | Obligatoire | Code postal où se déroule le stage |
city | Chaîne | Obligatoire | Nom de la commune où se déroule le stage |
coordinates | Objet | Optionnel | Coordonnées géographiques du lieu du stage, ex. {"latitude": 48.86, "longitude": 2.33} |
sector_uuid | Chaîne | Obligatoire | Identifiant unique du secteur d'activité, voir référentiel |
period | Entier | Obligatoire | Durée du stage, voir référentiel |
daily_hours | Objet | Optionnel | Horaires de chaque journée de stage, voir référentiel |
lunch_break | Texte, entre 11 et 500 caractères | Optionnel | Détail de la pause déjeuner |
remote_id | Chaîne | Obligatoire | Identifiant unique de l'offre côté opérateur / collectivité / association |
permalink | URL | Obligatoire | Lien de redirection pour renvoyer vers l'offre sur le site du partenaire |
max_candidates | Entier | Optionnel | Nombre de candidats possible sur ce stage |
published_at | Datetime ISO 8601 | Optionnel | Date de publication de l'offre (null = offre dépubliée) |
is_public | Booléen | Optionnel | Secteur public ou privé |
Période de stage
L'API attend en paramètre obligatoire la durée du stage, qui peut être :
| Valeur | Période |
|---|---|
0 | Plein temps - du 16 au 27 juin 2025 |
1 | Semaine 1 - du 16 au 20 juin 2025 |
2 | Semaine 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.
| Secteur d'activité | Identifiant unique |
|---|---|
| Agriculture | s51 |
| Agroéquipement | s1 |
| Architecture, urbanisme et paysage | s2 |
| Armée - Défense | s3 |
| Art et design | s4 |
| Artisanat d'art | s5 |
| Arts du spectacle | s6 |
| Audiovisuel | s7 |
| Automobile | s8 |
| Banque et assurance | s9 |
| Bâtiment et travaux publics (BTP) | s10 |
| Bien-être | s11 |
| Commerce et distribution | s12 |
| Communication | s13 |
| Comptabilité, gestion, ressources humaines | s14 |
| Conseil et audit | s15 |
| Construction aéronautique, ferroviaire et navale | s16 |
| Culture et patrimoine | s17 |
| Droit et justice | s18 |
| Édition, librairie, bibliothèque | s19 |
| Électronique | s20 |
| Énergie | s21 |
| Enseignement | s22 |
| Environnement | s23 |
| Filière bois | s24 |
| Fonction publique | s25 |
| Hôtellerie, restauration | s26 |
| Immobilier, transactions immobilières | s27 |
| Industrie alimentaire | s28 |
| Industrie chimique | s29 |
| Industrie, ingénierie industrielle | s30 |
| Informatique et réseaux | s31 |
| Jeu vidéo | s32 |
| Journalisme | s33 |
| Logistique et transport | s34 |
| Maintenance | s35 |
| Marketing, publicité | s36 |
| Mécanique | s37 |
| Métiers d'art | s38 |
| Mode | s39 |
| Papiers Cartons | s40 |
| Paramédical | s41 |
| Recherche | s42 |
| Santé | s43 |
| Sécurité | s44 |
| Services postaux | s45 |
| Social | s46 |
| Sport | s47 |
| Tourisme | s48 |
| Traduction, interprétation | s49 |
| Verre, béton, céramique | s50 |
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 :
| Code | Signification |
|---|---|
400 Bad Request | Paramètres de requête mal renseignés. Exemple : secteur non indiqué dans la création d'une offre |
401 Unauthorized | Token invalide |
403 Forbidden | Pas le droit d'effectuer cette requête. Exemple : modification d'une offre qui ne vous appartient pas |
422 Unprocessable Entity | Payload incorrect (impossible de traiter la requête car le format ne correspond pas), ou donnée invalide |
429 Too Many Requests | Le nombre d'appels a dépassé 100 par minute |
500 Internal Server Error | Service 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_offersErreurs
-
409 Conflict: une offre avec le mêmeremote_idexiste 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_offersRecherche 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_IDErreurs
-
404 Not Found: aucune offre n'a été trouvée avec leremote_idspé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_IDErreurs
-
404 Not Found: aucune offre n'a été trouvée avec leremote_idspécifié