openapi: 3.0.3 info: title: API Engagement version: "2.0" description: | API partenaires pour la diffusion et le suivi de missions bénévoles et civiques. ## Authentification Tous les endpoints nécessitent une clé API transmise dans le header "x-api-key". ## Versions - **v0** : endpoints de lecture (recherche de missions, organisations, partenaires diffuseurs) - **v2** : endpoints d'écriture CRUD (création/modification/suppression de missions, suivi des activités) license: name: MIT servers: - url: https://api.api-engagement.beta.gouv.fr description: Production - url: https://api.bac-a-sable.api-engagement.beta.gouv.fr description: Bac à sable - url: http://localhost:3002 description: Développement local security: - ApiKeyAuth: [] tags: - name: Missions x-page-icon: bullseye x-page-description: Recherche et consultation des missions bénévoles (v0) et gestion CRUD pour les annonceurs (v2). description: Recherche et gestion des missions bénévoles - name: Mes missions x-page-icon: list-check x-page-description: Consultation des missions que votre organisation a publiées, avec leurs statistiques d'engagement. description: Consultation des missions publiées par votre organisation - name: Activités x-page-icon: chart-line x-page-description: Déclarez et suivez les événements d'engagement générés depuis vos diffusions (candidatures, créations de compte). description: Suivi des événements d'engagement (candidatures, créations de compte) - name: Organisations x-page-icon: building x-page-description: Consultez et mettez à jour le profil de votre organisation sur la plateforme. description: Recherche et gestion de la diffusion par organisation - name: Partenaires x-page-icon: handshake x-page-description: Liste des partenaires diffuseurs disponibles sur la plateforme API Engagement. description: Liste des partenaires diffuseurs - name: Règles de diffusion x-page-icon: filter x-page-description: Configurez, en tant qu'annonceur, les règles qui déterminent quelles missions sont diffusées vers chacun de vos partenaires diffuseurs. description: Gestion des règles de diffusion des missions vers les diffuseurs # ────────────────────────────────────────────────────────────────────────────── # Components # ────────────────────────────────────────────────────────────────────────────── components: securitySchemes: ApiKeyAuth: type: apiKey in: header name: x-api-key description: Clé API fournie par l'équipe API Engagement schemas: # ── Adresse ──────────────────────────────────────────────────────────────── Address: type: object description: Adresse géographique d'une mission properties: street: type: string nullable: true description: Numéro et nom de rue example: "12 rue de la Paix" postalCode: type: string nullable: true description: Code postal example: "75001" city: type: string nullable: true description: Ville example: "Paris" departmentCode: type: string nullable: true description: Code du département (ex. 75, 69, 2A) example: "75" departmentName: type: string nullable: true description: Nom du département example: "Paris" region: type: string nullable: true description: Nom de la région example: "Île-de-France" country: type: string nullable: true description: Pays (code ISO 3166-1 alpha-2 ou nom) example: "France" # ── Mission (réponse v2) ─────────────────────────────────────────────────── Mission: type: object description: Mission bénévole ou civique example: id: "64a1b2c3d4e5f6789abc0001" clientId: "mission-bénévolat-2024-001" publisherId: "5f5931496c7ea514150a818f" statusCode: "ACCEPTED" title: "Animateur bénévole en maison de retraite" applicationUrl: "https://example.org/missions/001/postuler" domain: "sante" activities: ["animation", "accompagnement"] audience: ["seniors", "personnes-isolees"] remote: "no" schedule: "2 heures par semaine le samedi matin" places: 5 openToMinors: false reducedMobilityAccessible: true addresses: - street: "12 rue de la Paix" zip: "75001" city: "Paris" department: "75" departmentName: "Paris" region: "Île-de-France" country: "France" location: lat: 48.8698 lon: 2.3303 organizationName: "Croix-Rouge française" organizationRNA: "W751206979" organizationSiren: "775672272" organizationSiret: "77567227221138" organizationUrl: "https://www.croix-rouge.fr" createdAt: "2024-01-15T09:00:00.000Z" updatedAt: "2024-03-01T14:30:00.000Z" properties: id: type: string description: Identifiant interne de la mission example: "64a1b2c3d4e5f6789abc0001" clientId: type: string description: Identifiant unique de la mission dans votre système d'information (immuable) example: "mission-2024-001" publisherId: type: string description: Identifiant du partenaire annonceur example: "5f5931496c7ea514150a818f" statusCode: type: string enum: [ACCEPTED, REFUSED, PENDING, ONGOING] description: Statut de modération JeVeuxAider example: "ACCEPTED" statusComment: type: string nullable: true description: Commentaire associé au statut de modération title: type: string description: Titre de la mission example: "Animateur bénévole en maison de retraite" description: type: string description: | Description complète de la mission. Texte brut ou HTML acceptés. La valeur fournie est conservée pour le rendu riche. Si du HTML est fourni, elle est aussi convertie en texte brut pour les usages internes, la recherche et la modération. **Recommandations** : - Utiliser le format HTML pour une meilleure lisibilité lors de la diffusion (sauts de ligne, gras, listes) - Structurer en plusieurs sections pour agréger des informations provenant de champs différents dans votre système - La description est limitée à 20 000 caractères example: "

EN QUELQUES MOTS

Favoriser la mixité au sein du club

VOTRE MISSION DE SERVICE CIVIQUE

Objectifs

Actions

