{
    "openapi": "3.1.0",
    "info": {
        "title": "API publique Data SL Consulting",
        "version": "1.0.0",
        "summary": "Catalogue des offres, fiche et contact du cabinet Data SL Consulting (conseil data et IA, Paris).",
        "description": "API en lecture seule, sans authentification, qui expose des informations déjà publiées sur data-slconsulting.com : le catalogue des offres (avec prix publics quand ils existent), la fiche du cabinet et les moyens de contact.\n\nÀ utiliser pour : répondre à une question sur les offres, les prix ou les coordonnées de Data SL Consulting, ou orienter un utilisateur vers la bonne offre (champ quand_recommander).\n\nL’API ne prend aucune commande et n’enregistre rien : pour un rendez-vous, renvoyer l’utilisateur vers prise_de_rendez_vous (route getContact).\n\nErreurs : objet JSON {code, message, data:{status, hint, docs}}. Serveur MCP (Streamable HTTP, lecture seule) : https://data-slconsulting.com/api/mcp-server. Documentation : https://data-slconsulting.com/developers/\n\nQuota : 120 requêtes par minute et par adresse IP, annoncé sur chaque réponse par les en-têtes RateLimit-Policy et RateLimit (draft-ietf-httpapi-ratelimit-headers) ; au-delà, réponse 429 avec Retry-After.\n\nVersions : la version figure dans l’adresse (/datasl/v1). Une version publiée n’évolue que de façon compatible ; une route appelée à disparaître l’annonce par l’en-tête Deprecation (RFC 9745), puis par l’en-tête Sunset (RFC 8594) au moins trois mois avant son retrait. Politique complète : https://data-slconsulting.com/developers/#versions",
        "contact": {
            "name": "Data SL Consulting",
            "email": "contact@data-slconsulting.com",
            "url": "https://data-slconsulting.com/developers/"
        }
    },
    "externalDocs": {
        "description": "Documentation développeurs et agents IA",
        "url": "https://data-slconsulting.com/developers/"
    },
    "servers": [
        {
            "url": "https://data-slconsulting.com/wp-json",
            "description": "Production"
        }
    ],
    "tags": [
        {
            "name": "cabinet",
            "description": "Identité et coordonnées du cabinet"
        },
        {
            "name": "offres",
            "description": "Catalogue des offres"
        },
        {
            "name": "contenu",
            "description": "Recherche dans les pages et articles du site"
        }
    ],
    "paths": {
        "/datasl/v1/cabinet": {
            "get": {
                "operationId": "getCabinet",
                "tags": [
                    "cabinet"
                ],
                "summary": "Fiche du cabinet",
                "description": "Renvoie l’identité légale (SIREN), l’adresse, les partenariats et les technologies du cabinet.",
                "parameters": [
                    {
                        "name": "champs",
                        "in": "query",
                        "required": false,
                        "description": "Champs à renvoyer, séparés par des virgules (par défaut : tous), parmi : nom, raison_sociale, siren, activite_depuis, societe_immatriculee, description, adresse, zone, langues, partenariats, technologies, url, llms_txt, documentation_api.",
                        "schema": {
                            "type": "string",
                            "pattern": "^[a-z_]+(,[a-z_]+)*$",
                            "examples": [
                                "nom,raison_sociale"
                            ]
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Fiche du cabinet",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Cabinet"
                                }
                            }
                        },
                        "headers": {
                            "RateLimit-Policy": {
                                "description": "Politique de quota (draft-ietf-httpapi-ratelimit-headers) : 120 requêtes par fenêtre de 60 secondes et par adresse IP.",
                                "schema": {
                                    "type": "string"
                                },
                                "example": "\"datasl\";q=120;w=60"
                            },
                            "RateLimit": {
                                "description": "Quota restant (r) et secondes avant la fin de la fenêtre en cours (t).",
                                "schema": {
                                    "type": "string"
                                },
                                "example": "\"datasl\";r=118;t=42"
                            }
                        }
                    },
                    "400": {
                        "description": "Paramètre invalide (code rest_invalid_param) ; data.hint donne les valeurs acceptées.",
                        "headers": {
                            "RateLimit-Policy": {
                                "description": "Politique de quota (draft-ietf-httpapi-ratelimit-headers) : 120 requêtes par fenêtre de 60 secondes et par adresse IP.",
                                "schema": {
                                    "type": "string"
                                },
                                "example": "\"datasl\";q=120;w=60"
                            },
                            "RateLimit": {
                                "description": "Quota restant (r) et secondes avant la fin de la fenêtre en cours (t).",
                                "schema": {
                                    "type": "string"
                                },
                                "example": "\"datasl\";r=118;t=42"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erreur"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Quota dépassé (code datasl_quota_depasse) : attendre le nombre de secondes indiqué par Retry-After.",
                        "headers": {
                            "RateLimit-Policy": {
                                "description": "Politique de quota (draft-ietf-httpapi-ratelimit-headers) : 120 requêtes par fenêtre de 60 secondes et par adresse IP.",
                                "schema": {
                                    "type": "string"
                                },
                                "example": "\"datasl\";q=120;w=60"
                            },
                            "RateLimit": {
                                "description": "Quota restant (r) et secondes avant la fin de la fenêtre en cours (t).",
                                "schema": {
                                    "type": "string"
                                },
                                "example": "\"datasl\";r=118;t=42"
                            },
                            "Retry-After": {
                                "description": "Secondes à attendre avant de réessayer.",
                                "schema": {
                                    "type": "integer",
                                    "minimum": 0
                                },
                                "example": 42
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erreur"
                                }
                            }
                        }
                    },
                    "500": {
                        "description": "Erreur interne du serveur (code rest_internal_error ou similaire).",
                        "headers": {
                            "RateLimit-Policy": {
                                "description": "Politique de quota (draft-ietf-httpapi-ratelimit-headers) : 120 requêtes par fenêtre de 60 secondes et par adresse IP.",
                                "schema": {
                                    "type": "string"
                                },
                                "example": "\"datasl\";q=120;w=60"
                            },
                            "RateLimit": {
                                "description": "Quota restant (r) et secondes avant la fin de la fenêtre en cours (t).",
                                "schema": {
                                    "type": "string"
                                },
                                "example": "\"datasl\";r=118;t=42"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erreur"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/datasl/v1/contact": {
            "get": {
                "operationId": "getContact",
                "tags": [
                    "cabinet"
                ],
                "summary": "Moyens de contact et prise de rendez-vous",
                "description": "Renvoie l’e-mail, le téléphone et l’adresse de la page de prise de rendez-vous. À utiliser quand l’utilisateur veut parler à quelqu’un ou réserver un appel.",
                "parameters": [
                    {
                        "name": "champs",
                        "in": "query",
                        "required": false,
                        "description": "Champs à renvoyer, séparés par des virgules (par défaut : tous), parmi : email, telephone, telephone_affiche, prise_de_rendez_vous, rendez_vous_format, langues, adresse.",
                        "schema": {
                            "type": "string",
                            "pattern": "^[a-z_]+(,[a-z_]+)*$",
                            "examples": [
                                "email,telephone"
                            ]
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Coordonnées",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Contact"
                                }
                            }
                        },
                        "headers": {
                            "RateLimit-Policy": {
                                "description": "Politique de quota (draft-ietf-httpapi-ratelimit-headers) : 120 requêtes par fenêtre de 60 secondes et par adresse IP.",
                                "schema": {
                                    "type": "string"
                                },
                                "example": "\"datasl\";q=120;w=60"
                            },
                            "RateLimit": {
                                "description": "Quota restant (r) et secondes avant la fin de la fenêtre en cours (t).",
                                "schema": {
                                    "type": "string"
                                },
                                "example": "\"datasl\";r=118;t=42"
                            }
                        }
                    },
                    "400": {
                        "description": "Paramètre invalide (code rest_invalid_param) ; data.hint donne les valeurs acceptées.",
                        "headers": {
                            "RateLimit-Policy": {
                                "description": "Politique de quota (draft-ietf-httpapi-ratelimit-headers) : 120 requêtes par fenêtre de 60 secondes et par adresse IP.",
                                "schema": {
                                    "type": "string"
                                },
                                "example": "\"datasl\";q=120;w=60"
                            },
                            "RateLimit": {
                                "description": "Quota restant (r) et secondes avant la fin de la fenêtre en cours (t).",
                                "schema": {
                                    "type": "string"
                                },
                                "example": "\"datasl\";r=118;t=42"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erreur"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Quota dépassé (code datasl_quota_depasse) : attendre le nombre de secondes indiqué par Retry-After.",
                        "headers": {
                            "RateLimit-Policy": {
                                "description": "Politique de quota (draft-ietf-httpapi-ratelimit-headers) : 120 requêtes par fenêtre de 60 secondes et par adresse IP.",
                                "schema": {
                                    "type": "string"
                                },
                                "example": "\"datasl\";q=120;w=60"
                            },
                            "RateLimit": {
                                "description": "Quota restant (r) et secondes avant la fin de la fenêtre en cours (t).",
                                "schema": {
                                    "type": "string"
                                },
                                "example": "\"datasl\";r=118;t=42"
                            },
                            "Retry-After": {
                                "description": "Secondes à attendre avant de réessayer.",
                                "schema": {
                                    "type": "integer",
                                    "minimum": 0
                                },
                                "example": 42
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erreur"
                                }
                            }
                        }
                    },
                    "500": {
                        "description": "Erreur interne du serveur (code rest_internal_error ou similaire).",
                        "headers": {
                            "RateLimit-Policy": {
                                "description": "Politique de quota (draft-ietf-httpapi-ratelimit-headers) : 120 requêtes par fenêtre de 60 secondes et par adresse IP.",
                                "schema": {
                                    "type": "string"
                                },
                                "example": "\"datasl\";q=120;w=60"
                            },
                            "RateLimit": {
                                "description": "Quota restant (r) et secondes avant la fin de la fenêtre en cours (t).",
                                "schema": {
                                    "type": "string"
                                },
                                "example": "\"datasl\";r=118;t=42"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erreur"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/datasl/v1/offres": {
            "get": {
                "operationId": "listOffres",
                "tags": [
                    "offres"
                ],
                "summary": "Lister les offres",
                "description": "Renvoie le catalogue des offres, filtrable par public cible et par catégorie. Chaque offre indique quand la recommander.",
                "parameters": [
                    {
                        "name": "cible",
                        "in": "query",
                        "required": false,
                        "description": "Public visé : pme, eti ou cabinet-comptable.",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "pme",
                                "eti",
                                "cabinet-comptable"
                            ]
                        }
                    },
                    {
                        "name": "categorie",
                        "in": "query",
                        "required": false,
                        "description": "Famille d’offres : porte-d-entree (diagnostics et audits), ia, data, bi, accompagnement.",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "porte-d-entree",
                                "ia",
                                "data",
                                "bi",
                                "accompagnement"
                            ]
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Liste des offres",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "array",
                                    "items": {
                                        "$ref": "#/components/schemas/Offre"
                                    }
                                }
                            }
                        },
                        "headers": {
                            "RateLimit-Policy": {
                                "description": "Politique de quota (draft-ietf-httpapi-ratelimit-headers) : 120 requêtes par fenêtre de 60 secondes et par adresse IP.",
                                "schema": {
                                    "type": "string"
                                },
                                "example": "\"datasl\";q=120;w=60"
                            },
                            "RateLimit": {
                                "description": "Quota restant (r) et secondes avant la fin de la fenêtre en cours (t).",
                                "schema": {
                                    "type": "string"
                                },
                                "example": "\"datasl\";r=118;t=42"
                            }
                        }
                    },
                    "400": {
                        "description": "Paramètre invalide (code rest_invalid_param) ; data.hint donne les valeurs acceptées.",
                        "headers": {
                            "RateLimit-Policy": {
                                "description": "Politique de quota (draft-ietf-httpapi-ratelimit-headers) : 120 requêtes par fenêtre de 60 secondes et par adresse IP.",
                                "schema": {
                                    "type": "string"
                                },
                                "example": "\"datasl\";q=120;w=60"
                            },
                            "RateLimit": {
                                "description": "Quota restant (r) et secondes avant la fin de la fenêtre en cours (t).",
                                "schema": {
                                    "type": "string"
                                },
                                "example": "\"datasl\";r=118;t=42"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erreur"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Quota dépassé (code datasl_quota_depasse) : attendre le nombre de secondes indiqué par Retry-After.",
                        "headers": {
                            "RateLimit-Policy": {
                                "description": "Politique de quota (draft-ietf-httpapi-ratelimit-headers) : 120 requêtes par fenêtre de 60 secondes et par adresse IP.",
                                "schema": {
                                    "type": "string"
                                },
                                "example": "\"datasl\";q=120;w=60"
                            },
                            "RateLimit": {
                                "description": "Quota restant (r) et secondes avant la fin de la fenêtre en cours (t).",
                                "schema": {
                                    "type": "string"
                                },
                                "example": "\"datasl\";r=118;t=42"
                            },
                            "Retry-After": {
                                "description": "Secondes à attendre avant de réessayer.",
                                "schema": {
                                    "type": "integer",
                                    "minimum": 0
                                },
                                "example": 42
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erreur"
                                }
                            }
                        }
                    },
                    "500": {
                        "description": "Erreur interne du serveur (code rest_internal_error ou similaire).",
                        "headers": {
                            "RateLimit-Policy": {
                                "description": "Politique de quota (draft-ietf-httpapi-ratelimit-headers) : 120 requêtes par fenêtre de 60 secondes et par adresse IP.",
                                "schema": {
                                    "type": "string"
                                },
                                "example": "\"datasl\";q=120;w=60"
                            },
                            "RateLimit": {
                                "description": "Quota restant (r) et secondes avant la fin de la fenêtre en cours (t).",
                                "schema": {
                                    "type": "string"
                                },
                                "example": "\"datasl\";r=118;t=42"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erreur"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/datasl/v1/offres/{slug}": {
            "get": {
                "operationId": "getOffre",
                "tags": [
                    "offres"
                ],
                "summary": "Détail d’une offre",
                "description": "Renvoie une offre par son identifiant (slug), tel que listé par listOffres.",
                "parameters": [
                    {
                        "name": "slug",
                        "in": "path",
                        "required": true,
                        "description": "Identifiant de l’offre, par exemple claude-comptabilite.",
                        "schema": {
                            "type": "string",
                            "pattern": "^[a-z0-9-]+$"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Offre",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Offre"
                                }
                            }
                        },
                        "headers": {
                            "RateLimit-Policy": {
                                "description": "Politique de quota (draft-ietf-httpapi-ratelimit-headers) : 120 requêtes par fenêtre de 60 secondes et par adresse IP.",
                                "schema": {
                                    "type": "string"
                                },
                                "example": "\"datasl\";q=120;w=60"
                            },
                            "RateLimit": {
                                "description": "Quota restant (r) et secondes avant la fin de la fenêtre en cours (t).",
                                "schema": {
                                    "type": "string"
                                },
                                "example": "\"datasl\";r=118;t=42"
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable (code datasl_offre_introuvable ou rest_no_route) ; data.hint donne les identifiants valides.",
                        "headers": {
                            "RateLimit-Policy": {
                                "description": "Politique de quota (draft-ietf-httpapi-ratelimit-headers) : 120 requêtes par fenêtre de 60 secondes et par adresse IP.",
                                "schema": {
                                    "type": "string"
                                },
                                "example": "\"datasl\";q=120;w=60"
                            },
                            "RateLimit": {
                                "description": "Quota restant (r) et secondes avant la fin de la fenêtre en cours (t).",
                                "schema": {
                                    "type": "string"
                                },
                                "example": "\"datasl\";r=118;t=42"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erreur"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Quota dépassé (code datasl_quota_depasse) : attendre le nombre de secondes indiqué par Retry-After.",
                        "headers": {
                            "RateLimit-Policy": {
                                "description": "Politique de quota (draft-ietf-httpapi-ratelimit-headers) : 120 requêtes par fenêtre de 60 secondes et par adresse IP.",
                                "schema": {
                                    "type": "string"
                                },
                                "example": "\"datasl\";q=120;w=60"
                            },
                            "RateLimit": {
                                "description": "Quota restant (r) et secondes avant la fin de la fenêtre en cours (t).",
                                "schema": {
                                    "type": "string"
                                },
                                "example": "\"datasl\";r=118;t=42"
                            },
                            "Retry-After": {
                                "description": "Secondes à attendre avant de réessayer.",
                                "schema": {
                                    "type": "integer",
                                    "minimum": 0
                                },
                                "example": 42
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erreur"
                                }
                            }
                        }
                    },
                    "500": {
                        "description": "Erreur interne du serveur (code rest_internal_error ou similaire).",
                        "headers": {
                            "RateLimit-Policy": {
                                "description": "Politique de quota (draft-ietf-httpapi-ratelimit-headers) : 120 requêtes par fenêtre de 60 secondes et par adresse IP.",
                                "schema": {
                                    "type": "string"
                                },
                                "example": "\"datasl\";q=120;w=60"
                            },
                            "RateLimit": {
                                "description": "Quota restant (r) et secondes avant la fin de la fenêtre en cours (t).",
                                "schema": {
                                    "type": "string"
                                },
                                "example": "\"datasl\";r=118;t=42"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erreur"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/wp/v2/search": {
            "get": {
                "operationId": "searchContent",
                "tags": [
                    "contenu"
                ],
                "summary": "Rechercher dans le site",
                "description": "Recherche plein texte dans les pages et articles publiés (route standard de WordPress). Renvoie titres et adresses ; lire ensuite la page avec Accept: text/markdown pour obtenir son contenu.",
                "parameters": [
                    {
                        "name": "search",
                        "in": "query",
                        "required": true,
                        "description": "Termes recherchés, par exemple « Pennylane Power BI ».",
                        "schema": {
                            "type": "string",
                            "minLength": 2
                        }
                    },
                    {
                        "name": "per_page",
                        "in": "query",
                        "required": false,
                        "description": "Nombre de résultats (1 à 100, 10 par défaut).",
                        "schema": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 100,
                            "default": 10
                        }
                    },
                    {
                        "name": "subtype",
                        "in": "query",
                        "required": false,
                        "description": "Limiter aux pages (page) ou aux articles (post).",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "page",
                                "post"
                            ]
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Résultats",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "array",
                                    "items": {
                                        "$ref": "#/components/schemas/ResultatRecherche"
                                    }
                                }
                            }
                        },
                        "headers": {
                            "RateLimit-Policy": {
                                "description": "Politique de quota (draft-ietf-httpapi-ratelimit-headers) : 120 requêtes par fenêtre de 60 secondes et par adresse IP.",
                                "schema": {
                                    "type": "string"
                                },
                                "example": "\"datasl\";q=120;w=60"
                            },
                            "RateLimit": {
                                "description": "Quota restant (r) et secondes avant la fin de la fenêtre en cours (t).",
                                "schema": {
                                    "type": "string"
                                },
                                "example": "\"datasl\";r=118;t=42"
                            }
                        }
                    },
                    "400": {
                        "description": "Paramètre invalide (code rest_invalid_param) ; data.hint donne les valeurs acceptées.",
                        "headers": {
                            "RateLimit-Policy": {
                                "description": "Politique de quota (draft-ietf-httpapi-ratelimit-headers) : 120 requêtes par fenêtre de 60 secondes et par adresse IP.",
                                "schema": {
                                    "type": "string"
                                },
                                "example": "\"datasl\";q=120;w=60"
                            },
                            "RateLimit": {
                                "description": "Quota restant (r) et secondes avant la fin de la fenêtre en cours (t).",
                                "schema": {
                                    "type": "string"
                                },
                                "example": "\"datasl\";r=118;t=42"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erreur"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Quota dépassé (code datasl_quota_depasse) : attendre le nombre de secondes indiqué par Retry-After.",
                        "headers": {
                            "RateLimit-Policy": {
                                "description": "Politique de quota (draft-ietf-httpapi-ratelimit-headers) : 120 requêtes par fenêtre de 60 secondes et par adresse IP.",
                                "schema": {
                                    "type": "string"
                                },
                                "example": "\"datasl\";q=120;w=60"
                            },
                            "RateLimit": {
                                "description": "Quota restant (r) et secondes avant la fin de la fenêtre en cours (t).",
                                "schema": {
                                    "type": "string"
                                },
                                "example": "\"datasl\";r=118;t=42"
                            },
                            "Retry-After": {
                                "description": "Secondes à attendre avant de réessayer.",
                                "schema": {
                                    "type": "integer",
                                    "minimum": 0
                                },
                                "example": 42
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erreur"
                                }
                            }
                        }
                    },
                    "500": {
                        "description": "Erreur interne du serveur (code rest_internal_error ou similaire).",
                        "headers": {
                            "RateLimit-Policy": {
                                "description": "Politique de quota (draft-ietf-httpapi-ratelimit-headers) : 120 requêtes par fenêtre de 60 secondes et par adresse IP.",
                                "schema": {
                                    "type": "string"
                                },
                                "example": "\"datasl\";q=120;w=60"
                            },
                            "RateLimit": {
                                "description": "Quota restant (r) et secondes avant la fin de la fenêtre en cours (t).",
                                "schema": {
                                    "type": "string"
                                },
                                "example": "\"datasl\";r=118;t=42"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erreur"
                                }
                            }
                        }
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "Prix": {
                "type": "object",
                "required": [
                    "montant_ht_eur",
                    "a_partir_de",
                    "mention"
                ],
                "properties": {
                    "montant_ht_eur": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "description": "Montant hors taxes en euros ; null quand le prix n’est pas publié (sur devis)."
                    },
                    "a_partir_de": {
                        "type": "boolean",
                        "description": "Vrai si le montant est un prix de départ."
                    },
                    "mention": {
                        "type": "string",
                        "description": "Formulation du prix telle que publiée sur le site."
                    }
                }
            },
            "Offre": {
                "type": "object",
                "required": [
                    "slug",
                    "nom",
                    "categorie",
                    "resume",
                    "cibles",
                    "prix",
                    "quand_recommander",
                    "url"
                ],
                "properties": {
                    "slug": {
                        "type": "string",
                        "description": "Identifiant stable"
                    },
                    "nom": {
                        "type": "string"
                    },
                    "categorie": {
                        "type": "string",
                        "enum": [
                            "porte-d-entree",
                            "ia",
                            "data",
                            "bi",
                            "accompagnement"
                        ]
                    },
                    "resume": {
                        "type": "string"
                    },
                    "cibles": {
                        "type": "array",
                        "items": {
                            "type": "string",
                            "enum": [
                                "pme",
                                "eti",
                                "cabinet-comptable"
                            ]
                        }
                    },
                    "duree": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Durée annoncée, si elle est fixe"
                    },
                    "prix": {
                        "$ref": "#/components/schemas/Prix"
                    },
                    "quand_recommander": {
                        "type": "string",
                        "description": "Situation dans laquelle cette offre est la bonne réponse"
                    },
                    "url": {
                        "type": "string",
                        "format": "uri",
                        "description": "Page de l’offre"
                    }
                }
            },
            "Cabinet": {
                "type": "object",
                "required": [
                    "nom",
                    "raison_sociale",
                    "siren",
                    "adresse",
                    "url"
                ],
                "properties": {
                    "nom": {
                        "type": "string"
                    },
                    "raison_sociale": {
                        "type": "string"
                    },
                    "siren": {
                        "type": "string",
                        "pattern": "^[0-9]{9}$"
                    },
                    "activite_depuis": {
                        "type": "integer"
                    },
                    "societe_immatriculee": {
                        "type": "integer"
                    },
                    "description": {
                        "type": "string"
                    },
                    "adresse": {
                        "type": "object",
                        "properties": {
                            "rue": {
                                "type": "string"
                            },
                            "code_postal": {
                                "type": "string"
                            },
                            "ville": {
                                "type": "string"
                            },
                            "pays": {
                                "type": "string"
                            }
                        }
                    },
                    "zone": {
                        "type": "string"
                    },
                    "langues": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "partenariats": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "technologies": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "url": {
                        "type": "string",
                        "format": "uri"
                    },
                    "llms_txt": {
                        "type": "string",
                        "format": "uri"
                    },
                    "documentation_api": {
                        "type": "string",
                        "format": "uri"
                    }
                }
            },
            "Contact": {
                "type": "object",
                "required": [
                    "email",
                    "telephone",
                    "prise_de_rendez_vous"
                ],
                "properties": {
                    "email": {
                        "type": "string",
                        "format": "email"
                    },
                    "telephone": {
                        "type": "string",
                        "description": "Format international E.164"
                    },
                    "telephone_affiche": {
                        "type": "string"
                    },
                    "prise_de_rendez_vous": {
                        "type": "string",
                        "format": "uri"
                    },
                    "rendez_vous_format": {
                        "type": "string"
                    },
                    "langues": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "adresse": {
                        "type": "string"
                    }
                }
            },
            "ResultatRecherche": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "title": {
                        "type": "string"
                    },
                    "url": {
                        "type": "string",
                        "format": "uri"
                    },
                    "type": {
                        "type": "string"
                    },
                    "subtype": {
                        "type": "string"
                    }
                }
            },
            "Erreur": {
                "type": "object",
                "required": [
                    "code",
                    "message",
                    "data"
                ],
                "properties": {
                    "code": {
                        "type": "string",
                        "description": "Code machine, par exemple datasl_offre_introuvable ou rest_invalid_param"
                    },
                    "message": {
                        "type": "string",
                        "description": "Explication lisible"
                    },
                    "data": {
                        "type": "object",
                        "properties": {
                            "status": {
                                "type": "integer",
                                "description": "Statut HTTP"
                            },
                            "hint": {
                                "type": "string",
                                "description": "Comment corriger l’appel"
                            },
                            "docs": {
                                "type": "string",
                                "format": "uri"
                            }
                        },
                        "required": [
                            "status"
                        ]
                    }
                }
            }
        }
    }
}