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/gateway

Tous 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.

Ne partagez jamais votre API Token. Utilisez des variables d'environnement et des secrets côté serveur uniquement.

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.

GET/v1/gateway/gatewaysLister les passerelles possédées
POST/v1/gateway/gatewaysCréer une passerelle
GET/v1/gateway/gateways/{id}Détail d'une passerelle
PUT/v1/gateway/gateways/{id}Remplacer une passerelle
PATCH/v1/gateway/gateways/{id}Mettre à jour partiellement
POST/v1/gateway/gateways/{id}/enableActiver (ACTIVE)
POST/v1/gateway/gateways/{id}/pauseMettre en pause (PAUSED)
POST/v1/gateway/gateways/{id}/validateValider et activer
DELETE/v1/gateway/gateways/{id}Supprimer une passerelle
GET/v1/gateway/gateways/delegatedLister les passerelles déléguées au caller
POST/v1/gateway/gateways/{id}/delegationsCréer une délégation (owner)
GET/v1/gateway/gateways/{id}/delegationsLister les délégations actives
DELETE/v1/gateway/gateways/{id}/delegations/{delegateClientId}Révoquer une délégation
GET/v1/gateway/gateways/{id}/metadataLire les métadonnées
PUT/v1/gateway/gateways/{id}/metadataRemplacer les métadonnées
PATCH/v1/gateway/gateways/{id}/metadataFusionner des métadonnées

Synchronisations

Déclenchement et suivi des jobs de synchronisation d'une passerelle, annulation, et rejeu de la phase de sortie sans re-solliciter le CRM.

GET/v1/gateway/gateways/{id}/sync-jobsLister les synchronisations
GET/v1/gateway/gateways/{id}/sync-jobs/{jobId}Détail d'un job
GET/v1/gateway/gateways/{id}/sync-jobs/{jobId}/progressProgression d'un job
POST/v1/gateway/gateways/{id}/sync-jobsDéclencher une synchronisation
POST/v1/gateway/gateways/{id}/sync-jobs/{jobId}/cancelAnnuler une synchronisation
POST/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.

GET/v1/gateway/gateways/{id}/audit-eventsÉvénements de gestion de la passerelle
GET/v1/gateway/gateways/{id}/sync-jobs/{jobId}/audit-eventsÉvénements d'un run de synchronisation

Annonces

Lecture des annonces synchronisées : liste, détail, modèle CRM brut, vignette de couverture et déclaration de l'URL publiée.

GET/v1/gateway/propertiesLister les annonces du token
GET/v1/gateway/gateways/{id}/propertiesLister les annonces d'une passerelle
GET/v1/gateway/properties/{id}Détail d'une annonce
HEAD/v1/gateway/properties/{id}Test d'existence + Last-Modified
GET/v1/gateway/properties/{id}/crm-modelModèle CRM brut (redirection)
GET/v1/gateway/public/properties/{id}/coverVignette de couverture (redirection)
PUT/v1/gateway/properties/{id}/urlDéfinir l'URL publiée

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.

POST/v1/gateway/properties/search/aiRecherche en langage naturel

Anciens 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.

GET/v1/gateway/properties/deletedRechercher dans ses anciens biens
GET/v1/gateway/properties/deleted/{archiveId}Consulter un ancien bien

Templates de mapping

Gestion des templates de mapping WordPress (postmeta, taxonomies, statuts) : templates par défaut et templates personnels du client (création, modification, duplication).

GET/v1/gateway/templatesLister les templates
GET/v1/gateway/templates/{id}Détail d'un template
POST/v1/gateway/templatesCréer un template personnel
PUT/v1/gateway/templates/{id}Modifier un template
DELETE/v1/gateway/templates/{id}Supprimer un template
POST/v1/gateway/templates/{id}/duplicateDupliquer un template

Plugins

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.

GET/v1/gateway/pluginsLister les plugins disponibles
GET/v1/gateway/plugins/{id}Détail d'un plugin
GET/v1/gateway/plugins/{id}/downloadTélécharger le fichier du plugin

Plugin 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.

POST/v1/gateway/plugin-manager/site/registerPairing / vérification de licence
GET/v1/gateway/plugin-manager/catalogCatalogue d'addons + kill-switch
GET/v1/gateway/plugin-manager/{code}/downloadTélécharger un addon (zip signé)
POST/v1/gateway/plugin-manager/auditPush du buffer d'audit
POST/v1/gateway/plugin-manager/fatalRemontée des erreurs fatales
POST/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.