" applicationUrl: type: string nullable: true format: uri description: URL de la page où l'utilisateur sera redirigé pour candidater (URL de la page présentant la mission) example: "https://www.example.org/missions/animateur-maison-retraite" image: type: string nullable: true format: uri description: URL de l'image de la mission. Si absent, l'API Engagement utilise une image de sa bibliothèque selon le domaine. metadata: type: string nullable: true description: Métadonnées libres associées à la mission. domain: type: string nullable: true description: | Domaine d'action de la mission. Valeurs possibles : `animaux`, `autre`, `batiment-industrie-logistique`, `benevolat-competences`, `communication`, `culture-loisirs`, `education`, `emploi`, `environnement`, `gestion-finance-droit`, `humanitaire`, `memoire-et-citoyennete`, `numerique`, `prevention-protection`, `recherche`, `sante`, `service-public-defense-securite`, `sport`, `solidarite-insertion`, `vivre-ensemble`. > Une demande d'ajout de valeur peut être faite auprès de l'équipe API Engagement. example: "sante" activities: type: array items: type: string description: | Activité(s) principale(s) de la mission. Valeurs possibles : `accueil-de-public`, `aide-psychologique`, `activites-manuelles`, `alphabetisation`, `animation`, `Animation, Valorisation`, `art`, `autre`, `bricolage`, `collecte`, `communication`, `comptabilite-finance`, `conseil`, `distribution`, `documentation-traduction`, `ecoute-permanence`, `encadrement-d-equipes`, `enseignement-formation`, `gestion-de-projets`, `gestion-recherche-des-partenariats`, `informatique`, `jardinage`, `juridique`, `logistique`, `lutte-contre-isolement`, `Médiation, Information`, `mentorat-parrainage`, `mission-internationale`, `Préservation, Patrimoine`, `Prévention, Sensibilisation`, `ramassage-dechets`, `recrutement`, `responsabilites-associatives`, `sante-soins`, `Secours, Aide`, `secourisme`, `sensibilisation`, `soins-animaux`, `Soutien, Accompagnement`, `soutien-scolaire`, `sport`, `taches-administratives`, `Transmission, Pédagogie`, `visites`, `operations-militaires`, `sciences-humaines-social`, `restauration-hotellerie`, `maintenance-technique`, `gestion-ressources-humaines`, `gestion-entretien-patrimoine`. > Une demande d'ajout de valeur peut être faite auprès de l'équipe API Engagement. example: ["animation", "lutte-contre-isolement"] tags: type: array items: type: string description: | Mots-clés personnalisés pour taguer la mission. Chaque élément du tableau est un tag distinct. example: ["Ecologie", "Sport", "Solidarité"] audience: type: array items: type: string description: | Les bénéficiaires de la mission — à qui la mission s'adresse, le public auquel sera confronté la personne qui s'engage. example: ["Tous publics"] requirements: type: array items: type: string description: Pré-requis relatifs à la mission. example: ["Niveau d'étude : BAC+2", "Connaissance de langue anglaise"] softSkills: type: array items: type: string description: | Les compétences générales requises pour la mission. Ce champ ne repose pas sur un référentiel de compétence structuré. example: ["Écoute active", "Communication orale"] romeSkills: type: array items: type: string description: | Code OGR Macro du ROME 4.0. Ce champ repose sur le référentiel "Arborescence simplifiée des compétences" (section "Arborescence du ROME"). example: ["300412", "300361"] remote: type: string nullable: true enum: [no, possible, full, local, null] description: "Politique de télétravail. Valeurs possibles : `no` (présentiel uniquement), `possible` (distanciel possible), `full` (100% distanciel), `local` (sur site, à proximité)" example: "no" schedule: type: string nullable: true description: Rythme de la mission (texte libre) example: "2 heures par semaine" startAt: type: string nullable: true format: date-time description: "Date de début de la mission souhaitée. Format ISO 8601. Défaut : now()" example: "2024-09-01T00:00:00.000Z" endAt: type: string nullable: true format: date-time description: "Date de fin de la mission souhaitée. Format ISO 8601. Défaut : now()" example: "2025-06-30T00:00:00.000Z" postedAt: type: string nullable: true format: date-time description: "Date de première publication de la mission. Format ISO 8601." example: "2024-06-15T09:00:00.000Z" places: type: integer nullable: true minimum: 1 default: 1 description: | Nombre de places disponibles pour la mission. Ce nombre doit être mis à jour dès qu'il évolue dans votre système afin que l'API Engagement dispose toujours de la donnée la plus récente. example: 5 compensationAmount: type: number nullable: true description: Montant minimum de l'indemnisation perçue par le bénévole ou le volontaire. Utilisé seul ou comme borne basse d'une fourchette avec `compensationAmountMax`. example: 0 compensationAmountMax: type: number nullable: true description: Montant maximum de l'indemnisation. Si renseigné, `compensationAmount` est la borne basse et `compensationAmountMax` la borne haute (ex. 0–13 €/h). Doit être supérieur ou égal à `compensationAmount`. example: 13 compensationUnit: type: string nullable: true enum: [hour, day, month, year, null] description: "Période de l'indemnisation pour le montant fourni. Valeurs possibles : `year`, `month`, `day`, `hour`" compensationType: type: string nullable: true enum: [gross, net, null] description: "Type d'indemnisation. Valeurs possibles : `gross` (brut), `net` (net)" addresses: type: array items: $ref: "#/components/schemas/Address" description: | Ensemble des localisations où se déroule la mission. Si la mission se tient dans plusieurs lieux, renseignez autant d'objets que de localisations. Pour une mission en lieu unique, le tableau ne contient qu'un seul objet. example: - street: "12 rue de la Paix" postalCode: "75001" city: "Paris" departmentCode: "75" departmentName: "Paris" region: "Île-de-France" country: "France" type: type: string nullable: true enum: [benevolat, volontariat_service_civique, volontariat_sapeurs_pompiers, volontariat_reserve_operationnelle, null] description: Type de mission d'engagement organizationClientId: type: string nullable: true description: Identifiant de l'organisation dans votre système. L'organisation désigne l'entité qui accueille le bénévole ou le volontaire. organizationName: type: string nullable: true description: "Nom de l'organisation. Requis si un autre champ `organization*` est renseigné." example: "Croix-Rouge française" organizationDescription: type: string nullable: true description: Description de l'organisation. organizationUrl: type: string nullable: true format: uri description: Lien de l'organisation (ex. page de présentation sur votre site). organizationType: type: string nullable: true description: Type de l'organisation. example: "Association déclarée" organizationLogo: type: string nullable: true format: uri description: URL de l'image de l'organisation. organizationRNA: type: string nullable: true description: Numéro RNA de l'organisation. Uniquement valable pour les organisations de type association. example: "W353002476" organizationSiren: type: string nullable: true description: SIREN de l'organisation. example: "339863417" organizationSiret: type: string nullable: true description: SIRET de l'organisation. example: "33986341700418" organizationFullAddress: type: string nullable: true description: Adresse de l'organisation. Pas de format strict attendu (contrairement à l'adresse de la mission). organizationPostCode: type: string nullable: true description: Code postal de l'organisation. example: "94170" organizationCity: type: string nullable: true description: Ville de l'organisation. example: "Le Perreux-sur-Marne" organizationStatusJuridique: type: string nullable: true description: Statut juridique de l'organisation. organizationBeneficiaries: type: array items: type: string nullable: true description: Bénéficiaires de l'organisation. organizationActions: type: array items: type: string nullable: true description: Principales actions menées par l'organisation. example: ["Animation", "Valorisation", "Préservation"] organizationReseaux: type: array items: type: string nullable: true description: Réseau de l'organisation. Ce champ sert à renseigner les organisations ayant des antennes locales et dépendant d'un réseau national. createdAt: type: string format: date-time description: Date de création updatedAt: type: string format: date-time description: Date de dernière modification deletedAt: type: string nullable: true format: date-time description: Date de suppression (soft delete) # ── Mission (réponse v2 — avec champs booléens) ──────────────────────────── MissionV2: description: Mission bénévole ou civique (format v2, étend Mission) allOf: - $ref: "#/components/schemas/Mission" - type: object properties: openToMinors: type: boolean nullable: true description: Mission ouverte aux mineurs. reducedMobilityAccessible: type: boolean nullable: true description: Mission accessible aux personnes à mobilité réduite. closeToTransport: type: boolean nullable: true description: Mission proche des transports en commun. # ── Mission (réponse v0 — format legacy) ────────────────────────────────── MissionLegacy: allOf: - $ref: "#/components/schemas/Mission" - type: object description: | Mission au format legacy (v0). Quelques différences par rapport au format v2 : - "openToMinors" et "reducedMobilityAccessible" sont retournés comme chaînes ""true"" / ""false"" - Champs supplémentaires : "_id", "activity" (concaténation), "domainLogo", "publisherName", "publisherUrl", "publisherLogo", "postedAt", "duration", "metadata" - Champ de modération JVA : "moderation_5f5931496c7ea514150a818f_status", "moderation_5f5931496c7ea514150a818f_comment" properties: _id: type: string description: Alias de "id" (compatibilité legacy) openToMinors: type: string nullable: true enum: ["yes", "no", null] description: Ouvert aux mineurs (format string legacy) reducedMobilityAccessible: type: string nullable: true enum: ["yes", "no", null] description: Accessible PMR (format string legacy) activity: type: string nullable: true description: Activités concaténées en une chaîne publisherName: type: string description: Nom du partenaire diffuseur publisherUrl: type: string format: uri description: URL du partenaire diffuseur publisherLogo: type: string format: uri description: Logo du partenaire diffuseur domainLogo: type: string nullable: true format: uri description: Logo du domaine d'action postedAt: type: string nullable: true format: date-time description: Date de première publication duration: type: integer nullable: true description: Durée de la mission en heures location: type: object nullable: true description: Coordonnées géographiques properties: lat: type: number format: double lon: type: number format: double # ── Statistiques d'une mission ──────────────────────────────────────────── MissionStatsBucket: type: object description: Bucket de statistiques par partenaire diffuseur properties: key: type: string description: Identifiant du partenaire diffuseur example: "5f5931496c7ea514150a818f" name: type: string nullable: true description: Nom du partenaire diffuseur example: "JeVeuxAider.gouv.fr" doc_count: type: integer description: Nombre d'événements example: 42 MissionStats: type: object description: Statistiques d'engagement pour une mission, agrégées par partenaire diffuseur properties: clicks: type: array description: Clics vers la mission, par partenaire diffuseur items: $ref: "#/components/schemas/MissionStatsBucket" applications: type: array description: Candidatures enregistrées, par partenaire diffuseur items: $ref: "#/components/schemas/MissionStatsBucket" # ── Activité ────────────────────────────────────────────────────────────── Activity: type: object description: Événement d'engagement (candidature ou création de compte) example: _id: "64a1b2c3d4e5f6789abc0099" type: "apply" status: "PENDING" clickId: "64a1b2c3d4e5f6789abc0050" missionClientId: "mission-bénévolat-2024-001" missionId: "64a1b2c3d4e5f6789abc0001" tag: "homepage" createdAt: "2024-03-15T10:22:00.000Z" properties: _id: type: string description: Identifiant de l'activité example: "64a1b2c3d4e5f6789abc0099" type: type: string enum: [apply, account] description: Type d'événement example: "apply" status: type: string enum: [PENDING, VALIDATED, CANCELED, REFUSED, CARRIED_OUT] description: Statut de la candidature example: "PENDING" clickId: type: string nullable: true description: Identifiant du clic d'origine missionClientId: type: string nullable: true description: Identifiant client de la mission concernée missionId: type: string nullable: true description: Identifiant interne de la mission tag: type: string nullable: true description: Tag libre associé à l'événement createdAt: type: string format: date-time description: Date de création # ── Organisation ────────────────────────────────────────────────────────── Organization: type: object description: Organisation associative ou structure porteuse de missions example: _id: "64a1b2c3d4e5f6789abc0010" title: "Croix-Rouge française" rna: "W751206979" siret: "77567227221138" status: "Association loi 1901" properties: _id: type: string description: Identifiant interne example: "64a1b2c3d4e5f6789abc0010" title: type: string description: Nom de l'organisation example: "Croix-Rouge française" rna: type: string nullable: true description: Numéro RNA (Répertoire National des Associations) example: "W751206979" siret: type: string nullable: true description: Numéro SIRET example: "77567227221138" status: type: string nullable: true description: Forme juridique example: "Association loi 1901" # ── Partenaire diffuseur ─────────────────────────────────────────────────── Partner: type: object description: Partenaire diffuseur de missions example: _id: "5f5931496c7ea514150a818f" name: "JeVeuxAider.gouv.fr" category: "Plateforme gouvernementale" url: "https://www.jeveuxaider.gouv.fr" description: "La plateforme officielle du bénévolat en France" widget: true api: true campaign: false annonceur: false properties: _id: type: string description: Identifiant du partenaire example: "5f5931496c7ea514150a818f" name: type: string description: Nom du partenaire example: "JeVeuxAider.gouv.fr" category: type: string nullable: true description: Catégorie du partenaire url: type: string nullable: true format: uri description: Site web du partenaire logo: type: string nullable: true format: uri description: URL du logo description: type: string nullable: true description: Description du partenaire widget: type: boolean description: Le partenaire dispose de droits widget api: type: boolean description: Le partenaire dispose de droits API campaign: type: boolean description: Le partenaire dispose de droits campagne annonceur: type: boolean description: Le partenaire est annonceur (publie des missions) # ── Partenaire avec exclusions ───────────────────────────────────────────── PartnerWithExclusions: allOf: - $ref: "#/components/schemas/Partner" - type: object properties: excludedOrganizations: type: array description: Organisations exclues de la diffusion vers ce partenaire items: type: object properties: publisherOrganizationId: type: string excludedForDiffuseurId: type: string # ── Partenaire avec statut d'exclusion ──────────────────────────────────── PartnerWithExclusionFlag: allOf: - $ref: "#/components/schemas/Partner" - type: object properties: excluded: type: boolean description: Cette organisation est exclue de la diffusion vers ce partenaire clicks: type: integer description: Nombre de clics vers les missions de cette organisation au cours des 30 derniers jours # ── Règle de diffusion ──────────────────────────────────────────────────── DiffusionRule: type: object description: | Règle de diffusion appliquée aux missions d'un annonceur pour un diffuseur donné. Une mission n'est diffusée vers le diffuseur que si elle satisfait l'ensemble des règles configurées. properties: id: type: string description: Identifiant de la règle example: "9b1c2d3e-4f56-7890-abcd-ef0123456789" field: type: string description: | Champ de la mission évalué par la règle. Valeurs possibles : `type`, `publisherOrganizationId`, `publisherOrganization.clientId`, `publisherOrganization.parentOrganizations`. example: "type" fieldType: type: string nullable: true description: Type de la valeur évaluée (par défaut `string`) example: "string" operator: type: string description: | Opérateur de comparaison. Valeurs possibles : `is`, `is_not`, `contains`, `does_not_contain`, `starts_with`, `is_greater_than`, `is_less_than`, `exists`, `does_not_exist`. example: "is_not" value: type: string description: Valeur comparée au champ de la mission example: "benevolat" # ── Diffuseur avec ses règles ────────────────────────────────────────────── DiffuseurWithRules: type: object description: Partenaire diffuseur associé à l'annonceur, accompagné des règles de diffusion configurées properties: id: type: string description: Identifiant du diffuseur example: "5f5931496c7ea514150a818f" name: type: string description: Nom du diffuseur example: "JeVeuxAider.gouv.fr" logo: type: string nullable: true format: uri description: URL du logo du diffuseur rules: type: array description: Règles de diffusion configurées pour ce diffuseur items: $ref: "#/components/schemas/DiffusionRule" diffuse: type: boolean description: | Présent uniquement lorsque les paramètres `field` et `value` sont fournis. Indique si ce diffuseur diffuserait la valeur recherchée : `false` si une règle d'exclusion (`does_not_contain`, `is_not`, `does_not_exist`) sur ce champ l'exclut, `true` sinon. example: false # ── Erreur ───────────────────────────────────────────────────────────────── Error: type: object properties: ok: type: boolean example: false code: type: string example: "NOT_FOUND" message: description: Détail de l'erreur (peut être un objet Zod ou une chaîne) # ── Réponses réutilisables ────────────────────────────────────────────────── responses: BadRequest: description: Paramètres invalides content: application/json: schema: $ref: "#/components/schemas/Error" examples: invalid_body: value: ok: false code: "INVALID_BODY" message: "clientId is required" invalid_params: value: ok: false code: "INVALID_PARAMS" message: "Invalid path parameter" Unauthorized: description: Clé API manquante ou invalide content: application/json: schema: $ref: "#/components/schemas/Error" example: ok: false code: "UNAUTHORIZED" message: "Unauthorized" NotFound: description: Ressource introuvable content: application/json: schema: $ref: "#/components/schemas/Error" example: ok: false code: "NOT_FOUND" message: "Mission not found" Forbidden: description: Accès refusé content: application/json: schema: $ref: "#/components/schemas/Error" example: ok: false code: "FORBIDDEN" message: "Mission not accessible" Conflict: description: Conflit — la ressource existe déjà content: application/json: schema: $ref: "#/components/schemas/Error" example: ok: false code: "RESSOURCE_ALREADY_EXIST" message: "A mission with this clientId already exists for this publisher" TooManyRequests: description: Limite de débit atteinte headers: X-RateLimit-Limit: schema: type: integer description: Nombre maximum de requêtes par fenêtre X-RateLimit-Remaining: schema: type: integer description: Nombre de requêtes restantes Retry-After: schema: type: integer description: Secondes à attendre avant de réessayer content: application/json: schema: $ref: "#/components/schemas/Error" example: ok: false code: "TOO_MANY_REQUESTS" message: "Rate limit exceeded" # ────────────────────────────────────────────────────────────────────────────── # Paths # ────────────────────────────────────────────────────────────────────────────── paths: # ──────────────────────────────────────────────────────────────────────────── # v2 — Missions # ──────────────────────────────────────────────────────────────────────────── /v2/mission: post: summary: Créer une mission description: | Crée une nouvelle mission pour votre organisation. La mission est immédiatement soumise aux règles de modération automatique : si elle est incomplète (description trop courte, pas d'adresse, etc.), le champ "statusCode" sera positionné à "REFUSED" avec un commentaire explicatif. > **Rate limiting** : endpoint soumis à limitation de débit. operationId: createMission tags: [Missions] requestBody: required: true content: application/json: schema: type: object required: [clientId, title] properties: clientId: type: string description: Identifiant unique de la mission dans votre système d'information (immuable) example: "mission-2024-001" title: type: string description: Titre de la mission example: "Animateur bénévole en maison de retraite" description: type: string description: | Description complète de la mission. Texte brut ou HTML acceptés. La valeur fournie est conservée pour le rendu riche. Si du HTML est fourni, elle est aussi convertie en texte brut pour les usages internes, la recherche et la modération. **Recommandations** : - Utiliser le format HTML pour une meilleure lisibilité lors de la diffusion (sauts de ligne, gras, listes) - Structurer en plusieurs sections pour agréger des informations provenant de champs différents dans votre système - La description est limitée à 20 000 caractères example: "

