{"openapi":"3.1.0","info":{"title":"Octave Flux Immobilier API","version":"1.2.0","contact":{"name":"Support Octave","url":"https:\/\/octave.immo"},"license":{"name":"Usage partenaire","url":"https:\/\/octave.immo"},"description":"# Vue d'ensemble\n\nAPI REST en lecture pour les partenaires (portails, CRM, multidiffusion). Elle expose le catalogue d'une application Octave : programmes, lots, prix, documents et images.\n\nAuthentification OAuth client_credentials, identifiants stables (tokens), pagination, m\u00e9dias via URLs S3 temporaires.\n\n---\n\n# Authentification (OAuth 2.0)\n\nGrant `client_credentials` uniquement.\n\n1. Un administrateur Octave cr\u00e9e un acc\u00e8s API (page Acc\u00e8s API) et vous donne `client_id` \/ `client_secret`.\n2. `POST \/oauth\/token` renvoie un `access_token`.\n3. Passez `Authorization: Bearer {access_token}` sur les appels m\u00e9tier.\n\n| Param\u00e8tre | Description |\n|-----------|-------------|\n| `grant_type` | `client_credentials` |\n| `client_id` \/ `client_secret` | Identifiants de l'acc\u00e8s API |\n| `application` | Slug, token ou ID de l'application (requis si l'acc\u00e8s couvre plusieurs applications) |\n\n- Dur\u00e9e de vie : `expires_in` en secondes (souvent 3600).\n- Acc\u00e8s expir\u00e9 ou supprim\u00e9 : les bearer d\u00e9j\u00e0 \u00e9mis sont refus\u00e9s.\n- Acc\u00e8s lecture seule : GET et HEAD uniquement (sinon 403).\n\n---\n\n# Identifiants\n\n| Ressource | Dans l'URL | Stable |\n|-----------|------------|--------|\n| Programme | `token` (pr\u00e9fixe `program_\u2026`) | Oui |\n| Lot | `token` | Oui |\n| Document | `token` | Oui |\n| Image | `id` m\u00e9dia | Oui pour une m\u00eame image |\n\nUtilisez les `token` dans les URLs, pas les `id` num\u00e9riques internes des programmes ou lots.\n\n---\n\n# Pagination\n\nLes listes et l export renvoient un objet `meta` (et `total` en racine pour l export) :\n\n```json\n{\n \"current_page\": 1,\n \"per_page\": 25,\n \"total\": 128,\n \"last_page\": 6\n}\n```\n\n- `total` : nombre total de programmes (ou lots) sur toutes les pages \u2014 pour savoir s il faut continuer.\n- `last_page` : derni\u00e8re page ; continuez tant que `current_page < last_page`.\n- `GET \/v1\/programs` : `per_page` d\u00e9faut 25, max 100.\n- `GET \/v1\/programs\/export` : `page` et `per_page` obligatoires (`per_page` max 25).\n- `GET \/v1\/programs\/{program}\/lots` : `per_page` d\u00e9faut 50, max 200.\n\n---\n\n# M\u00e9dias (documents et images)\n\nL'API ne sert pas les fichiers en binaire. Les r\u00e9ponses donnent des URLs S3 pr\u00e9-sign\u00e9es.\n\n- Validit\u00e9 : 24 heures (1440 minutes) \u00e0 partir de la r\u00e9ponse.\n- Apr\u00e8s expiration, rappelez l'endpoint pour de nouvelles URLs.\n- `GET \u2026\/images` : tailles `large`, `medium`, `small`.\n- Dans l'export programme, les images sont group\u00e9es par taille.\n\n---\n\n# Synchronisation\n\n1. `GET \/v1\/programs` pour la liste et les tokens (`updated_at`).\n2. `GET \/v1\/programs\/export` (pagin\u00e9) ou `GET \/v1\/programs\/{token}` pour le d\u00e9tail.\n3. Sous-ressources lots, prix, documents, images si besoin hors export.\n\n**Sync incr\u00e9mentale** : query `updated_since` (ISO 8601) sur liste et export \u2014 ne renvoie que les programmes avec `updated_at >= updated_since`.\n\n**Cache conditionnel** : en-t\u00eate `ETag` sur liste, export et d\u00e9tail ; renvoyez `If-None-Match` pour obtenir `304 Not Modified` si rien n a chang\u00e9.\n\nRespectez les plafonds `per_page`.\n\n---\n\n# Erreurs HTTP\n\n| Code | Signification |\n|------|----------------|\n| 401 | Token manquant, invalide, expir\u00e9, ou acc\u00e8s API r\u00e9voqu\u00e9 |\n| 403 | Client lecture seule sur une m\u00e9thode non autoris\u00e9e |\n| 404 | Ressource introuvable ou hors p\u00e9rim\u00e8tre de l'application |\n| 304 | Contenu inchang\u00e9 (`If-None-Match` = `ETag`) |\n| 422 | Corps OAuth invalide \/ application manquante (multi-apps) |\n\nCorps typique : `{ \"message\": \"\u2026\" }`.\n\n---\n\n# Donn\u00e9es personnelles\n\nLe flux ne contient pas d'email, pr\u00e9nom, nom, t\u00e9l\u00e9phone ni d'identifiants utilisateurs (`user_id`, `created_by`, etc.).\n\nLes op\u00e9rations commerciales sont limit\u00e9es aux champs publics (type, libell\u00e9s, dates, montants), sans listes de commercialisateurs.\n\nLes adresses concernent le programme immobilier (ligne, ville, g\u00e9oloc).\n\n---\n\n# Tester dans cette interface\n\n1. `POST \/oauth\/token` \u2192 Try it out \u2192 Execute.\n2. Copiez `access_token`.\n3. Authorize \u2192 collez le token (sans `Bearer`).\n4. Les GET deviennent ex\u00e9cutables."},"externalDocs":{"description":"Changelog du contrat API","url":"https:\/\/api.octave.immo\/developer\/endpoints\/changelog"},"tags":[{"name":"Authentification","description":"\u00c9mission d'un access token OAuth 2.0 (client_credentials)."},{"name":"Programmes","description":"Liste, d\u00e9tail unitaire, ou export pagin\u00e9 du catalogue."},{"name":"Lots","description":"Unit\u00e9s d'un programme : typologie, surfaces, \u00e9tat, annexes."},{"name":"Prix","description":"Grille tarifaire d'un lot (immobilier TTC, foncier, travaux, loyers\u2026)."},{"name":"Documents","description":"Pi\u00e8ces jointes programme ou lot. URLs S3 sign\u00e9es 24 h."},{"name":"Images","description":"Visuels d'un programme. URLs S3 sign\u00e9es 24 h, 3 tailles."}],"servers":[{"url":"https:\/\/api.octave.immo","description":"Serveur courant (sous-domaine API, sans pr\u00e9fixe \/api)"}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT-like opaque token","description":"Access token obtenu via `POST \/oauth\/token`. Collez uniquement la valeur de `access_token` (sans le pr\u00e9fixe `Bearer`)."}},"parameters":{"ProgramToken":{"name":"program","in":"path","required":true,"description":"Token du programme (ex. `program_26e5bbd5-dcee-44c9-9a08-a1d19a7cf526`).","schema":{"type":"string","example":"program_26e5bbd5-dcee-44c9-9a08-a1d19a7cf526"}},"LotToken":{"name":"lot","in":"path","required":true,"description":"Token du lot.","schema":{"type":"string","example":"product_a1b2c3d4-e5f6-7890-abcd-ef1234567890"}},"DocumentToken":{"name":"document","in":"path","required":true,"description":"Token du document.","schema":{"type":"string"}},"Page":{"name":"page","in":"query","required":false,"description":"Num\u00e9ro de page (1-index\u00e9).","schema":{"type":"integer","minimum":1,"default":1}},"UpdatedSince":{"name":"updated_since","in":"query","required":false,"description":"Ne renvoie que les programmes dont `updated_at` est sup\u00e9rieur ou \u00e9gal \u00e0 cette date (ISO 8601).","schema":{"type":"string","format":"date-time","example":"2026-03-01T00:00:00Z"}},"IfNoneMatch":{"name":"If-None-Match","in":"header","required":false,"description":"ETag re\u00e7u pr\u00e9c\u00e9demment. Si inchang\u00e9, r\u00e9ponse `304 Not Modified`.","schema":{"type":"string"}},"ExportPage":{"name":"page","in":"query","required":true,"description":"Num\u00e9ro de page (1-index\u00e9). Obligatoire : l export est toujours pagin\u00e9.","schema":{"type":"integer","minimum":1,"example":1}},"ExportPerPage":{"name":"per_page","in":"query","required":true,"description":"Taille de page. Obligatoire. Maximum 25.","schema":{"type":"integer","minimum":1,"maximum":25,"example":5}}},"schemas":{"OAuthTokenRequest":{"type":"object","required":["grant_type","client_id","client_secret"],"properties":{"grant_type":{"type":"string","enum":["client_credentials"],"description":"Seul grant support\u00e9.","example":"client_credentials"},"client_id":{"type":"string","description":"Identifiant public de l'acc\u00e8s API.","example":"oct_demo_sandbox"},"client_secret":{"type":"string","format":"password","description":"Secret de l'acc\u00e8s API (affich\u00e9 une seule fois \u00e0 la cr\u00e9ation).","example":"demo_secret_change_me"},"application":{"type":"string","description":"Slug, token ou ID num\u00e9rique de l'application Octave cible. Obligatoire si l'acc\u00e8s est li\u00e9 \u00e0 plusieurs applications actives.","example":"mon-promoteur"}},"example":{"grant_type":"client_credentials","client_id":"oct_live_xxxxxxxx","client_secret":"\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022","application":"mon-promoteur"}},"OAuthTokenResponse":{"type":"object","required":["access_token","token_type","expires_in"],"properties":{"access_token":{"type":"string","description":"Jeton opaque \u00e0 placer dans `Authorization: Bearer \u2026`."},"token_type":{"type":"string","example":"Bearer"},"expires_in":{"type":"integer","description":"Dur\u00e9e de validit\u00e9 en secondes.","example":3600}}},"Error":{"type":"object","required":["message"],"properties":{"message":{"type":"string","example":"Token expir\u00e9 ou invalide."}}},"OAuthApplicationRequired":{"type":"object","description":"R\u00e9ponse lorsque le client est multi-applications et que `application` est absent.","properties":{"message":{"type":"string","example":"Ce client est li\u00e9 \u00e0 plusieurs applications. Indiquez le param\u00e8tre application (slug, token ou id)."},"error":{"type":"string","example":"application_required"},"available_applications":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer"},"slug":{"type":"string"},"name":{"type":"string"}}}}}},"ProgramListResponse":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"array","items":{"$ref":"#\/components\/schemas\/ProgramSummary"}},"meta":{"$ref":"#\/components\/schemas\/PaginationMeta"}}},"ProgramExportResponse":{"type":"object","description":"Export flux complet \u2014 une page de programmes d\u00e9taill\u00e9s. Le champ total (et meta.total) indique le nombre total de programmes ; parcourez les pages jusqu \u00e0 meta.last_page.","required":["application","programs","total","meta"],"properties":{"application":{"$ref":"#\/components\/schemas\/ApplicationSummary"},"programs":{"type":"array","items":{"$ref":"#\/components\/schemas\/ProgramDetail"}},"total":{"type":"integer","description":"Nombre total de programmes (toutes pages). Identique \u00e0 meta.total."},"meta":{"$ref":"#\/components\/schemas\/PaginationMeta"}}},"ProgramDetailResponse":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#\/components\/schemas\/ProgramDetail"}}},"LotListResponse":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"array","items":{"$ref":"#\/components\/schemas\/LotSummary"}},"meta":{"$ref":"#\/components\/schemas\/PaginationMeta"}}},"LotResponse":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#\/components\/schemas\/LotSummary"}}},"PriceListResponse":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"$ref":"#\/components\/schemas\/Price"}}}},"DocumentListResponse":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"$ref":"#\/components\/schemas\/Document"}}}},"DocumentResponse":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#\/components\/schemas\/Document"}}},"ProgramImageListResponse":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"$ref":"#\/components\/schemas\/ProgramImage"}}}},"ProgramSummary":{"type":"object","description":"Entr\u00e9e l\u00e9g\u00e8re de catalogue (liste programmes).","required":["token","name"],"properties":{"id":{"type":"integer","description":"Identifiant interne (ne pas utiliser dans les URLs partenaires).","example":1,"format":"int64"},"token":{"type":"string","example":"program_26e5bbd5-dcee-44c9-9a08-a1d19a7cf526"},"name":{"type":"string","example":"R\u00e9sidence Les Jardins de Bordeaux"},"slug":{"type":"string","example":"residence-les-jardins-de-bordeaux"},"is_active":{"type":"boolean","description":"Programme visible \/ commercialisable c\u00f4t\u00e9 application.","example":true},"updated_at":{"type":"string","format":"date-time","description":"Derni\u00e8re mise \u00e0 jour du programme (utile avec `updated_since` \/ ETag).","example":"2026-03-01T12:00:00+00:00","nullable":true}}},"PaginationMeta":{"type":"object","required":["current_page","per_page","total","last_page"],"properties":{"current_page":{"type":"integer","example":1,"description":"Page courante (1-index\u00e9e)."},"per_page":{"type":"integer","example":25,"description":"Taille de page demand\u00e9e."},"total":{"type":"integer","example":42,"description":"Nombre total d \u00e9l\u00e9ments (toutes pages). Permet de savoir si d autres pages existent."},"last_page":{"type":"integer","example":2,"description":"Index de la derni\u00e8re page. Continuez tant que current_page < last_page."}},"description":"Pagination : utilisez total (nombre d \u00e9l\u00e9ments toutes pages) et last_page pour savoir s il reste des pages \u00e0 appeler."},"ApplicationSummary":{"type":"object","properties":{"id":{"type":"integer","example":12},"name":{"type":"string","example":"Espace Partenaire Demo"},"slug":{"type":"string","example":"demo-partenaire"}}},"ProgramDetail":{"type":"object","description":"Programme enrichi (d\u00e9tail unitaire ou \u00e9l\u00e9ment de l'export). Contient lots, documents, images, fiscalit\u00e9s, adresses, prestations, etc.","properties":{"id":{"type":"integer","example":1,"format":"int64"},"token":{"type":"string"},"name":{"type":"string"},"slug":{"type":"string"},"is_active":{"type":"boolean","example":true},"contrat_type":{"type":"string","nullable":true},"maquette_3d_url":{"type":"string","nullable":true,"format":"uri"},"addresses":{"type":"array","description":"Adresses du programme (ville, code postal, g\u00e9oloc si renseign\u00e9e).","items":{"type":"object","additionalProperties":true}},"fiscalites":{"type":"array","description":"Dispositifs fiscaux associ\u00e9s (Malraux, LMNP, Pinel\u2026).","items":{"type":"object","additionalProperties":true}},"prestations":{"type":"array","items":{"type":"object","additionalProperties":true}},"marketing_tags":{"type":"array","items":{"type":"object","additionalProperties":true}},"documents":{"type":"array","items":{"$ref":"#\/components\/schemas\/Document"}},"images":{"$ref":"#\/components\/schemas\/ProgramImagesEmbedded"},"lots":{"type":"array","items":{"$ref":"#\/components\/schemas\/LotSummary"}},"sale_parameter":{"type":"object","nullable":true,"description":"Param\u00e8tres de vente (options, dur\u00e9es\u2026).","additionalProperties":true},"cityscan_enabled":{"type":"boolean","nullable":true,"example":true},"descriptions":{"type":"array","description":"Textes descriptifs du programme.","items":{"type":"object","additionalProperties":true}},"argumentaires":{"type":"array","description":"Argumentaires commerciaux ordonn\u00e9s.","items":{"type":"object","additionalProperties":true}},"custom_packs":{"type":"array","description":"Packs personnalis\u00e9s (category custom-pack) avec prix.","items":{"type":"object","additionalProperties":true}},"ope_coms":{"type":"array","description":"Op\u00e9rations commerciales du programme.","items":{"$ref":"#\/components\/schemas\/OpeCom"}},"norme_ecos":{"type":"array","items":{"type":"object","additionalProperties":true}},"dates":{"type":"array","description":"Dates cl\u00e9s du programme (livraison, commercialisation\u2026).","items":{"type":"object","additionalProperties":true}},"garanties":{"type":"array","items":{"type":"object","additionalProperties":true}},"annexes_independantes":{"type":"array","description":"Annexes de programme non rattach\u00e9es \u00e0 un lot.","items":{"type":"object","additionalProperties":true}}}},"LotSummary":{"type":"object","description":"Lot (champs principaux). Le d\u00e9tail \/ export enrichit typologie, \u00e9tage, surfaces, prix, annexes, documents.","properties":{"id":{"type":"integer","example":1,"format":"int64"},"token":{"type":"string"},"number":{"type":"string","example":"12","description":"Num\u00e9ro commercial du lot."},"category":{"type":"string","example":"lot"},"type":{"allOf":[{"$ref":"#\/components\/schemas\/ProductTypeCode"}],"description":"Code typologie du lot."},"type_label":{"type":"string","example":"T2"},"rooms":{"type":"integer","nullable":true,"example":2},"floor":{"allOf":[{"$ref":"#\/components\/schemas\/FloorTypeCode"}],"description":"Code \u00e9tage \/ niveau."},"floor_label":{"type":"string","example":"2\u00e8me \u00e9tage"},"floor_short_label":{"type":"string","example":"R+2"},"building_number":{"type":"string","nullable":true},"is_active":{"type":"boolean","example":true},"state":{"$ref":"#\/components\/schemas\/LabeledEnum"},"surfaces":{"type":"array","items":{"$ref":"#\/components\/schemas\/Surface"}},"prices":{"type":"array","items":{"$ref":"#\/components\/schemas\/Price"}},"documents":{"type":"array","items":{"$ref":"#\/components\/schemas\/Document"}},"annexes":{"type":"array","description":"Annexes li\u00e9es au lot (garage, cave, parking\u2026).","items":{"type":"object","additionalProperties":true}},"orientations":{"type":"array","items":{"type":"object","additionalProperties":true}},"descriptions":{"type":"array","items":{"type":"object","additionalProperties":true}},"ope_coms":{"type":"array","description":"Op\u00e9rations commerciales du lot.","items":{"$ref":"#\/components\/schemas\/OpeCom"}},"diagnostic_dpe":{"type":"string","nullable":true,"description":"Diagnostic DPE si renseign\u00e9."},"diagnostic_installation_gaz":{"type":"string","nullable":true},"diagnostic_installation_electrique":{"type":"string","nullable":true},"tantieme":{"type":"number","nullable":true,"format":"float"}}},"Price":{"type":"object","description":"Ligne de prix rattach\u00e9e \u00e0 un lot (ou une annexe).","properties":{"id":{"type":"integer","example":1,"format":"int64"},"type":{"allOf":[{"$ref":"#\/components\/schemas\/PriceTypeCode"}]},"type_label":{"type":"string","nullable":true,"example":"Prix immobilier TTC"},"value":{"type":"number","format":"float","example":293000},"read_only":{"type":"boolean","description":"`true` = inclus dans un autre montant (ex. travaux inclus).","example":true},"is_active":{"type":"boolean","example":true}}},"Document":{"type":"object","description":"Document commercial \/ technique avec URL t\u00e9l\u00e9chargeable temporaire.","required":["token","url"],"properties":{"token":{"type":"string"},"type":{"description":"Type m\u00e9tier (programme ou lot). Voir `DocumentTypeProgramCode` \/ `DocumentTypeLotCode`.","type":"string","example":"plan_masse"},"name":{"type":"string","example":"Plan de masse.pdf"},"file_size":{"type":"integer","nullable":true,"description":"Taille en octets.","example":245760,"format":"int64"},"order":{"type":"integer","example":1},"url":{"type":"string","format":"uri","description":"URL S3 pr\u00e9-sign\u00e9e (validit\u00e9 24 h)."},"thumbnail_url":{"type":"string","format":"uri","nullable":true,"description":"Vignette sign\u00e9e si disponible."},"created_at":{"type":"string","format":"date-time","nullable":true},"updated_at":{"type":"string","format":"date-time","nullable":true}},"example":{"token":"document_9f3a\u2026","type":"plan","name":"Plan T2.pdf","file_size":245760,"order":1,"url":"https:\/\/s3.example\/\u2026?X-Amz-Expires=86400","thumbnail_url":null}},"ProgramImage":{"type":"object","description":"Image programme telle que renvoy\u00e9e par `GET \/v1\/programs\/{program}\/images` (une entr\u00e9e = une photo, avec 3 URLs).","required":["id","urls"],"properties":{"id":{"type":"integer","description":"Identifiant m\u00e9dia Spatie (stable pour cette image).","example":1842},"type":{"allOf":[{"$ref":"#\/components\/schemas\/ImageTypeCode"}],"nullable":true},"order":{"type":"integer","description":"Ordre d'affichage (croissant).","example":0},"urls":{"type":"object","required":["large","medium","small"],"properties":{"large":{"type":"string","format":"uri","description":"URL sign\u00e9e \u2014 grande taille."},"medium":{"type":"string","format":"uri","description":"URL sign\u00e9e \u2014 taille moyenne."},"small":{"type":"string","format":"uri","description":"URL sign\u00e9e \u2014 vignette."}}}},"example":{"id":1842,"type":"facade","order":0,"urls":{"large":"https:\/\/s3.example\/media\/1842\/large.jpg?X-Amz-Expires=86400","medium":"https:\/\/s3.example\/media\/1842\/medium.jpg?X-Amz-Expires=86400","small":"https:\/\/s3.example\/media\/1842\/small.jpg?X-Amz-Expires=86400"}}},"ProgramImagesEmbedded":{"type":"object","description":"Bloc `images` dans `ProgramDetail` \/ export : listes parall\u00e8les large \/ medium \/ small (m\u00eame `id` \/ `order`).","properties":{"large":{"type":"array","items":{"$ref":"#\/components\/schemas\/ProgramImageVariant"}},"medium":{"type":"array","items":{"$ref":"#\/components\/schemas\/ProgramImageVariant"}},"small":{"type":"array","items":{"$ref":"#\/components\/schemas\/ProgramImageVariant"}}}},"OpeCom":{"type":"object","description":"Op\u00e9ration commerciale (champs publics, sans user_id ni listes d'utilisateurs).","properties":{"token":{"type":"string","nullable":true},"type":{"allOf":[{"$ref":"#\/components\/schemas\/OpeComTypeCode"}],"nullable":true},"recipient_type":{"allOf":[{"$ref":"#\/components\/schemas\/OpeComRecipientCode"}],"nullable":true},"name":{"type":"string","nullable":true},"text":{"type":"string","nullable":true},"ratio":{"type":"number","nullable":true,"format":"float"},"rate_calcul":{"type":"number","nullable":true,"format":"float"},"mode_calcul":{"type":"string","nullable":true},"order":{"type":"integer","nullable":true,"example":1,"format":"int64"},"is_active":{"type":"boolean","nullable":true,"example":true},"all_products":{"type":"boolean","nullable":true,"example":true},"default_products":{"type":"boolean","nullable":true,"example":true},"date_start":{"type":"string","nullable":true,"format":"date"},"date_end":{"type":"string","nullable":true,"format":"date"},"prix_limite":{"type":"number","nullable":true,"format":"float"},"prix_fixe":{"type":"number","nullable":true,"format":"float"},"commission_supplementaire":{"type":"number","nullable":true,"format":"float"}}},"ProductTypeCode":{"type":"string","description":"Typologie de lot \/ annexe \/ pack.\n\n| Valeur | Libell\u00e9 |\n|--------|---------|\n| `non_defini` | Non d\u00e9fini |\n| `appartement` | Appartement |\n| `maison` | Maison |\n| `t1` | T1 |\n| `t2` | T2 |\n| `t3` | T3 |\n| `t4` | T4 |\n| `t5` | T5 |\n| `t6` | T6 |\n| `t1_bis` | T1 bis |\n| `t2_bis` | T2 bis |\n| `t3_bis` | T3 bis |\n| `t4_bis` | T4 bis |\n| `t5_bis` | T5 bis |\n| `t6_bis` | T6 bis |\n| `t1_pmr` | T1 PMR |\n| `t2_pmr` | T2 PMR |\n| `t3_pmr` | T3 PMR |\n| `t4_pmr` | T4 PMR |\n| `t5_pmr` | T5 PMR |\n| `t6_pmr` | T6 PMR |\n| `t1_bis_duplex` | T1 bis Duplex |\n| `t1_duplex` | T1 Duplex |\n| `t2_duplex` | T2 Duplex |\n| `t3_duplex` | T3 Duplex |\n| `t4_duplex` | T4 Duplex |\n| `t5_duplex` | T5 Duplex |\n| `t6_duplex` | T6 Duplex |\n| `t1_triplex` | T1 Triplex |\n| `t2_triplex` | T2 Triplex |\n| `t3_triplex` | T3 Triplex |\n| `t4_triplex` | T4 Triplex |\n| `t5_triplex` | T5 Triplex |\n| `t6_triplex` | T6 Triplex |\n| `local_commercial` | Local commercial |\n| `bureau` | Bureau |\n| `terrain` | Terrain |\n| `parking` | Parking |\n| `garage` | Garage |\n| `jardin` | Jardin |\n| `cour` | Cour |\n| `terrasse` | Terrasse |\n| `balcon` | Balcon |\n| `loggia` | Loggia |\n| `cave` | Cave |\n| `cellier` | Cellier |","enum":["non_defini","appartement","maison","t1","t2","t3","t4","t5","t6","t1_bis","t2_bis","t3_bis","t4_bis","t5_bis","t6_bis","t1_pmr","t2_pmr","t3_pmr","t4_pmr","t5_pmr","t6_pmr","t1_bis_duplex","t1_duplex","t2_duplex","t3_duplex","t4_duplex","t5_duplex","t6_duplex","t1_triplex","t2_triplex","t3_triplex","t4_triplex","t5_triplex","t6_triplex","local_commercial","bureau","terrain","parking","garage","jardin","cour","terrasse","balcon","loggia","cave","cellier"],"example":"non_defini","x-enum-labels":{"non_defini":"Non d\u00e9fini","appartement":"Appartement","maison":"Maison","t1":"T1","t2":"T2","t3":"T3","t4":"T4","t5":"T5","t6":"T6","t1_bis":"T1 bis","t2_bis":"T2 bis","t3_bis":"T3 bis","t4_bis":"T4 bis","t5_bis":"T5 bis","t6_bis":"T6 bis","t1_pmr":"T1 PMR","t2_pmr":"T2 PMR","t3_pmr":"T3 PMR","t4_pmr":"T4 PMR","t5_pmr":"T5 PMR","t6_pmr":"T6 PMR","t1_bis_duplex":"T1 bis Duplex","t1_duplex":"T1 Duplex","t2_duplex":"T2 Duplex","t3_duplex":"T3 Duplex","t4_duplex":"T4 Duplex","t5_duplex":"T5 Duplex","t6_duplex":"T6 Duplex","t1_triplex":"T1 Triplex","t2_triplex":"T2 Triplex","t3_triplex":"T3 Triplex","t4_triplex":"T4 Triplex","t5_triplex":"T5 Triplex","t6_triplex":"T6 Triplex","local_commercial":"Local commercial","bureau":"Bureau","terrain":"Terrain","parking":"Parking","garage":"Garage","jardin":"Jardin","cour":"Cour","terrasse":"Terrasse","balcon":"Balcon","loggia":"Loggia","cave":"Cave","cellier":"Cellier"}},"FloorTypeCode":{"type":"string","description":"Niveau \/ \u00e9tage.\n\n| Valeur | Libell\u00e9 |\n|--------|---------|\n| `rdc` | RDC - Rez-de-chauss\u00e9e |\n| `ss` | S\/S - Sous-sol |\n| `rdj` | RDJ - Rez-de-jardin |\n| `rdp` | RDP - Rez-de-pelouse |\n| `rdn` | RDN - Rez-de-niveau |\n| `rdc-cour` | RDC - Rez-de-Cour |\n| `r-1` | R-1 - 1er sous-sol |\n| `r-2` | R-2 - 2\u00e8me sous-sol |\n| `r-3` | R-3 - 3\u00e8me sous-sol |\n| `r-4` | R-4 - 4\u00e8me sous-sol |\n| `r-5` | R-5 - 5\u00e8me sous-sol |\n| `r-6` | R-6 - 6\u00e8me sous-sol |\n| `r+1` | R+1 - 1er \u00e9tage |\n| `r+2` | R+2 - 2\u00e8me \u00e9tage |\n| `r+3` | R+3 - 3\u00e8me \u00e9tage |\n| `r+4` | R+4 - 4\u00e8me \u00e9tage |\n| `r+5` | R+5 - 5\u00e8me \u00e9tage |\n| `r+6` | R+6 - 6\u00e8me \u00e9tage |\n| `r+7` | R+7 - 7\u00e8me \u00e9tage |\n| `r+8` | R+8 - 8\u00e8me \u00e9tage |\n| `r+9` | R+9 - 9\u00e8me \u00e9tage |\n| `r+10` | R+10 - 10\u00e8me \u00e9tage |\n| `r+11` | R+11 - 11\u00e8me \u00e9tage |\n| `r+12` | R+12 - 12\u00e8me \u00e9tage |\n| `r+13` | R+13 - 13\u00e8me \u00e9tage |\n| `r+14` | R+14 - 14\u00e8me \u00e9tage |\n| `r+15` | R+15 - 15\u00e8me \u00e9tage |\n| `r+16` | R+16 - 16\u00e8me \u00e9tage |\n| `r+17` | R+17 - 17\u00e8me \u00e9tage |\n| `r+18` | R+18 - 18\u00e8me \u00e9tage |\n| `r+19` | R+19 - 19\u00e8me \u00e9tage |\n| `r+20` | R+20 - 20\u00e8me \u00e9tage |","enum":["rdc","ss","rdj","rdp","rdn","rdc-cour","r-1","r-2","r-3","r-4","r-5","r-6","r+1","r+2","r+3","r+4","r+5","r+6","r+7","r+8","r+9","r+10","r+11","r+12","r+13","r+14","r+15","r+16","r+17","r+18","r+19","r+20"],"example":"rdc","x-enum-labels":{"rdc":"RDC - Rez-de-chauss\u00e9e","ss":"S\/S - Sous-sol","rdj":"RDJ - Rez-de-jardin","rdp":"RDP - Rez-de-pelouse","rdn":"RDN - Rez-de-niveau","rdc-cour":"RDC - Rez-de-Cour","r-1":"R-1 - 1er sous-sol","r-2":"R-2 - 2\u00e8me sous-sol","r-3":"R-3 - 3\u00e8me sous-sol","r-4":"R-4 - 4\u00e8me sous-sol","r-5":"R-5 - 5\u00e8me sous-sol","r-6":"R-6 - 6\u00e8me sous-sol","r+1":"R+1 - 1er \u00e9tage","r+2":"R+2 - 2\u00e8me \u00e9tage","r+3":"R+3 - 3\u00e8me \u00e9tage","r+4":"R+4 - 4\u00e8me \u00e9tage","r+5":"R+5 - 5\u00e8me \u00e9tage","r+6":"R+6 - 6\u00e8me \u00e9tage","r+7":"R+7 - 7\u00e8me \u00e9tage","r+8":"R+8 - 8\u00e8me \u00e9tage","r+9":"R+9 - 9\u00e8me \u00e9tage","r+10":"R+10 - 10\u00e8me \u00e9tage","r+11":"R+11 - 11\u00e8me \u00e9tage","r+12":"R+12 - 12\u00e8me \u00e9tage","r+13":"R+13 - 13\u00e8me \u00e9tage","r+14":"R+14 - 14\u00e8me \u00e9tage","r+15":"R+15 - 15\u00e8me \u00e9tage","r+16":"R+16 - 16\u00e8me \u00e9tage","r+17":"R+17 - 17\u00e8me \u00e9tage","r+18":"R+18 - 18\u00e8me \u00e9tage","r+19":"R+19 - 19\u00e8me \u00e9tage","r+20":"R+20 - 20\u00e8me \u00e9tage"}},"LabeledEnum":{"type":"object","description":"Valeur m\u00e9tier enrichie (code + libell\u00e9 UI).","properties":{"type":{"type":"string","description":"Code enum (ex. \u00e9tat lot : voir ProductStateCode).","example":"libre"},"label":{"type":"string","example":"Libre"},"icon":{"type":"string","nullable":true},"color":{"type":"string","nullable":true},"bg_color":{"type":"string","nullable":true},"text_color":{"type":"string","nullable":true},"description":{"type":"string","nullable":true},"available":{"type":"boolean","nullable":true,"example":true}}},"Surface":{"type":"object","properties":{"type":{"allOf":[{"$ref":"#\/components\/schemas\/SurfaceTypeCode"}]},"type_label":{"type":"string","example":"Surface habitable"},"value":{"type":"number","format":"float","example":52}}},"PriceTypeCode":{"type":"string","description":"Types de prix lot (immobilier, foncier, loyers, frais\u2026).\n\n| Valeur | Libell\u00e9 |\n|--------|---------|\n| `non_defini` | Non d\u00e9fini |\n| `prix_fixe` | Montant fixe revers\u00e9 |\n| `prix_ttc` | TTC |\n| `prix_ht` | HT |\n| `prix_immo_ttc` | Immo TTC (TVA 20%) |\n| `prix_immo_ht` | Immo HT |\n| `prix_immo_ttc_10` | Immo TTC (TVA 10%) |\n| `prix_immo_5_5` | Immo TTC (TVA 5,5%) |\n| `prix_tva_immo` | TVA sur immo |\n| `prix_mobilier_ttc` | Mobilier TTC |\n| `prix_mobilier_ht` | Mobilier HT |\n| `prix_tva_mobilier` | TVA sur mobilier |\n| `prix_foncier_ttc` | Foncier TTC |\n| `prix_foncier_ht` | Foncier HT |\n| `prix_travaux_eligible` | Travaux \u00e9ligibles |\n| `prix_travaux_non_eligible` | Travaux non \u00e9ligibles |\n| `prix_tva_5_5` | Immo TTC avec TVA (5.5%) |\n| `prix_tva_10` | Immo TTC avec TVA (10%) |\n| `mensuel_ttc` | Loyer mensuel TTC |\n| `mensuel_ht` | Loyer mensuel HT |\n| `mensuel_denormandie_ttc` | Loyer mensuel Denormandie TTC |\n| `mensuel_denormandie_ht` | Loyer mensuel Denormandie HT |\n| `mensuel_plafonne_dispositif_fiscal` | Loyer mensuel plafonn\u00e9 selon dispositif fiscal |\n| `mensuel_social_jean_brun` | Loyer social Jean Brun |\n| `mensuel_tres_social_jean_brun` | Loyer tr\u00e8s social Jean Brun |\n| `prix_cuisine` | Prix cuisine |\n| `frais_notaire` | Frais de notaire |\n| `frais_notaire_tva_5_5` | Frais de notaire (TVA 5.5%) |\n| `frais_notaire_tva_10` | Frais de notaire avec TVA 10% (LLI) |\n| `frais_pret` | Frais de pr\u00eat |\n| `frais_gerance` | Frais de g\u00e9rance |\n| `frais_mise_copro` | Frais de mise en copropri\u00e9t\u00e9 |\n| `montant_depot_garantie` | D\u00e9p\u00f4t de garantie |","enum":["non_defini","prix_fixe","prix_ttc","prix_ht","prix_immo_ttc","prix_immo_ht","prix_immo_ttc_10","prix_immo_5_5","prix_tva_immo","prix_mobilier_ttc","prix_mobilier_ht","prix_tva_mobilier","prix_foncier_ttc","prix_foncier_ht","prix_travaux_eligible","prix_travaux_non_eligible","prix_tva_5_5","prix_tva_10","mensuel_ttc","mensuel_ht","mensuel_denormandie_ttc","mensuel_denormandie_ht","mensuel_plafonne_dispositif_fiscal","mensuel_social_jean_brun","mensuel_tres_social_jean_brun","prix_cuisine","frais_notaire","frais_notaire_tva_5_5","frais_notaire_tva_10","frais_pret","frais_gerance","frais_mise_copro","montant_depot_garantie"],"example":"non_defini","x-enum-labels":{"non_defini":"Non d\u00e9fini","prix_fixe":"Montant fixe revers\u00e9","prix_ttc":"TTC","prix_ht":"HT","prix_immo_ttc":"Immo TTC (TVA 20%)","prix_immo_ht":"Immo HT","prix_immo_ttc_10":"Immo TTC (TVA 10%)","prix_immo_5_5":"Immo TTC (TVA 5,5%)","prix_tva_immo":"TVA sur immo","prix_mobilier_ttc":"Mobilier TTC","prix_mobilier_ht":"Mobilier HT","prix_tva_mobilier":"TVA sur mobilier","prix_foncier_ttc":"Foncier TTC","prix_foncier_ht":"Foncier HT","prix_travaux_eligible":"Travaux \u00e9ligibles","prix_travaux_non_eligible":"Travaux non \u00e9ligibles","prix_tva_5_5":"Immo TTC avec TVA (5.5%)","prix_tva_10":"Immo TTC avec TVA (10%)","mensuel_ttc":"Loyer mensuel TTC","mensuel_ht":"Loyer mensuel HT","mensuel_denormandie_ttc":"Loyer mensuel Denormandie TTC","mensuel_denormandie_ht":"Loyer mensuel Denormandie HT","mensuel_plafonne_dispositif_fiscal":"Loyer mensuel plafonn\u00e9 selon dispositif fiscal","mensuel_social_jean_brun":"Loyer social Jean Brun","mensuel_tres_social_jean_brun":"Loyer tr\u00e8s social Jean Brun","prix_cuisine":"Prix cuisine","frais_notaire":"Frais de notaire","frais_notaire_tva_5_5":"Frais de notaire (TVA 5.5%)","frais_notaire_tva_10":"Frais de notaire avec TVA 10% (LLI)","frais_pret":"Frais de pr\u00eat","frais_gerance":"Frais de g\u00e9rance","frais_mise_copro":"Frais de mise en copropri\u00e9t\u00e9","montant_depot_garantie":"D\u00e9p\u00f4t de garantie"}},"ImageTypeCode":{"type":"string","description":"Cat\u00e9gorie d'image programme.\n\n| Valeur | Libell\u00e9 |\n|--------|---------|\n| `exterieur` | Ext\u00e9rieur |\n| `interieur` | Int\u00e9rieur |","enum":["exterieur","interieur"],"example":"exterieur","x-enum-labels":{"exterieur":"Ext\u00e9rieur","interieur":"Int\u00e9rieur"}},"ProgramImageVariant":{"type":"object","description":"Image telle qu'embarqu\u00e9e dans l'export \/ d\u00e9tail programme (forme group\u00e9e par taille).","properties":{"id":{"type":"integer","example":1,"format":"int64"},"url":{"type":"string","format":"uri"},"type":{"type":"string","nullable":true},"order":{"type":"integer","example":1,"format":"int64"}}},"OpeComTypeCode":{"type":"string","description":"Type d'op\u00e9ration commerciale.\n\n| Valeur | Libell\u00e9 |\n|--------|---------|\n| `non_defini` | Non d\u00e9fini |\n| `cuisine_offerte` | Cuisine Offerte |\n| `bon_achat` | Bon d'Achat |\n| `frais_notaire_offerts` | Frais de Notaire Offerts |\n| `cashback` | Montant revers\u00e9 |\n| `boost_de_commission` | Boost de commission |\n| `cadeau` | Cadeau |","enum":["non_defini","cuisine_offerte","bon_achat","frais_notaire_offerts","cashback","boost_de_commission","cadeau"],"example":"non_defini","x-enum-labels":{"non_defini":"Non d\u00e9fini","cuisine_offerte":"Cuisine Offerte","bon_achat":"Bon d'Achat","frais_notaire_offerts":"Frais de Notaire Offerts","cashback":"Montant revers\u00e9","boost_de_commission":"Boost de commission","cadeau":"Cadeau"}},"OpeComRecipientCode":{"type":"string","description":"Destinataire de l'op\u00e9ration commerciale.\n\n| Valeur | Libell\u00e9 |\n|--------|---------|\n| `client` | Client final |\n| `commercialisateur` | Commercialisateur |","enum":["client","commercialisateur"],"example":"client","x-enum-labels":{"client":"Client final","commercialisateur":"Commercialisateur"}},"SurfaceTypeCode":{"type":"string","description":"Type de surface.\n\n| Valeur | Libell\u00e9 |\n|--------|---------|\n| `non_defini` | Non d\u00e9fini |\n| `habitable` | Habitable |\n| `carrez_avant_travaux` | Carrez avant travaux |\n| `carrez` | Carrez |\n| `totale` | Surface totale |\n| `surface_180` | Sous 1m80 |\n| `annexe` | Surface annexe |","enum":["non_defini","habitable","carrez_avant_travaux","carrez","totale","surface_180","annexe"],"example":"non_defini","x-enum-labels":{"non_defini":"Non d\u00e9fini","habitable":"Habitable","carrez_avant_travaux":"Carrez avant travaux","carrez":"Carrez","totale":"Surface totale","surface_180":"Sous 1m80","annexe":"Surface annexe"}},"ProductStateCode":{"type":"string","description":"\u00c9tat commercial d'un lot ou d'une annexe.\n\n| Valeur | Libell\u00e9 |\n|--------|---------|\n| `non_defini` | Non d\u00e9fini |\n| `libre` | Libre |\n| `option` | Optionn\u00e9 |\n| `reserve` | R\u00e9serv\u00e9 |\n| `vendu` | Vendu |\n| `allote` | Allot\u00e9 |\n| `locked` | Verrouill\u00e9 |","enum":["non_defini","libre","option","reserve","vendu","allote","locked"],"example":"non_defini","x-enum-labels":{"non_defini":"Non d\u00e9fini","libre":"Libre","option":"Optionn\u00e9","reserve":"R\u00e9serv\u00e9","vendu":"Vendu","allote":"Allot\u00e9","locked":"Verrouill\u00e9"}},"OrientationCode":{"type":"string","description":"Orientation.\n\n| Valeur | Libell\u00e9 |\n|--------|---------|\n| `non_defini` | Non d\u00e9fini |\n| `nord` | Nord |\n| `nord_est` | Nord-Est |\n| `est` | Est |\n| `sud_est` | Sud-Est |\n| `sud` | Sud |\n| `sud_ouest` | Sud-Ouest |\n| `ouest` | Ouest |\n| `nord_ouest` | Nord-Ouest |","enum":["non_defini","nord","nord_est","est","sud_est","sud","sud_ouest","ouest","nord_ouest"],"example":"non_defini","x-enum-labels":{"non_defini":"Non d\u00e9fini","nord":"Nord","nord_est":"Nord-Est","est":"Est","sud_est":"Sud-Est","sud":"Sud","sud_ouest":"Sud-Ouest","ouest":"Ouest","nord_ouest":"Nord-Ouest"}},"PriceTypeAnnexeCode":{"type":"string","description":"Types de prix pour une annexe.\n\n| Valeur | Libell\u00e9 |\n|--------|---------|\n| `non_defini` | Non d\u00e9fini |\n| `prix_ttc` | Prix TTC |\n| `prix_tva_5_5` | Prix TTC avec TVA 5.5% |\n| `prix_tva_10` | Prix TTC avec TVA 10% (LLI) |\n| `prix_ht` | Prix HT |","enum":["non_defini","prix_ttc","prix_tva_5_5","prix_tva_10","prix_ht"],"example":"non_defini","x-enum-labels":{"non_defini":"Non d\u00e9fini","prix_ttc":"Prix TTC","prix_tva_5_5":"Prix TTC avec TVA 5.5%","prix_tva_10":"Prix TTC avec TVA 10% (LLI)","prix_ht":"Prix HT"}},"DocumentTypeProgramCode":{"type":"string","description":"Type de document programme.\n\n| Valeur | Libell\u00e9 |\n|--------|---------|\n| `plaquette` | Plaquette |\n| `descriptif_travaux` | Descriptif des travaux |\n| `plan` | Plan |\n| `plan_cadastral` | Plan cadastral |\n| `etat_descriptif_division` | \u00c9tat descriptif de division |\n| `plan_masse` | Plan de masse |\n| `plan_cave` | Plan de cave |\n| `plan_cellier` | Plan de cellier |\n| `plan_zones_caves` | Plans des zones de caves |\n| `plan_parking` | Plan de parking |\n| `contrat_reservation` | Contrat de r\u00e9servation |\n| `projet_statuts` | Projet de statuts |\n| `projet_ag` | Projet d'AG |\n| `notice_descriptive` | Notice descriptive |\n| `certificat_urbanisme` | Certificat d'urbanisme |\n| `diagnostics` | Diagnostics |\n| `compte_rendu_visite` | Compte rendu de visite |\n| `erp` | ERP |\n| `synthese_bases_environnementales` | Synth\u00e8se bases environnementales |\n| `dtg` | DTG |\n| `informations_mobilier` | Informations mobilier |\n| `reserve_professionnels` | R\u00e9serv\u00e9 aux professionnels |\n| `autre` | Autre |","enum":["plaquette","descriptif_travaux","plan","plan_cadastral","etat_descriptif_division","plan_masse","plan_cave","plan_cellier","plan_zones_caves","plan_parking","contrat_reservation","projet_statuts","projet_ag","notice_descriptive","certificat_urbanisme","diagnostics","compte_rendu_visite","erp","synthese_bases_environnementales","dtg","informations_mobilier","reserve_professionnels","autre"],"example":"plaquette","x-enum-labels":{"plaquette":"Plaquette","descriptif_travaux":"Descriptif des travaux","plan":"Plan","plan_cadastral":"Plan cadastral","etat_descriptif_division":"\u00c9tat descriptif de division","plan_masse":"Plan de masse","plan_cave":"Plan de cave","plan_cellier":"Plan de cellier","plan_zones_caves":"Plans des zones de caves","plan_parking":"Plan de parking","contrat_reservation":"Contrat de r\u00e9servation","projet_statuts":"Projet de statuts","projet_ag":"Projet d'AG","notice_descriptive":"Notice descriptive","certificat_urbanisme":"Certificat d'urbanisme","diagnostics":"Diagnostics","compte_rendu_visite":"Compte rendu de visite","erp":"ERP","synthese_bases_environnementales":"Synth\u00e8se bases environnementales","dtg":"DTG","informations_mobilier":"Informations mobilier","reserve_professionnels":"R\u00e9serv\u00e9 aux professionnels","autre":"Autre"}},"DocumentTypeLotCode":{"type":"string","description":"Type de document lot.\n\n| Valeur | Libell\u00e9 |\n|--------|---------|\n| `non_defini` | Non d\u00e9fini |\n| `plan_lot` | Plan du lot |\n| `plan_niveau` | Plan de niveau |\n| `plan_cadastral` | Plan cadastral |\n| `plan_masse` | Plan de masse |\n| `plan_cave` | Plan de cave |\n| `plan_cellier` | Plan de cellier |\n| `plan_zones_caves` | Plans des zones de caves |\n| `plan_parking` | Plan de parking |\n| `plan_3d` | Plan 3D |\n| `plan_annexe` | Plan d'annexe |\n| `diagnostics` | Diagnostics |\n| `reserve_professionnels` | R\u00e9serv\u00e9 aux professionnels |\n| `autre` | Autre |","enum":["non_defini","plan_lot","plan_niveau","plan_cadastral","plan_masse","plan_cave","plan_cellier","plan_zones_caves","plan_parking","plan_3d","plan_annexe","diagnostics","reserve_professionnels","autre"],"example":"non_defini","x-enum-labels":{"non_defini":"Non d\u00e9fini","plan_lot":"Plan du lot","plan_niveau":"Plan de niveau","plan_cadastral":"Plan cadastral","plan_masse":"Plan de masse","plan_cave":"Plan de cave","plan_cellier":"Plan de cellier","plan_zones_caves":"Plans des zones de caves","plan_parking":"Plan de parking","plan_3d":"Plan 3D","plan_annexe":"Plan d'annexe","diagnostics":"Diagnostics","reserve_professionnels":"R\u00e9serv\u00e9 aux professionnels","autre":"Autre"}}},"responses":{"Unauthorized":{"description":"Authentification manquante ou invalide (token absent, expir\u00e9, acc\u00e8s API r\u00e9voqu\u00e9).","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"},"example":{"message":"Token expir\u00e9 ou invalide."}}}},"Forbidden":{"description":"Client en lecture seule sur une op\u00e9ration non autoris\u00e9e.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"NotFound":{"description":"Ressource introuvable ou hors p\u00e9rim\u00e8tre de l'application authentifi\u00e9e.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"},"example":{"message":"Programme introuvable."}}}},"NotModified":{"description":"Contenu inchang\u00e9 depuis le dernier ETag.","headers":{"ETag":{"$ref":"#\/components\/headers\/ETag"}}},"ValidationError":{"description":"Param\u00e8tres invalides ou manquants.","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string","example":"Les param\u00e8tres page et per_page sont obligatoires."},"errors":{"type":"object"}}}}}}},"headers":{"ETag":{"description":"Empreinte de la repr\u00e9sentation courante (\u00e0 renvoyer dans `If-None-Match`).","schema":{"type":"string"}}}},"security":[{"bearerAuth":[]}],"paths":{"\/oauth\/token":{"post":{"tags":["Authentification"],"summary":"Obtenir un access token","description":"\u00c9change `client_id` \/ `client_secret` contre un bearer token. Aucune authentification pr\u00e9alable.\n\nSi l'acc\u00e8s est multi-applications, passez `application` (slug, token ou id).","operationId":"createOAuthToken","security":[],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/OAuthTokenRequest"}}}},"responses":{"200":{"description":"Token \u00e9mis avec succ\u00e8s.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/OAuthTokenResponse"}}}},"422":{"description":"Identifiants invalides, acc\u00e8s expir\u00e9, ou application manquante (multi-apps).","content":{"application\/json":{"schema":{"oneOf":[{"$ref":"#\/components\/schemas\/Error"},{"$ref":"#\/components\/schemas\/OAuthApplicationRequired"}]}}}}}}},"\/v1\/programs":{"get":{"tags":["Programmes"],"summary":"Lister les programmes (catalogue l\u00e9ger)","description":"Liste l\u00e9g\u00e8re : `token`, `name`, `slug`, `is_active`, `updated_at`. Filtre optionnel `updated_since`. Support ETag \/ If-None-Match.","operationId":"listPrograms","parameters":[{"name":"per_page","in":"query","schema":{"type":"integer","default":25,"minimum":1,"maximum":100}},{"$ref":"#\/components\/parameters\/Page"},{"$ref":"#\/components\/parameters\/UpdatedSince"},{"$ref":"#\/components\/parameters\/IfNoneMatch"}],"responses":{"200":{"description":"Liste pagin\u00e9e.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ProgramListResponse"}}},"headers":{"ETag":{"$ref":"#\/components\/headers\/ETag"}}},"401":{"$ref":"#\/components\/responses\/Unauthorized"},"304":{"$ref":"#\/components\/responses\/NotModified"}}}},"\/v1\/programs\/export":{"get":{"tags":["Programmes"],"summary":"Exporter les programmes (flux complet pagin\u00e9)","description":"Export d\u00e9taill\u00e9 : lots, prix, documents (URLs sign\u00e9es), images par taille, fiscalit\u00e9s, adresses, prestations, etc. `page` et `per_page` sont obligatoires (`per_page` max 25). Filtre optionnel `updated_since`. Support ETag \/ If-None-Match.","operationId":"exportPrograms","parameters":[{"$ref":"#\/components\/parameters\/ExportPage"},{"$ref":"#\/components\/parameters\/ExportPerPage"},{"$ref":"#\/components\/parameters\/UpdatedSince"},{"$ref":"#\/components\/parameters\/IfNoneMatch"}],"responses":{"200":{"description":"Page d'export.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ProgramExportResponse"}}},"headers":{"ETag":{"$ref":"#\/components\/headers\/ETag"}}},"401":{"$ref":"#\/components\/responses\/Unauthorized"},"304":{"$ref":"#\/components\/responses\/NotModified"},"422":{"$ref":"#\/components\/responses\/ValidationError"}}}},"\/v1\/programs\/{program}":{"get":{"tags":["Programmes"],"summary":"Consulter un programme (d\u00e9tail complet)","description":"M\u00eame richesse que l'export, pour un seul programme identifi\u00e9 par son `token`.","operationId":"getProgram","parameters":[{"$ref":"#\/components\/parameters\/ProgramToken"},{"$ref":"#\/components\/parameters\/IfNoneMatch"}],"responses":{"200":{"description":"Programme d\u00e9taill\u00e9.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ProgramDetailResponse"}}},"headers":{"ETag":{"$ref":"#\/components\/headers\/ETag"}}},"401":{"$ref":"#\/components\/responses\/Unauthorized"},"404":{"$ref":"#\/components\/responses\/NotFound"},"304":{"$ref":"#\/components\/responses\/NotModified"}}}},"\/v1\/programs\/{program}\/lots":{"get":{"tags":["Lots"],"summary":"Lister les lots d'un programme","description":"Liste pagin\u00e9e des lots du programme. Pour un inventaire exhaustif avec annexes et documents, pr\u00e9f\u00e9rez souvent `GET \/v1\/programs\/{program}` ou l'export.","operationId":"listProgramLots","parameters":[{"$ref":"#\/components\/parameters\/ProgramToken"},{"name":"per_page","in":"query","schema":{"type":"integer","default":50,"minimum":1,"maximum":200}},{"$ref":"#\/components\/parameters\/Page"}],"responses":{"200":{"description":"Lots pagin\u00e9s.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/LotListResponse"}}}},"401":{"$ref":"#\/components\/responses\/Unauthorized"},"404":{"$ref":"#\/components\/responses\/NotFound"}}}},"\/v1\/programs\/{program}\/lots\/{lot}":{"get":{"tags":["Lots"],"summary":"Consulter un lot","description":"D\u00e9tail d'un lot (prix, surfaces, \u00e9tats, documents charg\u00e9s).","operationId":"getProgramLot","parameters":[{"$ref":"#\/components\/parameters\/ProgramToken"},{"$ref":"#\/components\/parameters\/LotToken"}],"responses":{"200":{"description":"Lot.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/LotResponse"}}}},"401":{"$ref":"#\/components\/responses\/Unauthorized"},"404":{"$ref":"#\/components\/responses\/NotFound"}}}},"\/v1\/programs\/{program}\/lots\/{lot}\/prices":{"get":{"tags":["Prix"],"summary":"Lister les prix d'un lot","description":"Toutes les lignes de prix actives du lot (immobilier TTC, foncier, travaux, loyers\u2026 selon param\u00e9trage).","operationId":"listLotPrices","parameters":[{"$ref":"#\/components\/parameters\/ProgramToken"},{"$ref":"#\/components\/parameters\/LotToken"}],"responses":{"200":{"description":"Liste des prix.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/PriceListResponse"}}}},"401":{"$ref":"#\/components\/responses\/Unauthorized"},"404":{"$ref":"#\/components\/responses\/NotFound"}}}},"\/v1\/programs\/{program}\/documents":{"get":{"tags":["Documents"],"summary":"Lister les documents d'un programme","description":"Chaque document expose `url` et \u00e9ventuellement `thumbnail_url` (URLs S3 pr\u00e9-sign\u00e9es, **validit\u00e9 24 h**). Renouvelez les URLs en rappelant cet endpoint.","operationId":"listProgramDocuments","parameters":[{"$ref":"#\/components\/parameters\/ProgramToken"}],"responses":{"200":{"description":"Documents du programme.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/DocumentListResponse"}}}},"401":{"$ref":"#\/components\/responses\/Unauthorized"},"404":{"$ref":"#\/components\/responses\/NotFound"}}}},"\/v1\/programs\/{program}\/documents\/{document}":{"get":{"tags":["Documents"],"summary":"Consulter un document de programme","description":"M\u00e9tadonn\u00e9es + URL S3 sign\u00e9e (`url`), validit\u00e9 24 h.","operationId":"getProgramDocument","parameters":[{"$ref":"#\/components\/parameters\/ProgramToken"},{"$ref":"#\/components\/parameters\/DocumentToken"}],"responses":{"200":{"description":"Document.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/DocumentResponse"}}}},"401":{"$ref":"#\/components\/responses\/Unauthorized"},"404":{"$ref":"#\/components\/responses\/NotFound"}}}},"\/v1\/programs\/{program}\/images":{"get":{"tags":["Images"],"summary":"Lister les images d'un programme","description":"Liste des images du programme, tri\u00e9es par `order`.\n\nChaque \u00e9l\u00e9ment : `id`, `type`, `order`, `urls.large` \/ `medium` \/ `small` (URLs S3 pr\u00e9-sign\u00e9es, 24 h).\n\nDans l'export programme, le bloc `images` est group\u00e9 par taille (`large[]`, `medium[]`, `small[]`).","operationId":"listProgramImages","parameters":[{"$ref":"#\/components\/parameters\/ProgramToken"}],"responses":{"200":{"description":"Liste des images avec URLs sign\u00e9es.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ProgramImageListResponse"},"examples":{"exemple":{"summary":"Deux photos de programme","value":{"data":[{"id":1842,"type":"facade","order":0,"urls":{"large":"https:\/\/s3.example\/media\/1842\/large.jpg?X-Amz-Expires=86400","medium":"https:\/\/s3.example\/media\/1842\/medium.jpg?X-Amz-Expires=86400","small":"https:\/\/s3.example\/media\/1842\/small.jpg?X-Amz-Expires=86400"}},{"id":1843,"type":"perspective","order":1,"urls":{"large":"https:\/\/s3.example\/media\/1843\/large.jpg?X-Amz-Expires=86400","medium":"https:\/\/s3.example\/media\/1843\/medium.jpg?X-Amz-Expires=86400","small":"https:\/\/s3.example\/media\/1843\/small.jpg?X-Amz-Expires=86400"}}]}}}}}},"401":{"$ref":"#\/components\/responses\/Unauthorized"},"404":{"$ref":"#\/components\/responses\/NotFound"}}}},"\/v1\/programs\/{program}\/lots\/{lot}\/documents":{"get":{"tags":["Documents"],"summary":"Lister les documents d'un lot","description":"Documents rattach\u00e9s au lot (plans de lot, fiches\u2026). URLs S3 sign\u00e9es, validit\u00e9 24 h.","operationId":"listLotDocuments","parameters":[{"$ref":"#\/components\/parameters\/ProgramToken"},{"$ref":"#\/components\/parameters\/LotToken"}],"responses":{"200":{"description":"Documents du lot.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/DocumentListResponse"}}}},"401":{"$ref":"#\/components\/responses\/Unauthorized"},"404":{"$ref":"#\/components\/responses\/NotFound"}}}},"\/v1\/sample\/export":{"get":{"tags":["Programmes"],"summary":"Export d'exemple (sans authentification)","description":"Exemple de payload d'export, sans authentification.","operationId":"getSampleExport","security":[],"responses":{"200":{"description":"Exemple d'export.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ProgramExportResponse"}}}}}}}}}