POST/v1/gateway/site/activateActiver un site WordPress

Templates 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.

GET/v1/gateway/pdf-templatesLister les templates PDF
GET/v1/gateway/pdf-templates/{id}Récupérer un template PDF

Estimations 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).

POST/v1/gateway/estimationsÉmettre une estimation

Leads

Lecture des prospects capturés via le bloc lead des estimations. La passerelle est résolue depuis le token (addon ESTIMATION requis).

GET/v1/gateway/leadsLister les leads de la passerelle

Portails 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.

GET/v1/gateway/gateways/{id}/portalsLister les portails + état d'enrolment
POST/v1/gateway/gateways/{id}/portals/{portalCode}/enrollInscrire la passerelle au portail
DELETE/v1/gateway/gateways/{id}/portals/{portalCode}/enrollDésinscrire du portail

Addons

Catalogue des addons proposés pour le market de la passerelle, avec leur statut d'activation, et souscription / désouscription (Stripe via ts-identity).

GET/v1/gateway/gateways/{id}/addonsLister les addons + statut
POST/v1/gateway/gateways/{id}/addons/{addonCode}Souscrire un addon
DELETE/v1/gateway/gateways/{id}/addons/{addonCode}Désouscrire un addon

Factures

Factures Stripe rattachées au propriétaire de la passerelle. Réservé à l'owner et aux délégués FULL_ACCESS.

GET/v1/gateway/gateways/{id}/invoicesLister les factures
GET/v1/gateway/gateways/{id}/invoices/{invoiceId}Récupérer une facture

Ensoleillement

Analyse de l'exposition solaire annuelle d'un bien (JSON ou rapport PDF). Addon SOLAR_EXPOSURE requis côté passerelle.

GET/v1/gateway/properties/{id}/sunlightAnalyse d'ensoleillement (JSON)
GET/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.

GET/v1/gateway/dvfRecherche DVF par filtres
GET/v1/gateway/dvf/{id}Détail d'une mutation DVF
GET/v1/gateway/dvf/geoRecherche DVF par disque géographique

Insights

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.

GET/v1/gateway/insights/{gatewayId}/overviewAperçu dashboard
GET/v1/gateway/insights/{gatewayId}/funnelEntonnoir de conversion
GET/v1/gateway/insights/{gatewayId}/properties/topClassement des biens
GET/v1/gateway/insights/{gatewayId}/properties/diagnosticsDiagnostic de performance des biens
GET/v1/gateway/insights/{gatewayId}/market/demandDemande du marché
GET/v1/gateway/insights/{gatewayId}/leads/attributionAttribution de canal des leads
GET/v1/gateway/insights/{gatewayId}/leadsVisiteurs scorés / leads de la fenêtre
GET/v1/gateway/insights/{gatewayId}/leads/{visitorId}Détail d'un visiteur
GET/v1/gateway/insights/{gatewayId}/properties/{propertyUuid}Détail d'un bien (insights)
GET/v1/gateway/insights/{gatewayId}/properties/{propertyUuid}/owner-reportRapport propriétaire (hebdo)
GET/v1/gateway/insights/{gatewayId}/properties/{propertyUuid}/leadsProspects intéressés par un bien
GET/v1/gateway/insights/{gatewayId}/properties/{propertyUuid}/matching-leadsAcquéreurs en attente pour un bien
GET/v1/gateway/insights/{gatewayId}/leads/{leadId}/matching-propertiesBiens correspondant à un acquéreur
PUT/v1/gateway/insights/{gatewayId}/leads/{leadId}/outcomeRenseigner l'issue d'un lead
GET/v1/gateway/insights/{gatewayId}/roiROI closed-loop

Pré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.

GET/v1/gateway/notification-preferencesLire les préférences de notification
PATCH/v1/gateway/notification-preferencesMettre à jour les préférences

Dé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

ParamTypeReq.Description
item_idstring*Identifiant de l'item (doit faire partie des item_ids du token)
namestring*Nom de la passerelle
marketstring*Code du market (ex. fr, de, us)
categorystring*Code de la catégorie (ex. professional, agency)
modePROD | TESTMode opérationnel. Défaut : PROD
input_connectorConnectorRef*Connecteur d'entrée primaire (CRM)
output_connectorsConnectorRef[]Connecteurs de sortie
input_connectorsConnectorRef[]Liste des connecteurs d'entrée (mode multi-input, addon MULTI_INPUTS)
logo_urlstringURL 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.