EN QUELQUES MOTS

Favoriser la mixité au sein du club

VOTRE MISSION DE SERVICE CIVIQUE

Objectifs

Actions

" applicationUrl: type: string format: uri description: URL de la page où l'utilisateur sera redirigé pour candidater (URL de la page présentant la mission) example: "https://www.example.org/missions/animateur-maison-retraite" image: type: string format: uri description: URL de l'image de la mission. Si absent, l'API Engagement utilise une image de sa bibliothèque selon le domaine. metadata: type: string description: Métadonnées libres associées à la mission. domain: type: string description: | Domaine d'action de la mission. Valeurs possibles : `animaux`, `autre`, `batiment-industrie-logistique`, `benevolat-competences`, `communication`, `culture-loisirs`, `education`, `emploi`, `environnement`, `gestion-finance-droit`, `humanitaire`, `memoire-et-citoyennete`, `numerique`, `prevention-protection`, `recherche`, `sante`, `service-public-defense-securite`, `sport`, `solidarite-insertion`, `vivre-ensemble`. > Une demande d'ajout de valeur peut être faite auprès de l'équipe API Engagement. example: "sante" activities: type: array items: type: string description: | Activité(s) principale(s) de la mission. Valeurs possibles : `accueil-de-public`, `aide-psychologique`, `activites-manuelles`, `alphabetisation`, `animation`, `Animation, Valorisation`, `art`, `autre`, `bricolage`, `collecte`, `communication`, `comptabilite-finance`, `conseil`, `distribution`, `documentation-traduction`, `ecoute-permanence`, `encadrement-d-equipes`, `enseignement-formation`, `gestion-de-projets`, `gestion-recherche-des-partenariats`, `informatique`, `jardinage`, `juridique`, `logistique`, `lutte-contre-isolement`, `Médiation, Information`, `mentorat-parrainage`, `mission-internationale`, `Préservation, Patrimoine`, `Prévention, Sensibilisation`, `ramassage-dechets`, `recrutement`, `responsabilites-associatives`, `sante-soins`, `Secours, Aide`, `secourisme`, `sensibilisation`, `soins-animaux`, `Soutien, Accompagnement`, `soutien-scolaire`, `sport`, `taches-administratives`, `Transmission, Pédagogie`, `visites`, `operations-militaires`, `sciences-humaines-social`, `restauration-hotellerie`, `maintenance-technique`, `gestion-ressources-humaines`, `gestion-entretien-patrimoine`. > Une demande d'ajout de valeur peut être faite auprès de l'équipe API Engagement. example: ["animation", "lutte-contre-isolement"] tags: type: array items: type: string description: Mots-clés personnalisés pour taguer la mission. Chaque élément du tableau est un tag distinct. example: ["Ecologie", "Sport", "Solidarité"] audience: type: array items: type: string description: | Les bénéficiaires de la mission — à qui la mission s'adresse, le public auquel sera confronté la personne qui s'engage. example: ["Tous publics"] requirements: type: array items: type: string description: Pré-requis relatifs à la mission. example: ["Niveau d'étude : BAC+2", "Connaissance de langue anglaise"] softSkills: type: array items: type: string description: | Les compétences générales requises pour la mission. Ce champ ne repose pas sur un référentiel de compétence structuré. example: ["Écoute active", "Communication orale"] romeSkills: type: array items: type: string description: | Code OGR Macro du ROME 4.0. Ce champ repose sur le référentiel "Arborescence simplifiée des compétences" (section "Arborescence du ROME"). example: ["300412", "300361"] remote: type: string enum: [no, possible, full, local] description: "Politique de télétravail. Valeurs possibles : `no` (présentiel uniquement), `possible` (distanciel possible), `full` (100% distanciel), `local` (sur site, à proximité)" example: "no" schedule: type: string description: Rythme de la mission (texte libre) example: "2 heures par semaine" startAt: type: string format: date-time description: "Date de début de la mission souhaitée. Format ISO 8601. Défaut : now()" example: "2024-09-01T00:00:00.000Z" endAt: type: string format: date-time description: "Date de fin de la mission souhaitée. Format ISO 8601. Défaut : now()" example: "2025-06-30T00:00:00.000Z" postedAt: type: string format: date-time description: "Date de première publication de la mission. Format ISO 8601." example: "2024-06-15T09:00:00.000Z" places: type: integer minimum: 1 default: 1 description: | Nombre de places disponibles pour la mission. Ce nombre doit être mis à jour dès qu'il évolue dans votre système afin que l'API Engagement dispose toujours de la donnée la plus récente. compensationAmount: type: number description: Montant minimum de l'indemnisation. Utilisé seul ou comme borne basse d'une fourchette avec `compensationAmountMax`. example: 0 compensationAmountMax: type: number description: Montant maximum de l'indemnisation. Si renseigné, doit être supérieur ou égal à `compensationAmount` (ex. 0–13 €/h). example: 13 compensationUnit: type: string enum: [hour, day, month, year] description: "Période de l'indemnisation pour le montant fourni. Valeurs possibles : `year`, `month`, `day`, `hour`" compensationType: type: string enum: [gross, net] description: "Type d'indemnisation. Valeurs possibles : `gross` (brut), `net` (net)" openToMinors: type: boolean description: Mission ouverte aux mineurs. reducedMobilityAccessible: type: boolean description: Mission accessible aux personnes à mobilité réduite. closeToTransport: type: boolean description: Mission proche des transports en commun. addresses: type: array items: $ref: "#/components/schemas/Address" description: | Ensemble des localisations où se déroule la mission. Si la mission se tient dans plusieurs lieux, renseignez autant d'objets que de localisations. Pour une mission en lieu unique, le tableau ne contient qu'un seul objet. example: - street: "12 rue de la Paix" postalCode: "75001" city: "Paris" departmentCode: "75" departmentName: "Paris" region: "Île-de-France" country: "France" type: type: string enum: [benevolat, volontariat_service_civique, volontariat_sapeurs_pompiers, volontariat_reserve_operationnelle] description: Type de mission d'engagement organizationClientId: type: string description: Identifiant de l'organisation dans votre système. L'organisation désigne l'entité qui accueille le bénévole ou le volontaire. organizationName: type: string description: "Nom de l'organisation. Requis si un autre champ `organization*` est renseigné." organizationDescription: type: string description: Description de l'organisation. organizationUrl: type: string format: uri description: Lien de l'organisation (ex. page de présentation sur votre site). organizationType: type: string description: Type de l'organisation. example: "Association déclarée" organizationLogo: type: string format: uri description: URL de l'image de l'organisation. organizationRNA: type: string description: Numéro RNA de l'organisation. Uniquement valable pour les organisations de type association. example: "W353002476" organizationSiren: type: string description: SIREN de l'organisation. example: "339863417" organizationSiret: type: string description: SIRET de l'organisation. example: "33986341700418" organizationFullAddress: type: string description: Adresse de l'organisation. Pas de format strict attendu (contrairement à l'adresse de la mission). organizationPostCode: type: string description: Code postal de l'organisation. example: "94170" organizationCity: type: string description: Ville de l'organisation. example: "Le Perreux-sur-Marne" organizationDepartmentCode: type: string description: Code du département de l'organisation. example: "94" organizationDepartmentName: type: string description: Nom du département de l'organisation. example: "Val de Marne" organizationStatusJuridique: type: string description: Statut juridique de l'organisation. organizationBeneficiaries: type: array items: type: string description: Bénéficiaires de l'organisation. organizationActions: type: array items: type: string description: Principales actions menées par l'organisation. example: ["Animation", "Valorisation", "Préservation"] organizationReseaux: type: array items: type: string description: Réseau de l'organisation. Ce champ sert à renseigner les organisations ayant des antennes locales et dépendant d'un réseau national. responses: "201": description: Mission créée content: application/json: schema: type: object properties: ok: type: boolean example: true data: $ref: "#/components/schemas/MissionV2" "400": $ref: "#/components/responses/BadRequest" "401": $ref: "#/components/responses/Unauthorized" "409": $ref: "#/components/responses/Conflict" "429": $ref: "#/components/responses/TooManyRequests" /v2/mission/{clientId}: put: summary: Modifier une mission description: | Mise à jour partielle d'une mission (sémantique PATCH). Seuls les champs fournis dans le corps sont modifiés. Les règles de modération automatique sont réévaluées sur l'état complet résultant. > **Rate limiting** : endpoint soumis à limitation de débit. operationId: updateMission tags: [Missions] parameters: - name: clientId in: path required: true description: Identifiant de la mission dans votre système schema: type: string example: "mission-2024-001" requestBody: required: true content: application/json: schema: type: object description: Tous les champs sont optionnels — seuls les champs fournis sont mis à jour properties: title: type: string description: Titre de la mission example: "Animateur bénévole en maison de retraite" description: type: string description: | Description complète de la mission. Texte brut ou HTML acceptés. La valeur fournie est conservée pour le rendu riche. Si du HTML est fourni, elle est aussi convertie en texte brut pour les usages internes, la recherche et la modération. **Recommandations** : - Utiliser le format HTML pour une meilleure lisibilité lors de la diffusion (sauts de ligne, gras, listes) - Structurer en plusieurs sections pour agréger des informations provenant de champs différents dans votre système - La description est limitée à 20 000 caractères example: "

