API REST Ts-Immo
Référence de l'API Client REST Ts-Immo — tous les endpoints exposés sous /v1/gateway/, leur authentification, leurs paramètres et des exemples concrets.
URL de base
https://api.ts-immo.org/v1/gatewayTous les endpoints de l'API Client sont servis sous le préfixe /v1/gateway/. Les réponses sont au format JSON, les identifiants sont des UUID v4 et les dates suivent le format ISO 8601.
Authentification
Chaque appel doit porter un token actif. L'API Client accepte indifféremment un bearer OAuth2 (flux utilisateur) ou un API Token (usage programmatique, ex. le plugin WordPress).
# OAuth2 Bearer (user flow)
Authorization: Bearer <access_token>
# API Token (programmatic, e.g. WordPress plugin)
Authorization: Bearer <api_token>
# or:
X-TS-IMMO-KEY: <api_token>Les deux formats sont introspectés par ts-identity. Aucune contrainte de scope n'est imposée : tout token actif est accepté. Le filtrage des ressources s'appuie sur les item_ids et le client_id portés par le token — une requête dont le token ne porte aucun item_id ne matche aucune annonce.
Conventions
Tous les noms de champs JSON (requêtes et réponses) sont en snake_case. Les paramètres de requête (query) restent en camelCase (ex. ?crmReference=…, ?gatewayId=…). Les champs null sont omis des réponses. Les dates sont en ISO 8601 (ex. 2026-01-15T10:00:00Z).
Endpoints
Passerelles
Cycle de vie complet des passerelles : création, mise à jour, activation, validation, suppression, délégation à d'autres clients et métadonnées libres. Le client_id est extrait du token.
/v1/gateway/gatewaysLister les passerelles possédées/v1/gateway/gatewaysCréer une passerelle/v1/gateway/gateways/{id}Détail d'une passerelle/v1/gateway/gateways/{id}Remplacer une passerelle/v1/gateway/gateways/{id}Mettre à jour partiellement/v1/gateway/gateways/{id}/enableActiver (ACTIVE)/v1/gateway/gateways/{id}/pauseMettre en pause (PAUSED)/v1/gateway/gateways/{id}/validateValider et activer/v1/gateway/gateways/{id}Supprimer une passerelle/v1/gateway/gateways/delegatedLister les passerelles déléguées au caller/v1/gateway/gateways/{id}/delegationsCréer une délégation (owner)/v1/gateway/gateways/{id}/delegationsLister les délégations actives/v1/gateway/gateways/{id}/delegations/{delegateClientId}Révoquer une délégation/v1/gateway/gateways/{id}/metadataLire les métadonnées/v1/gateway/gateways/{id}/metadataRemplacer les métadonnées/v1/gateway/gateways/{id}/metadataFusionner des métadonnéesSynchronisations
Déclenchement et suivi des jobs de synchronisation d'une passerelle, annulation, et rejeu de la phase de sortie sans re-solliciter le CRM.
/v1/gateway/gateways/{id}/sync-jobsLister les synchronisations/v1/gateway/gateways/{id}/sync-jobs/{jobId}Détail d'un job/v1/gateway/gateways/{id}/sync-jobs/{jobId}/progressProgression d'un job/v1/gateway/gateways/{id}/sync-jobsDéclencher une synchronisation/v1/gateway/gateways/{id}/sync-jobs/{jobId}/cancelAnnuler une synchronisation/v1/gateway/gateways/{id}/output-replayRejouer la sortie (sans CRM)Audit
Consultation des événements de gestion d'une passerelle et de l'intégralité des événements d'un run de synchronisation.
/v1/gateway/gateways/{id}/audit-eventsÉvénements de gestion de la passerelle/v1/gateway/gateways/{id}/sync-jobs/{jobId}/audit-eventsÉvénements d'un run de synchronisationAnnonces
Lecture des annonces synchronisées : liste, détail, modèle CRM brut, vignette de couverture et déclaration de l'URL publiée.
/v1/gateway/propertiesLister les annonces du token/v1/gateway/gateways/{id}/propertiesLister les annonces d'une passerelle/v1/gateway/properties/{id}Détail d'une annonce/v1/gateway/properties/{id}Test d'existence + Last-Modified/v1/gateway/properties/{id}/crm-modelModèle CRM brut (redirection)/v1/gateway/public/properties/{id}/coverVignette de couverture (redirection)/v1/gateway/properties/{id}/urlDéfinir l'URL publiéeRecherche assistée par IA
Recherche de biens en langage naturel : la requête est traduite en filtre MongoDB par un LLM, validé contre une whitelist stricte et isolé par passerelle.
/v1/gateway/properties/search/aiRecherche en langage naturelAnciens biens
Exploration des biens retirés de la collection live (suppression de passerelle, nettoyage des orphelins, suppression staff) conservés en cold-storage. Lecture seule, restreinte aux passerelles du token.
/v1/gateway/properties/deletedRechercher dans ses anciens biens/v1/gateway/properties/deleted/{archiveId}Consulter un ancien bienTemplates de mapping
Gestion des templates de mapping WordPress (postmeta, taxonomies, statuts) : templates par défaut et templates personnels du client (création, modification, duplication).
/v1/gateway/templatesLister les templates/v1/gateway/templates/{id}Détail d'un template/v1/gateway/templatesCréer un template personnel/v1/gateway/templates/{id}Modifier un template/v1/gateway/templates/{id}Supprimer un template/v1/gateway/templates/{id}/duplicateDupliquer un templatePlugins
Extensions PHP mono-fichier téléchargeables pour le plugin WordPress Ts-Immo Sync. L'accès est filtré automatiquement par le plan du token.
/v1/gateway/pluginsLister les plugins disponibles/v1/gateway/plugins/{id}Détail d'un plugin/v1/gateway/plugins/{id}/downloadTélécharger le fichier du pluginPlugin Manager
Endpoints consommés par le hub WordPress Ts-Immo Plugin Manager : pairing de site, catalogue d'addons signés, téléchargement, télémétrie et proxy de ticket support. Auth : token agence.
/v1/gateway/plugin-manager/site/registerPairing / vérification de licence/v1/gateway/plugin-manager/catalogCatalogue d'addons + kill-switch/v1/gateway/plugin-manager/{code}/downloadTélécharger un addon (zip signé)/v1/gateway/plugin-manager/auditPush du buffer d'audit/v1/gateway/plugin-manager/fatalRemontée des erreurs fatales/v1/gateway/support/ticketsCréer un ticket support (proxy)Activation de site
Endpoint appelé par le plugin WordPress Ts-Immo Sync à son activation pour enregistrer sa clé d'authentification et récupérer les détails du plan.
/v1/gateway/site/activateActiver un site WordPressTemplates PDF
Templates de mise en forme des fiches PDF des biens. Cinq templates prédéfinis (luxe, design, standard, minimal, vitrine) plus les templates personnalisés.
/v1/gateway/pdf-templatesLister les templates PDF/v1/gateway/pdf-templates/{id}Récupérer un template PDFEstimations de prix
Service d'estimation immobilière ancré sur les données DVF (vente et location). La passerelle facturée est résolue depuis le token (addon ESTIMATION ou ESTIMATION_IA requis).
/v1/gateway/estimationsÉmettre une estimationLeads
Lecture des prospects capturés via le bloc lead des estimations. La passerelle est résolue depuis le token (addon ESTIMATION requis).
/v1/gateway/leadsLister les leads de la passerellePortails de syndication
Inscription et désinscription d'une passerelle aux portails partenaires configurés en back-office. Vérifie l'ownership et l'addon associé au portail.
/v1/gateway/gateways/{id}/portalsLister les portails + état d'enrolment/v1/gateway/gateways/{id}/portals/{portalCode}/enrollInscrire la passerelle au portail/v1/gateway/gateways/{id}/portals/{portalCode}/enrollDésinscrire du portailAddons
Catalogue des addons proposés pour le market de la passerelle, avec leur statut d'activation, et souscription / désouscription (Stripe via ts-identity).
/v1/gateway/gateways/{id}/addonsLister les addons + statut/v1/gateway/gateways/{id}/addons/{addonCode}Souscrire un addon/v1/gateway/gateways/{id}/addons/{addonCode}Désouscrire un addonFactures
Factures Stripe rattachées au propriétaire de la passerelle. Réservé à l'owner et aux délégués FULL_ACCESS.
/v1/gateway/gateways/{id}/invoicesLister les factures/v1/gateway/gateways/{id}/invoices/{invoiceId}Récupérer une factureEnsoleillement
Analyse de l'exposition solaire annuelle d'un bien (JSON ou rapport PDF). Addon SOLAR_EXPOSURE requis côté passerelle.
/v1/gateway/properties/{id}/sunlightAnalyse d'ensoleillement (JSON)/v1/gateway/properties/{id}/sunlight/pdfRapport d'ensoleillement (PDF)DVF (open-data)
Transactions immobilières open-data (Demandes de Valeurs Foncières) : recherche par filtres, par disque géographique, et détail d'une mutation. Addon DVF requis.
/v1/gateway/dvfRecherche DVF par filtres/v1/gateway/dvf/{id}Détail d'une mutation DVF/v1/gateway/dvf/geoRecherche DVF par disque géographiqueInsights
Analytics comportemental des visiteurs et scoring d'intention pour les sites équipés de l'extension ts-immo-insights. Lectures dashboard paginées (jamais les events bruts). Addon INSIGHTS requis. La passerelle est passée dans le path.
/v1/gateway/insights/{gatewayId}/overviewAperçu dashboard/v1/gateway/insights/{gatewayId}/funnelEntonnoir de conversion/v1/gateway/insights/{gatewayId}/properties/topClassement des biens/v1/gateway/insights/{gatewayId}/properties/diagnosticsDiagnostic de performance des biens/v1/gateway/insights/{gatewayId}/market/demandDemande du marché/v1/gateway/insights/{gatewayId}/leads/attributionAttribution de canal des leads/v1/gateway/insights/{gatewayId}/leadsVisiteurs scorés / leads de la fenêtre/v1/gateway/insights/{gatewayId}/leads/{visitorId}Détail d'un visiteur/v1/gateway/insights/{gatewayId}/properties/{propertyUuid}Détail d'un bien (insights)/v1/gateway/insights/{gatewayId}/properties/{propertyUuid}/owner-reportRapport propriétaire (hebdo)/v1/gateway/insights/{gatewayId}/properties/{propertyUuid}/leadsProspects intéressés par un bien/v1/gateway/insights/{gatewayId}/properties/{propertyUuid}/matching-leadsAcquéreurs en attente pour un bien/v1/gateway/insights/{gatewayId}/leads/{leadId}/matching-propertiesBiens correspondant à un acquéreur/v1/gateway/insights/{gatewayId}/leads/{leadId}/outcomeRenseigner l'issue d'un lead/v1/gateway/insights/{gatewayId}/roiROI closed-loopPréférences de notification
Activation / désactivation des emails automatiques par catégorie (sync, cycle de vie, délégation, site). Une seule entrée par client, partagée par toutes ses passerelles.
/v1/gateway/notification-preferencesLire les préférences de notification/v1/gateway/notification-preferencesMettre à jour les préférencesDétail des endpoints clés
Les endpoints les plus utilisés sont détaillés ci-dessous avec leurs paramètres, corps de requête et exemples de réponse.
POST/v1/gateway/gateways
Crée une passerelle pour le client authentifié. L'item_id fourni doit faire partie des item_ids du token. Le plan est automatiquement extrait du token.
Corps de la requête
| Param | Type | Req. | Description |
|---|---|---|---|
item_id | string | * | Identifiant de l'item (doit faire partie des item_ids du token) |
name | string | * | Nom de la passerelle |
market | string | * | Code du market (ex. fr, de, us) |
category | string | * | Code de la catégorie (ex. professional, agency) |
mode | PROD | TEST | — | Mode opérationnel. Défaut : PROD |
input_connector | ConnectorRef | * | Connecteur d'entrée primaire (CRM) |
output_connectors | ConnectorRef[] | — | Connecteurs de sortie |
input_connectors | ConnectorRef[] | — | Liste des connecteurs d'entrée (mode multi-input, addon MULTI_INPUTS) |
logo_url | string | — | URL absolue du logo (auto-détectée si vide) |
{
"item_id": "item-123",
"name": "Apimo -> WordPress",
"market": "fr",
"category": "professional",
"mode": "PROD",
"input_connector": {
"connector_type": "APIMO",
"connector_id": "770e8400-e29b-41d4-a716-446655440000",
"config": { "api_key": "apimo-api-key", "provider": "12345" }
},
"output_connectors": [
{
"connector_type": "TS_SYNC",
"connector_id": "880e8400-e29b-41d4-a716-446655440000",
"config": {
"url": "https://www.your-agency.com",
"plugin_auth_key": "your-plugin-auth-key"
}
}
]
}Réponse 201 Created — la passerelle créée et un API Token généré pour usage programmatique (ex. plugin WordPress), nullable :
{
"gateway": { "id": "660e8400-...", "item_id": "item-123", "status": "DRAFT", "...": "..." },
"access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...."
}POST/v1/gateway/gateways/{id}/sync-jobs
Crée et démarre immédiatement un job de synchronisation. La passerelle doit être en statut ACTIVE.
| Param | Type | Req. | Description |
|---|---|---|---|
id | string | * | Identifiant de la passerelle |
crmReference | string (query) | — | Ne synchroniser que le bien dont la crm_reference correspond, sans nettoyage des orphelins |
force | boolean (query) | — | Si true, ré-écrit tout le catalogue en mode FORCED_FULL. Défaut : false |
# Full sync
curl -X POST "https://api.ts-immo.org/v1/gateway/gateways/GATEWAY_ID/sync-jobs" \
-H "Authorization: Bearer YOUR_TOKEN"
# Single-property sync
curl -X POST "https://api.ts-immo.org/v1/gateway/gateways/GATEWAY_ID/sync-jobs?crmReference=REF-12345" \
-H "X-TS-IMMO-KEY: your-api-token"GET/v1/gateway/properties
Retourne les annonces associées aux passerelles liées aux item_ids du token (y compris les passerelles déléguées). Aucun paramètre : le filtrage est automatique.
Réponse 200 OK — un tableau de TsImmoProperty (modèle immobilier normalisé, champs en snake_case, champs null omis) :
[
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"gateway_id": "660e8400-e29b-41d4-a716-446655440000",
"stream_id": "770e8400-e29b-41d4-a716-446655440000",
"crm_source": "apimo",
"reference": "REF-12345",
"crm_reference": "CRM-12345",
"type": "apartment",
"sub_type": "duplex",
"offer_type": "sale",
"status": "available",
"title": { "fr": "Bel appartement 3 pièces", "en": "Beautiful 3-room apartment" },
"description": { "fr": "Lumineux duplex traversant...", "en": "Bright through-duplex..." },
"bedrooms": 2,
"bathrooms": 1,
"floor": "3",
"orientation": "S",
"financial": {
"transaction": {
"price": { "amount": 350000, "currency": "EUR" }
}
},
"location": {
"city": "Paris",
"postal_code": "75001",
"countryCode": "FR",
"geo": { "latitude": 48.8566, "longitude": 2.3522 }
},
"sizes": {
"liveable_area": { "size": 75.5, "unit": "sq_m" }
},
"images": [
{ "url": "https://cdn.example.com/photo1.jpg", "ordinal": 0 }
],
"property_url": "https://www.your-agency.com/property/apartment-paris",
"cover_thumbnail": "https://cdn.example.com/photo1-thumb.jpg",
"created_at": "2026-01-01T00:00:00Z",
"updated_at": "2026-01-15T10:00:00Z",
"fetched_at": "2026-01-15T10:00:00Z"
}
]PUT/v1/gateway/properties/{id}/url
Callback utilisé par le plugin client pour renseigner l'URL de la page publiée d'un bien après synchronisation. Met à jour le champ property_url.
| Param | Type | Req. | Description |
|---|---|---|---|
id | string | * | Identifiant UUID de l'annonce |
url | string (body) | * | URL publique de l'annonce sur le site client |
curl -X PUT "https://api.ts-immo.org/v1/gateway/properties/PROPERTY_ID/url" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "url": "https://www.your-agency.com/property/apartment-t3-paris" }'POST/v1/gateway/properties/search/ai
Recherche de biens en langage naturel. L'input est traité comme hostile : caractères de contrôle supprimés, longueur tronquée à 500, sortie du LLM validée contre une whitelist. Le filtre gateway_id est toujours forcé depuis le token.
| Param | Type | Req. | Description |
|---|---|---|---|
query | string (body) | * | Recherche en langage naturel (max 500 caractères) |
curl -X POST "https://api.ts-immo.org/v1/gateway/properties/search/ai" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "query": "3-bedroom apartment near Lyon, max 500000 EUR, with a pool" }'La réponse retourne les biens correspondants (max 50), le nombre total et le filtre MongoDB généré (pour transparence) :
{
"results": [ { "id": "...", "type": "apartment", "offer_type": "sale", "...": "..." } ],
"total_count": 5,
"filter": {
"type": "apartment",
"bedrooms": { "$gte": 3 },
"amenities": { "$all": ["pool"] },
"financial.transaction.price.amount": { "$lte": 500000 }
}
}POST/v1/gateway/site/activate
Valide qu'au moins une passerelle du client possède un connecteur de sortie TS_SYNC dont l'URL correspond au domaine. Si trouvée, le plugin_auth_key est propagé et un enregistrement d'activation est créé.
| Param | Type | Req. | Description |
|---|---|---|---|
domain | string | * | URL racine du site WordPress (ex. https://votre-site.fr) |
plugin_auth_key | string | * | Clé d'authentification générée par le plugin |
theme_id | string | — | Identifiant du thème WordPress actif (optionnel) |
Exemple de réponse :
{
"success": true,
"status": "activated",
"domain": "https://your-site.com",
"activated_at": "2026-03-26T10:00:00Z",
"plan": "pro",
"expires_at": "2027-03-26T00:00:00Z",
"biens_max": 500
}POST/v1/gateway/estimations
Émet une estimation de prix ancrée DVF. Le caller ne passe aucun identifiant de passerelle : elle est résolue depuis le token. Au moins (address | postal_code) ou (latitude, longitude) doit être fourni — l'adresse géocodée l'emporte sur les coordonnées.
| Param | Type | Req. | Description |
|---|---|---|---|
property_type | enum | * | apartment, house, land, commercial, office, parking, building, program, goodwill, other |
offer_type | enum | * | sale, rental, auction, seasonal_rental, program, life_annuity_sale, lease_transfer, leasehold |
liveable_area_sqm | number | * | Surface habitable en m² (entre 5 et 10 000) |
address / postal_code | string | — | Adresse libre ou code postal. Source prioritaire pour le géocodage. |
latitude, longitude | number | — | Coordonnées de secours, utilisées uniquement si aucune adresse n'est fournie |
rooms, bedrooms, ... | integer | — | Caractéristiques optionnelles affinant l'estimation (pièces, étage, garages, DPE, état, etc.) |
lead | object | — | Bloc optionnel de capture de prospect (first_name, last_name, email, project_timeframe_months) |
with_commentary | boolean | — | Joint un commentaire IA en français (réservé à l'addon ESTIMATION_IA) |
{
"property_type": "house",
"offer_type": "sale",
"liveable_area_sqm": 120,
"address": "10 Rue de la République, 74300 Cluses",
"postal_code": "74300",
"construction_year": 1985,
"epc_category": "B",
"with_commentary": true
}Réponse 200 OK — fourchette centrale / basse / haute, niveau de confiance, ajustements appliqués, comparables et (sur ESTIMATION_IA) un commentaire :
{
"request_id": "8c1c0c5e-...",
"offer_type": "sale",
"central": { "total": 415000, "price_per_sqm": 3458, "currency": "EUR" },
"low_bound": { "total": 385000, "price_per_sqm": 3208, "currency": "EUR" },
"high_bound":{ "total": 448000, "price_per_sqm": 3733, "currency": "EUR" },
"confidence": { "level": "MEDIUM", "sample_size": 17, "final_radius_km": 1.5 },
"adjustments": [ { "code": "DPE_A_B", "percent": 0.03 } ],
"top_comparables": [ { "source": "DVF", "sold_price": 395000, "price_per_sqm": 3291 } ]
}GET/v1/gateway/leads
Liste paginée des prospects capturés via le bloc lead des estimations, triés par date de création décroissante.
| Param | Type | Req. | Description |
|---|---|---|---|
page | integer (query) | — | Index de page zéro-based. Défaut : 0 |
size | integer (query) | — | Taille de page (1..200). Défaut : 50 |
{
"items": [
{
"id": "uuid",
"first_name": "Marie",
"last_name": "Dupont",
"email": "marie.dupont@example.com",
"project_timeframe_months": 6,
"offer_type": "SALE",
"property_type": "HOUSE",
"estimated_central_total": 415000,
"currency": "EUR",
"created_at": "2026-05-02T23:14:58Z"
}
],
"page": 0,
"size": 50,
"total_elements": 87,
"total_pages": 2
}POST/v1/gateway/gateways/{id}/addons/{addonCode}
Achète l'addon pour la passerelle. Le prix est résolu côté serveur depuis le catalogue. Idempotent : si l'addon est déjà actif, le purchase existant est retourné. Réservé à l'owner ou au délégué FULL_ACCESS.
| Param | Type | Req. | Description |
|---|---|---|---|
id | string | * | Identifiant de la passerelle |
addonCode | string | * | Code de l'addon dans le catalogue ts-identity |
period | MONTHLY | ANNUAL | * | Cadence d'abonnement |
currency | string | * | Code ISO ; doit exister dans le tarif de l'addon |
metadata | object | — | Métadonnées opaques transmises à ts-identity |
curl -X POST "https://api.ts-immo.org/v1/gateway/gateways/GATEWAY_ID/addons/ESTIMATION" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "period": "MONTHLY", "currency": "EUR" }'GET/v1/gateway/insights/{gatewayId}/overview
Aperçu dashboard sur une fenêtre. gatewayId est passé dans le path et vérifié contre le scope du token ; l'addon INSIGHTS doit être actif (sinon 409). Inclut la comparaison avec la fenêtre précédente.
| Param | Type | Req. | Description |
|---|---|---|---|
gatewayId | string | * | Identifiant de la passerelle |
from | date (query) | — | Borne basse de la fenêtre (ISO date). Défaut : to - 29j |
to | date (query) | — | Borne haute incluse. Défaut : aujourd'hui (UTC) |
{
"unique_visitors": 1432,
"sessions": 1879,
"page_views": 5421,
"leads": 28,
"conversion_rate": 0.0195,
"hot_leads": 7,
"urgent_leads": 2,
"series": [
{ "date": "2026-05-01", "unique_visitors": 52, "sessions": 67, "page_views": 198, "leads": 1 }
]
}PATCH/v1/gateway/notification-preferences
Mise à jour partielle des préférences. Chaque champ est optionnel : un champ omis ou null ne modifie pas la valeur en base. Les valeurs par défaut sont toutes à true (opt-out).
| Param | Type | Req. | Description |
|---|---|---|---|
sync | boolean | — | Emails de synchronisation (terminée, dépassement, timeout, désactivation) |
gateway_lifecycle | boolean | — | Emails de cycle de vie de la passerelle (création, suppression, validation, pause…) |
delegation | boolean | — | Emails de délégation (accordée à l'owner / au délégué) |
site | boolean | — | Emails d'activation de site |
curl -X PATCH "https://api.ts-immo.org/v1/gateway/notification-preferences" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "sync": false }'Codes d'erreur
Les erreurs suivent l'enveloppe standard partagée par toutes les APIs ts-services : un message lisible, un code machine, un timestamp et un détail optionnel.
{
"message": "Human-readable message",
"code": "ERROR_CODE",
"timestamp": "2026-04-18T10:00:00Z",
"detail": "Optional technical detail, may be null"
}| Param | Type | Req. | Description |
|---|---|---|---|
200 / 201 / 204 | — | Succès (200 OK, 201 Created, 204 No Content) | |
302 | — | Redirection vers une URL pré-signée (modèle CRM, vignette de couverture) | |
400 | BAD_REQUEST | — | Validation : argument manquant, mal formé ou hors plage |
401 | AUTH_FAILED | — | Token manquant, invalide ou expiré |
403 | FORBIDDEN | — | Route non autorisée ou écriture sur une ressource par défaut |
404 | NOT_FOUND | — | Ressource introuvable (ou hors du périmètre du token) |
409 | CONFLICT | — | Conflit d'état métier (ex. job déjà en cours, theme_id déjà utilisé) |
422 | — | Entité non traitable (ex. passerelle sans client_id, bien sans coordonnées) | |
503 | DOWNSTREAM_ERROR | — | Service externe indisponible (ts-identity, CRM, S3, Mistral…) |