ParamTypeReq.Description
idstring*Identifiant de la passerelle
crmReferencestring (query)Ne synchroniser que le bien dont la crm_reference correspond, sans nettoyage des orphelins
forceboolean (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"
Sans paramètre, une synchronisation complète (FULL) est lancée. crmReference ne dispatche qu'un seul bien et saute le nettoyage des orphelins. force=true ré-écrit l'intégralité du catalogue (FORCED_FULL). Un 409 est renvoyé si un job est déjà en cours.

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"
  }
]
Le modèle TsImmoProperty compte plus de 90 champs (financier, localisation, surfaces détaillées, équipements, mandat, copropriété, diagnostics…). Seuls les champs principaux sont montrés ici ; les textes (title, description, uri) sont multilingues (I18nText), les prix sont des objets { amount, currency } et les surfaces des objets { size, unit } (unit ∈ sq_m, sq_ft, are, acre).

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.

ParamTypeReq.Description
idstring*Identifiant UUID de l'annonce
urlstring (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" }'

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.

ParamTypeReq.Description
querystring (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éé.

ParamTypeReq.Description
domainstring*URL racine du site WordPress (ex. https://votre-site.fr)
plugin_auth_keystring*Clé d'authentification générée par le plugin
theme_idstringIdentifiant 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
}
Renvoie 422 no_matching_gateway si aucune passerelle TS_SYNC ne correspond au domaine. Le propriétaire de la passerelle est notifié par email.

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.

Deux niveaux : ESTIMATION (algorithme seul) et ESTIMATION_IA (superset, avec un commentaire IA en français quand with_commentary=true). Le body doit être en snake_case, sinon les champs requis échouent en 400.
ParamTypeReq.Description
property_typeenum*apartment, house, land, commercial, office, parking, building, program, goodwill, other
offer_typeenum*sale, rental, auction, seasonal_rental, program, life_annuity_sale, lease_transfer, leasehold
liveable_area_sqmnumber*Surface habitable en m² (entre 5 et 10 000)
address / postal_codestringAdresse libre ou code postal. Source prioritaire pour le géocodage.
latitude, longitudenumberCoordonnées de secours, utilisées uniquement si aucune adresse n'est fournie
rooms, bedrooms, ...integerCaractéristiques optionnelles affinant l'estimation (pièces, étage, garages, DPE, état, etc.)
leadobjectBloc optionnel de capture de prospect (first_name, last_name, email, project_timeframe_months)
with_commentarybooleanJoint 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.

ParamTypeReq.Description
pageinteger (query)Index de page zéro-based. Défaut : 0
sizeinteger (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.

ParamTypeReq.Description
idstring*Identifiant de la passerelle
addonCodestring*Code de l'addon dans le catalogue ts-identity
periodMONTHLY | ANNUAL*Cadence d'abonnement
currencystring*Code ISO ; doit exister dans le tarif de l'addon
metadataobjectMé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.

ParamTypeReq.Description
gatewayIdstring*Identifiant de la passerelle
fromdate (query)Borne basse de la fenêtre (ISO date). Défaut : to - 29j
todate (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).

ParamTypeReq.Description
syncbooleanEmails de synchronisation (terminée, dépassement, timeout, désactivation)
gateway_lifecyclebooleanEmails de cycle de vie de la passerelle (création, suppression, validation, pause…)
delegationbooleanEmails de délégation (accordée à l'owner / au délégué)
sitebooleanEmails 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"
}
ParamTypeReq.Description
200 / 201 / 204Succès (200 OK, 201 Created, 204 No Content)
302Redirection vers une URL pré-signée (modèle CRM, vignette de couverture)
400BAD_REQUESTValidation : argument manquant, mal formé ou hors plage
401AUTH_FAILEDToken manquant, invalide ou expiré
403FORBIDDENRoute non autorisée ou écriture sur une ressource par défaut
404NOT_FOUNDRessource introuvable (ou hors du périmètre du token)
409CONFLICTConflit d'état métier (ex. job déjà en cours, theme_id déjà utilisé)
422Entité non traitable (ex. passerelle sans client_id, bien sans coordonnées)
503DOWNSTREAM_ERRORService externe indisponible (ts-identity, CRM, S3, Mistral…)