EN QUELQUES MOTS

Favoriser la mixité au sein du club

VOTRE MISSION DE SERVICE CIVIQUE

Objectifs

Actions

" applicationUrl: type: string format: uri description: URL de la page où l'utilisateur sera redirigé pour candidater (URL de la page présentant la mission) example: "https://www.example.org/missions/animateur-maison-retraite" image: type: string format: uri description: URL de l'image de la mission. Si absent, l'API Engagement utilise une image de sa bibliothèque selon le domaine. metadata: type: string description: Métadonnées libres associées à la mission. domain: type: string description: | Domaine d'action de la mission. Valeurs possibles : `animaux`, `autre`, `batiment-industrie-logistique`, `benevolat-competences`, `communication`, `culture-loisirs`, `education`, `emploi`, `environnement`, `gestion-finance-droit`, `humanitaire`, `memoire-et-citoyennete`, `numerique`, `prevention-protection`, `recherche`, `sante`, `service-public-defense-securite`, `sport`, `solidarite-insertion`, `vivre-ensemble`. > Une demande d'ajout de valeur peut être faite auprès de l'équipe API Engagement. example: "sante" activities: type: array items: type: string description: | Activité(s) principale(s) de la mission. Valeurs possibles : `accueil-de-public`, `aide-psychologique`, `activites-manuelles`, `alphabetisation`, `animation`, `Animation, Valorisation`, `art`, `autre`, `bricolage`, `collecte`, `communication`, `comptabilite-finance`, `conseil`, `distribution`, `documentation-traduction`, `ecoute-permanence`, `encadrement-d-equipes`, `enseignement-formation`, `gestion-de-projets`, `gestion-recherche-des-partenariats`, `informatique`, `jardinage`, `juridique`, `logistique`, `lutte-contre-isolement`, `Médiation, Information`, `mentorat-parrainage`, `mission-internationale`, `Préservation, Patrimoine`, `Prévention, Sensibilisation`, `ramassage-dechets`, `recrutement`, `responsabilites-associatives`, `sante-soins`, `Secours, Aide`, `secourisme`, `sensibilisation`, `soins-animaux`, `Soutien, Accompagnement`, `soutien-scolaire`, `sport`, `taches-administratives`, `Transmission, Pédagogie`, `visites`, `operations-militaires`, `sciences-humaines-social`, `restauration-hotellerie`, `maintenance-technique`, `gestion-ressources-humaines`, `gestion-entretien-patrimoine`. > Une demande d'ajout de valeur peut être faite auprès de l'équipe API Engagement. example: ["animation", "lutte-contre-isolement"] tags: type: array items: type: string description: Mots-clés personnalisés pour taguer la mission. Chaque élément du tableau est un tag distinct. example: ["Ecologie", "Sport", "Solidarité"] audience: type: array items: type: string description: | Les bénéficiaires de la mission — à qui la mission s'adresse, le public auquel sera confronté la personne qui s'engage. example: ["Tous publics"] requirements: type: array items: type: string description: Pré-requis relatifs à la mission. example: ["Niveau d'étude : BAC+2", "Connaissance de langue anglaise"] softSkills: type: array items: type: string description: | Les compétences générales requises pour la mission. Ce champ ne repose pas sur un référentiel de compétence structuré. example: ["Écoute active", "Communication orale"] romeSkills: type: array items: type: string description: | Code OGR Macro du ROME 4.0. Ce champ repose sur le référentiel "Arborescence simplifiée des compétences" (section "Arborescence du ROME"). example: ["300412", "300361"] remote: type: string enum: [no, possible, full, local] description: "Politique de télétravail. Valeurs possibles : `no` (présentiel uniquement), `possible` (distanciel possible), `full` (100% distanciel), `local` (sur site, à proximité)" example: "no" schedule: type: string description: Rythme de la mission (texte libre) example: "2 heures par semaine" startAt: type: string format: date-time description: "Date de début de la mission souhaitée. Format ISO 8601. Défaut : now()" example: "2024-09-01T00:00:00.000Z" endAt: type: string format: date-time description: "Date de fin de la mission souhaitée. Format ISO 8601. Défaut : now()" example: "2025-06-30T00:00:00.000Z" postedAt: type: string format: date-time description: "Date de première publication de la mission. Format ISO 8601." example: "2024-06-15T09:00:00.000Z" places: type: integer minimum: 1 compensationAmount: type: number description: Montant minimum de l'indemnisation. Utilisé seul ou comme borne basse d'une fourchette avec `compensationAmountMax`. example: 0 compensationAmountMax: type: number description: Montant maximum de l'indemnisation. Si renseigné, doit être supérieur ou égal à `compensationAmount` (ex. 0–13 €/h). example: 13 compensationUnit: type: string enum: [hour, day, month, year] description: "Période de l'indemnisation pour le montant fourni. Valeurs possibles : `year`, `month`, `day`, `hour`" compensationType: type: string enum: [gross, net] description: "Type d'indemnisation. Valeurs possibles : `gross` (brut), `net` (net)" openToMinors: type: boolean description: Mission ouverte aux mineurs. reducedMobilityAccessible: type: boolean description: Mission accessible aux personnes à mobilité réduite. closeToTransport: type: boolean description: Mission proche des transports en commun. addresses: type: array items: $ref: "#/components/schemas/Address" description: | Ensemble des localisations où se déroule la mission. Si la mission se tient dans plusieurs lieux, renseignez autant d'objets que de localisations. Pour une mission en lieu unique, le tableau ne contient qu'un seul objet. example: - street: "12 rue de la Paix" postalCode: "75001" city: "Paris" departmentCode: "75" departmentName: "Paris" region: "Île-de-France" country: "France" type: type: string enum: [benevolat, volontariat_service_civique, volontariat_sapeurs_pompiers, volontariat_reserve_operationnelle] description: Type de mission d'engagement organizationClientId: type: string description: Identifiant de l'organisation dans votre système. L'organisation désigne l'entité qui accueille le bénévole ou le volontaire. organizationName: type: string description: "Nom de l'organisation. Requis si un autre champ `organization*` est renseigné." organizationDescription: type: string description: Description de l'organisation. organizationUrl: type: string format: uri description: Lien de l'organisation (ex. page de présentation sur votre site). organizationType: type: string description: Type de l'organisation. example: "Association déclarée" organizationLogo: type: string format: uri description: URL de l'image de l'organisation. organizationRNA: type: string description: Numéro RNA de l'organisation. Uniquement valable pour les organisations de type association. example: "W353002476" organizationSiren: type: string description: SIREN de l'organisation. example: "339863417" organizationSiret: type: string description: SIRET de l'organisation. example: "33986341700418" organizationFullAddress: type: string description: Adresse de l'organisation. Pas de format strict attendu (contrairement à l'adresse de la mission). organizationPostCode: type: string description: Code postal de l'organisation. example: "94170" organizationCity: type: string description: Ville de l'organisation. example: "Le Perreux-sur-Marne" organizationStatusJuridique: type: string description: Statut juridique de l'organisation. organizationBeneficiaries: type: array items: type: string description: Bénéficiaires de l'organisation. organizationActions: type: array items: type: string description: Principales actions menées par l'organisation. example: ["Animation", "Valorisation", "Préservation"] organizationReseaux: type: array items: type: string description: Réseau de l'organisation. Ce champ sert à renseigner les organisations ayant des antennes locales et dépendant d'un réseau national. responses: "200": description: Mission mise à jour content: application/json: schema: type: object properties: ok: type: boolean example: true data: $ref: "#/components/schemas/MissionV2" "400": $ref: "#/components/responses/BadRequest" "401": $ref: "#/components/responses/Unauthorized" "404": $ref: "#/components/responses/NotFound" "429": $ref: "#/components/responses/TooManyRequests" delete: summary: Supprimer une mission description: | Suppression douce (soft delete) d'une mission. L'opération est idempotente : si la mission est déjà supprimée, la réponse est identique à une suppression réussie. > **Rate limiting** : endpoint soumis à limitation de débit. operationId: deleteMission tags: [Missions] parameters: - name: clientId in: path required: true description: Identifiant de la mission dans votre système schema: type: string example: "mission-2024-001" responses: "200": description: Mission supprimée content: application/json: schema: type: object properties: ok: type: boolean example: true data: type: object properties: clientId: type: string example: "mission-2024-001" deletedAt: type: string format: date-time "400": $ref: "#/components/responses/BadRequest" "401": $ref: "#/components/responses/Unauthorized" "404": $ref: "#/components/responses/NotFound" "429": $ref: "#/components/responses/TooManyRequests" # ──────────────────────────────────────────────────────────────────────────── # v2 — Activités # ──────────────────────────────────────────────────────────────────────────── /v2/activity/{id}: get: summary: Récupérer une activité description: | Récupère une activité (candidature ou création de compte) par son identifiant ou par son "clientEventId". En cas d'ambiguïté (même "clientEventId" pour un "apply" et un "account"), précisez le paramètre "type". operationId: getActivity tags: [Activités] parameters: - name: id in: path required: true description: Identifiant interne ou "clientEventId" de l'activité schema: type: string example: "64a1b2c3d4e5f6789abc0099" - name: type in: query required: false description: Type de l'activité (requis en cas d'ambiguïté sur le "clientEventId") schema: type: string enum: [apply, account] responses: "200": description: Activité trouvée content: application/json: schema: type: object properties: ok: type: boolean example: true data: $ref: "#/components/schemas/Activity" "400": $ref: "#/components/responses/BadRequest" "401": $ref: "#/components/responses/Unauthorized" "404": $ref: "#/components/responses/NotFound" "409": description: Ambiguïté sur le clientEventId — précisez le paramètre "type" content: application/json: schema: $ref: "#/components/schemas/Error" put: summary: Mettre à jour le statut d'une activité description: | Met à jour le statut d'une candidature ou d'une création de compte. Utilisez ce endpoint pour notifier l'API des décisions prises sur les candidatures (validation, refus, annulation, etc.). operationId: updateActivity tags: [Activités] parameters: - name: id in: path required: true description: Identifiant interne ou "clientEventId" de l'activité schema: type: string requestBody: required: true content: application/json: schema: type: object required: [status] properties: status: type: string enum: [PENDING, VALIDATED, CANCELED, REFUSED, CARRIED_OUT] description: Nouveau statut de l'activité example: "VALIDATED" type: type: string enum: [apply, account] description: Type de l'activité (requis en cas d'ambiguïté) responses: "200": description: Activité mise à jour content: application/json: schema: type: object properties: ok: type: boolean example: true data: $ref: "#/components/schemas/Activity" "400": $ref: "#/components/responses/BadRequest" "401": $ref: "#/components/responses/Unauthorized" "404": $ref: "#/components/responses/NotFound" "409": description: Ambiguïté sur le clientEventId — précisez le paramètre "type" content: application/json: schema: $ref: "#/components/schemas/Error" /v2/activity: post: summary: Créer une activité description: | Enregistre un événement d'engagement (candidature ou création de compte) lié à un clic tracé par l'API ou directement à une mission. Le "clickId" doit correspondre à un clic enregistré par l'API Engagement. Le "missionId" permet à un diffuseur autorisé de déclarer une activité sans clic. Le "missionClientId" correspond à l'identifiant métier d'une mission du publisher authentifié. Au moins un champ parmi "clickId", "missionId" et "missionClientId" doit être fourni. Le champ "missionId" ne doit pas être combiné avec "clickId" ou "missionClientId". operationId: createActivity tags: [Activités] requestBody: required: true content: application/json: schema: type: object anyOf: - required: [clickId] - required: [missionId] - required: [missionClientId] not: anyOf: - required: [clickId, missionId] - required: [missionId, missionClientId] properties: type: type: string enum: [apply, account] default: apply description: Type d'événement (défaut "apply") clickId: type: string description: Identifiant du clic d'origine example: "64a1b2c3d4e5f6789abc0088" missionId: type: string description: Identifiant interne API Engagement de la mission, utilisable par un diffuseur autorisé sans clickId example: "64a1b2c3d4e5f6789abc0001" missionClientId: type: string description: Identifiant métier de la mission côté publisher authentifié tag: type: string description: Tag libre (optionnel) responses: "200": description: Activité créée content: application/json: schema: type: object properties: ok: type: boolean example: true data: $ref: "#/components/schemas/Activity" "400": $ref: "#/components/responses/BadRequest" "401": $ref: "#/components/responses/Unauthorized" "403": $ref: "#/components/responses/Forbidden" "404": description: Clic ou mission introuvable content: application/json: schema: $ref: "#/components/schemas/Error" # ──────────────────────────────────────────────────────────────────────────── # v0 — Recherche de missions # ──────────────────────────────────────────────────────────────────────────── /v0/mission: get: summary: Rechercher des missions description: | Retourne les missions diffusées par vos partenaires, filtrées selon vos critères. Les résultats sont limités aux partenaires autorisés pour votre clé API. Les paramètres "activity", "city", "clientId", "country", "departmentName", "domain", "organizationRNA", "organizationStatusJuridique", "publisher", "remote" et "type" acceptent une valeur unique ou un tableau de valeurs (ex. "?domain=sante&domain=education"). operationId: searchMissions tags: [Missions] parameters: - name: limit in: query schema: type: integer minimum: 0 maximum: 10000 default: 25 description: Nombre de résultats (défaut 25, max 10 000) - name: skip in: query schema: type: integer minimum: 0 default: 0 description: Décalage pour la pagination - name: keywords in: query schema: type: string description: Recherche textuelle (titre, description, organisation) example: "cuisine solidaire" - name: domain in: query schema: oneOf: - type: string - type: array items: type: string description: Domaine d'action example: "sante" - name: activity in: query schema: oneOf: - type: string - type: array items: type: string description: Activité proposée - name: type in: query schema: oneOf: - type: string enum: [benevolat, volontariat_service_civique, volontariat_sapeurs_pompiers, volontariat_reserve_operationnelle] - type: array items: type: string enum: [benevolat, volontariat_service_civique, volontariat_sapeurs_pompiers, volontariat_reserve_operationnelle] description: "Type d'engagement" - name: remote in: query schema: oneOf: - type: string - type: array items: type: string description: "Politique de télétravail : no, possible, full, local" - name: lat in: query schema: type: number format: double description: Latitude (requis avec "lon" pour la recherche géographique) example: 48.8566 - name: lon in: query schema: type: number format: double description: Longitude (requis avec "lat" pour la recherche géographique) example: 2.3522 - name: distance in: query schema: type: string description: "Rayon de recherche géographique (ex. 25km, 50km). Défaut : 50km" example: "25km" - name: city in: query schema: oneOf: - type: string - type: array items: type: string description: Filtre par ville - name: departmentName in: query schema: oneOf: - type: string - type: array items: type: string description: Filtre par département example: "Rhône" - name: country in: query schema: oneOf: - type: string - type: array items: type: string description: Filtre par pays - name: clientId in: query schema: oneOf: - type: string - type: array items: type: string description: Filtre par identifiant client - name: publisher in: query schema: oneOf: - type: string - type: array items: type: string description: Filtre sur les identifiants de partenaires diffuseurs - name: organizationRNA in: query schema: oneOf: - type: string - type: array items: type: string description: Filtre par numéro RNA de l'organisation - name: organizationStatusJuridique in: query schema: oneOf: - type: string - type: array items: type: string description: Filtre par forme juridique de l'organisation - name: openToMinors in: query schema: type: string enum: ["true", "false", "yes", "no", "1", "0"] description: Missions ouvertes aux mineurs uniquement - name: reducedMobilityAccessible in: query schema: type: string enum: ["true", "false", "yes", "no", "1", "0"] description: Missions accessibles PMR uniquement - name: startAt in: query schema: type: string description: "Filtre sur la date de début (ex. >2024-01-01, <2024-12-31)" - name: createdAt in: query schema: type: string description: "Filtre sur la date de création (ex. >2024-01-01)" responses: "200": description: Liste de missions content: application/json: schema: type: object properties: ok: type: boolean example: true total: type: integer description: Nombre total de résultats correspondants example: 1234 limit: type: integer example: 25 skip: type: integer example: 0 data: type: array items: $ref: "#/components/schemas/MissionLegacy" "400": $ref: "#/components/responses/BadRequest" "401": $ref: "#/components/responses/Unauthorized" /v0/mission/search: get: summary: Rechercher des missions avec facettes description: | Identique à "GET /v0/mission" mais retourne également des facettes (agrégations) sur les domaines, activités et départements pour faciliter la construction de filtres dynamiques. operationId: searchMissionsWithFacets tags: [Missions] parameters: - name: limit in: query schema: type: integer minimum: 0 maximum: 10000 default: 25 - name: skip in: query schema: type: integer minimum: 0 default: 0 - name: keywords in: query schema: type: string - name: domain in: query schema: oneOf: - type: string - type: array items: type: string - name: activity in: query schema: oneOf: - type: string - type: array items: type: string - name: type in: query schema: oneOf: - type: string - type: array items: type: string - name: remote in: query schema: oneOf: - type: string - type: array items: type: string - name: lat in: query schema: type: number format: double - name: lon in: query schema: type: number format: double - name: distance in: query schema: type: string - name: departmentName in: query schema: oneOf: - type: string - type: array items: type: string - name: openToMinors in: query schema: type: string enum: ["true", "false", "yes", "no", "1", "0"] - name: reducedMobilityAccessible in: query schema: type: string enum: ["true", "false", "yes", "no", "1", "0"] responses: "200": description: Liste de missions avec facettes content: application/json: schema: type: object properties: ok: type: boolean example: true total: type: integer example: 1234 hits: type: array items: $ref: "#/components/schemas/MissionLegacy" facets: type: object description: Agrégations pour les filtres dynamiques properties: domains: type: array items: type: object properties: key: type: string doc_count: type: integer activities: type: array items: type: object properties: key: type: string doc_count: type: integer departmentName: type: array items: type: object properties: key: type: string doc_count: type: integer "400": $ref: "#/components/responses/BadRequest" "401": $ref: "#/components/responses/Unauthorized" /v0/mission/{id}: get: summary: Récupérer une mission par ID operationId: getMission tags: [Missions] parameters: - name: id in: path required: true description: Identifiant interne de la mission schema: type: string example: "64a1b2c3d4e5f6789abc0001" responses: "200": description: Mission trouvée content: application/json: schema: type: object properties: ok: type: boolean example: true data: $ref: "#/components/schemas/MissionLegacy" "400": $ref: "#/components/responses/BadRequest" "401": $ref: "#/components/responses/Unauthorized" "404": $ref: "#/components/responses/NotFound" # ──────────────────────────────────────────────────────────────────────────── # v0 — Mes missions # ──────────────────────────────────────────────────────────────────────────── /v0/mymission: get: summary: Lister mes missions description: Retourne toutes les missions publiées par votre organisation. operationId: listMyMissions tags: [Mes missions] parameters: - name: limit in: query schema: type: integer minimum: 0 maximum: 10000 default: 50 description: Nombre de résultats (défaut 50, max 10 000) - name: skip in: query schema: type: integer minimum: 0 default: 0 description: Décalage pour la pagination responses: "200": description: Liste de missions content: application/json: schema: type: object properties: ok: type: boolean example: true total: type: integer example: 42 limit: type: integer example: 50 skip: type: integer example: 0 data: type: array items: $ref: "#/components/schemas/MissionLegacy" "400": $ref: "#/components/responses/BadRequest" "401": $ref: "#/components/responses/Unauthorized" /v0/mymission/{clientId}: get: summary: Récupérer une mission avec ses statistiques description: Retourne une mission identifiée par son "clientId" ainsi que ses statistiques d'engagement (clics, candidatures, créations de compte). operationId: getMyMission tags: [Mes missions] parameters: - name: clientId in: path required: true description: Identifiant de la mission dans votre système schema: type: string example: "mission-2024-001" responses: "200": description: Mission avec statistiques content: application/json: schema: type: object properties: ok: type: boolean example: true data: allOf: - $ref: "#/components/schemas/MissionLegacy" - type: object properties: stats: $ref: "#/components/schemas/MissionStats" "400": $ref: "#/components/responses/BadRequest" "401": $ref: "#/components/responses/Unauthorized" "404": $ref: "#/components/responses/NotFound" /v0/mymission/{clientId}/stats: get: summary: Récupérer les statistiques d'une mission description: Retourne uniquement les statistiques d'engagement d'une mission (clics, candidatures, créations de compte). operationId: getMyMissionStats tags: [Mes missions] parameters: - name: clientId in: path required: true description: Identifiant de la mission dans votre système schema: type: string example: "mission-2024-001" responses: "200": description: Statistiques de la mission content: application/json: schema: type: object properties: ok: type: boolean example: true data: $ref: "#/components/schemas/MissionStats" "400": $ref: "#/components/responses/BadRequest" "401": $ref: "#/components/responses/Unauthorized" "404": $ref: "#/components/responses/NotFound" # ──────────────────────────────────────────────────────────────────────────── # v0 — Organisations # ──────────────────────────────────────────────────────────────────────────── /v0/organization: get: summary: Rechercher des organisations description: | Recherche des organisations par nom, numéro RNA ou SIRET. Au moins un critère de recherche est recommandé. operationId: searchOrganizations tags: [Organisations] parameters: - name: q in: query schema: type: string description: Recherche textuelle sur le nom example: "Croix-Rouge" - name: rna in: query schema: type: string description: Numéro RNA exact example: "W751206979" - name: siret in: query schema: type: string description: Numéro SIRET exact example: "77567227221138" - name: limit in: query schema: type: integer minimum: 0 maximum: 100 default: 25 description: Nombre de résultats (défaut 25, max 100) - name: skip in: query schema: type: integer minimum: 0 default: 0 description: Décalage pour la pagination responses: "200": description: Liste d'organisations content: application/json: schema: type: object properties: ok: type: boolean example: true data: type: array items: $ref: "#/components/schemas/Organization" "400": $ref: "#/components/responses/BadRequest" "401": $ref: "#/components/responses/Unauthorized" /v0/myorganization/{organizationClientId}: get: summary: Consulter la diffusion d'une organisation description: | Retourne la liste des partenaires diffuseurs éligibles, avec pour chacun : - le nombre de clics vers les missions de cette organisation sur les 30 derniers jours - l'indicateur d'exclusion éventuelle Utile pour piloter la stratégie de diffusion d'une organisation. operationId: getOrganizationDiffusion tags: [Organisations] parameters: - name: organizationClientId in: path required: true description: Identifiant de l'organisation dans votre système schema: type: string example: "org-croix-rouge-001" responses: "200": description: Liste des partenaires diffuseurs avec statut d'exclusion content: application/json: schema: type: object properties: ok: type: boolean example: true total: type: integer example: 8 data: type: array items: $ref: "#/components/schemas/PartnerWithExclusionFlag" "400": $ref: "#/components/responses/BadRequest" "401": $ref: "#/components/responses/Unauthorized" "404": $ref: "#/components/responses/NotFound" put: summary: Gérer les exclusions de diffusion d'une organisation description: | Définit la liste des partenaires diffuseurs **autorisés** pour une organisation. Les partenaires non inclus dans "publisherIds" seront exclus de la diffusion. > **Attention** : cette opération remplace intégralement les exclusions existantes. operationId: updateOrganizationDiffusion tags: [Organisations] parameters: - name: organizationClientId in: path required: true description: Identifiant de l'organisation dans votre système schema: type: string example: "org-croix-rouge-001" requestBody: required: true content: application/json: schema: type: object required: [publisherIds] properties: organizationName: type: string nullable: true description: Nom de l'organisation (optionnel, mis à jour si fourni) example: "Croix-Rouge française" publisherIds: type: array items: type: string description: Liste des identifiants des partenaires **autorisés** à diffuser les missions de cette organisation example: ["5f5931496c7ea514150a818f", "60a1b2c3d4e5f6789abc0001"] responses: "200": description: Exclusions mises à jour content: application/json: schema: type: object properties: ok: type: boolean example: true total: type: integer example: 8 data: type: array description: Liste complète des partenaires avec leur statut d'exclusion mis à jour items: $ref: "#/components/schemas/PartnerWithExclusionFlag" "400": $ref: "#/components/responses/BadRequest" "401": $ref: "#/components/responses/Unauthorized" # ──────────────────────────────────────────────────────────────────────────── # v0 — Partenaires diffuseurs # ──────────────────────────────────────────────────────────────────────────── /v0/publisher: get: summary: Lister les partenaires diffuseurs description: | Retourne la liste des partenaires diffuseurs qui diffusent vos missions, avec les exclusions d'organisations éventuellement configurées. operationId: listPartners tags: [Partenaires] responses: "200": description: Liste des partenaires diffuseurs content: application/json: schema: type: object properties: ok: type: boolean example: true total: type: integer example: 12 data: type: array items: $ref: "#/components/schemas/PartnerWithExclusions" "401": $ref: "#/components/responses/Unauthorized" /v0/publisher/{id}: get: summary: Récupérer un partenaire diffuseur description: Retourne le détail d'un partenaire diffuseur, incluant les organisations exclues. operationId: getPartner tags: [Partenaires] parameters: - name: id in: path required: true description: Identifiant du partenaire diffuseur schema: type: string example: "5f5931496c7ea514150a818f" responses: "200": description: Partenaire trouvé content: application/json: schema: type: object properties: ok: type: boolean example: true data: $ref: "#/components/schemas/PartnerWithExclusions" "400": $ref: "#/components/responses/BadRequest" "401": $ref: "#/components/responses/Unauthorized" "404": $ref: "#/components/responses/NotFound" # ──────────────────────────────────────────────────────────────────────────── # v0 — Règles de diffusion # ──────────────────────────────────────────────────────────────────────────── /v0/diffusion-rule: get: summary: Lister les règles de diffusion description: | Retourne, pour chacun de vos partenaires diffuseurs, les règles de diffusion que vous avez configurées en tant qu'annonceur. Ces règles déterminent quelles missions sont diffusées vers chaque diffuseur. Les paramètres `field` et `value` doivent être fournis ensemble (les deux ou aucun) : lorsqu'ils sont présents, chaque diffuseur est en plus annoté d'un booléen `diffuse` indiquant s'il diffuserait la valeur recherchée pour ce champ. Fournir un seul des deux renvoie une erreur `400`. operationId: listDiffusionRules tags: [Règles de diffusion] parameters: - name: field in: query required: false description: | Champ sur lequel évaluer la diffusion. À fournir conjointement avec `value`. Valeurs possibles : `type`, `publisherOrganizationId`, `publisherOrganization.clientId`, `publisherOrganization.parentOrganizations`. schema: type: string example: "publisherOrganization.parentOrganizations" - name: value in: query required: false description: Valeur recherchée sur le champ `field`. À fournir conjointement avec `field`. schema: type: string example: "Marine nationale" responses: "200": description: Liste des diffuseurs avec leurs règles de diffusion content: application/json: schema: type: object properties: ok: type: boolean example: true total: type: integer description: Nombre de diffuseurs retournés example: 3 data: type: array items: $ref: "#/components/schemas/DiffuseurWithRules" "400": $ref: "#/components/responses/BadRequest" "401": $ref: "#/components/responses/Unauthorized" post: summary: Créer une règle de diffusion description: | Crée une règle de diffusion appliquée à un ou plusieurs de vos partenaires diffuseurs. Seuls les diffuseurs effectivement associés à votre compte sont pris en compte ; les autres identifiants fournis sont ignorés. Une mission n'est diffusée vers un diffuseur que si elle satisfait l'ensemble des règles configurées pour ce diffuseur. L'opération est idempotente : si une règle identique (même `field`, `value`, `operator` et `fieldType`) existe déjà pour un diffuseur, la règle existante est retournée plutôt que dupliquée. Si une règle existe pour le même `field` et `value` mais avec un opérateur différent, l'API renvoie une erreur `409` plutôt que de masquer silencieusement la demande. operationId: createDiffusionRule tags: [Règles de diffusion] requestBody: required: true content: application/json: schema: type: object required: [publisherIds, field, operator, value] properties: publisherIds: type: array minItems: 1 description: Identifiants des partenaires diffuseurs auxquels appliquer la règle items: type: string example: ["5f5931496c7ea514150a818f", "60a1b2c3d4e5f6789abc0001"] field: type: string description: | Champ de la mission évalué par la règle. Valeurs possibles : `type`, `publisherOrganizationId`, `publisherOrganization.clientId`, `publisherOrganization.parentOrganizations`. example: "type" fieldType: type: string nullable: true description: Type de la valeur évaluée (par défaut `string`) example: "string" operator: type: string description: | Opérateur de comparaison. Valeurs possibles : `is`, `is_not`, `contains`, `does_not_contain`, `starts_with`, `is_greater_than`, `is_less_than`, `exists`, `does_not_exist`. example: "is_not" value: type: string description: Valeur comparée au champ de la mission example: "benevolat" responses: "201": description: Règle(s) créée(s) content: application/json: schema: type: object properties: ok: type: boolean example: true total: type: integer description: Nombre de règles créées (une par diffuseur) example: 2 data: type: array items: allOf: - type: object properties: publisherId: type: string description: Identifiant du diffuseur auquel s'applique la règle example: "5f5931496c7ea514150a818f" - $ref: "#/components/schemas/DiffusionRule" "400": $ref: "#/components/responses/BadRequest" "401": $ref: "#/components/responses/Unauthorized" "403": $ref: "#/components/responses/Forbidden" "409": $ref: "#/components/responses/Conflict" /v0/diffusion-rule/{id}: delete: summary: Supprimer une règle de diffusion description: | Supprime une règle de diffusion que vous avez configurée. Seules les règles rattachées à votre compte annonceur peuvent être supprimées. operationId: deleteDiffusionRule tags: [Règles de diffusion] parameters: - name: id in: path required: true description: Identifiant de la règle de diffusion (règle enfant rattachée à votre scope d'annonceur) schema: type: string example: "9b1c2d3e-4f56-7890-abcd-ef0123456789" responses: "200": description: Règle supprimée content: application/json: schema: type: object properties: ok: type: boolean example: true "400": $ref: "#/components/responses/BadRequest" "401": $ref: "#/components/responses/Unauthorized" "403": $ref: "#/components/responses/Forbidden" "404": $ref: "#/components/responses/NotFound"