API Stretcher Job-Offers

Le moteur d'agrégation d'offres d'emploi médicales en temps réel.

Version 1.3 — Mise à jour quotidienne

Fonctionnement du Flux

L'API Stretcher n'est pas une simple base de données statique : elle est produite par une chaîne d'automatisation qui collecte, normalise et publie un fichier JSON unique job-offers.json.

1. Collecte
Des connecteurs récupèrent des offres depuis différentes sources (API, sitemap, pages carrière, etc.).
2. Normalisation
Les champs sont harmonisés, les valeurs manquantes reçoivent des valeurs par défaut, et les doublons sont limités.
3. Enrichissement
La localisation est consolidée (ville/code postal) et des coordonnées GPS peuvent être calculées pour l'affichage cartographique.
4. Publication
Les offres sont regroupées dans un seul tableau JSON, prêt à être consommé immédiatement par vos services.
Bonnes pratiques côté client
Format Le fichier est toujours un tableau d'objets JSON : [ {...}, {...} ].
Tri Utilisez date_publication_unix pour trier les offres de la plus récente à la plus ancienne.
Robustesse Ne cassez jamais votre parsing : un champ peut être vide, mais il est toujours présent.

Structure de l'objet « Offre »

Chaque offre doit respecter cette structure afin de garantir la compatibilité avec les outils de filtrage et d'exploitation.

Clé (Key) Type Description & contenu
idStringIdentifiant unique de l'offre (id natif si disponible, sinon UUID).
titreStringIntitulé exact du poste (ex: Infirmier de Bloc H/F).
code_romeStringCode métier (ROME). Valeur par défaut : NON_DEFINI.
url_offreURLLien direct vers l'offre (page détail / candidature).
descriptionTextContenu de l'annonce : missions, profil, informations pratiques.
date_publication_unixIntegerTimestamp Unix (secondes) pour un tri chronologique précis.
experience_requiseStringNiveau d'expérience (ex: Débutant, 2-5 ans). Défaut : Débutant.
contratStringType de contrat (CDI, CDD, Intérim). Défaut : Non spécifié.
regimeStringRégime (Temps plein/partiel, etc.). Défaut : Non spécifié.
heuresStringVolume horaire (ex: 35h). Défaut : Non spécifié.
salaireString | nullSalaire si présent, sinon null ou « Non mentionné » selon la source.
villeStringVille du poste. Défaut : Inconnu.
code_postalStringCode postal (peut être vide si non disponible).
etablissementStringNom de l'établissement / entité recruteuse (si disponible).
latitudeString | nullLatitude GPS (si calculée/connue), sinon null.
longitudeString | nullLongitude GPS (si calculée/connue), sinon null.
⚠️ Règle de structure : Le fichier JSON doit toujours être un tableau d'objets [...]. Aucun champ ne doit être supprimé, même s'il est vide : utilisez les valeurs par défaut pour éviter de casser les parsers.
Notes de compatibilité

Les champs latitude/longitude peuvent être vides : votre UI doit pouvoir gérer l'absence de géocodage sans erreur.

Le champ date_publication_unix est un entier : évitez les dates ISO côté flux si vous voulez un tri/filtrage performant.

Exemple de sortie JSON

Exemple d'objet (valeurs illustratives) :

[
          {
            "id": "4217591",
            "titre": "Infirmier en SMR en Neuro - CDI - H/F",
            "code_rome": "J1506",
            "url_offre": "https://emploi.domaine.com/fr/annonce/4217591-infirmier-en-smr-en-neuro-cdi-hf-91000-evry-courcouronnes",
            "description": "Nous recherchons actuellement un(e) IDE en SMR en Neuro dans le cadre d'un CDI temps plein[...]",
            "date_publication_unix": 1770908789,
            "experience_requise": "Voir annonce",
            "contrat": "CDI",
            "regime": "Temps plein",
            "heures": "35h",
            "salaire": null,
            "ville": "Évry-Courcouronnes",
            "code_postal": "91000",
            "etablissement": "Clinique Sainte-Marie",
            "latitude": "48.627362",
            "longitude": "2.433066"
        }
    ]
⚠️ Important : Même si une source ne fournit pas certains champs (ex: salaire, GPS), ils doivent rester présents avec une valeur par défaut (null, Non spécifié, etc.).