{"openapi":"3.1.0","info":{"title":"Nouvelles Entreprises — API ouverte","version":"1.0.0","summary":"Prospection par courrier postal des sociétés françaises nouvellement immatriculées.","description":"Nouvelles Entreprises repère les sociétés françaises nouvellement immatriculées (répertoire SIRENE) et leur envoie des courriers postaux de prospection, à 1,50 € HT le pli, réglés en crédits prépayés. Abonnement unique : 59 € HT par mois (fichier d'entreprises et campagnes automatiques).\n\nLes outils du connecteur MCP, appelables en HTTP simple, sans installer le connecteur.\n- Sans compte : ne_guide_prospection, ne_suggerer_ciblage, ne_estimer_volume, ne_relire_lettre. Limite : 60 appels par minute et par adresse IP (préfixe /64 en IPv6), comptés avec ceux du connecteur MCP.\n- Avec un compte : en-tête Authorization: Bearer <clé>, clé créée par le titulaire depuis son espace client (https://nouvelles-entreprises.com/dashboard#assistants), ou jeton OAuth 2.1 émis pour la ressource https://nouvelles-entreprises.com/api/mcp. Jamais de clé dans l'URL.\n- Les outils en lecture seule répondent aussi en GET, arguments en query (tableaux : valeurs séparées par des virgules). Tous répondent en POST, arguments en JSON.\n- Réponse : { outil, ok, texte, donnees }. `texte` est la réponse rédigée de l'outil, à montrer ou résumer ; `donnees`, son contenu structuré. `?format=texte` (ou Accept: text/markdown) rend le texte seul, en Markdown.\n- Les outils qui engagent une dépense procèdent en deux appels : le premier rend un aperçu chiffré et un jeton de confirmation, le second, avec ce jeton, exécute après accord explicite de l'utilisateur. Les prix sont hors taxes.\n\nCatalogue : https://nouvelles-entreprises.com/api/v1/outils. Documentation : https://nouvelles-entreprises.com/api-ouverte. Import dans un GPT personnalisé : https://nouvelles-entreprises.com/openapi.json?variante=gpt.","contact":{"name":"Nouvelles Entreprises","url":"https://nouvelles-entreprises.com/nous-contacter"},"termsOfService":"https://nouvelles-entreprises.com/cgv"},"externalDocs":{"description":"Documentation de l'API ouverte","url":"https://nouvelles-entreprises.com/api-ouverte"},"servers":[{"url":"https://nouvelles-entreprises.com"}],"tags":[{"name":"decouverte","description":"Sans compte : plan de prospection par métier, codes NAF, volume et coût d'un ciblage, relecture d'une lettre."},{"name":"compte","description":"État du compte, adresse d'expéditeur, crédits courrier, accès des assistants et des clés."},{"name":"envoi","description":"Recherche des entreprises à contacter et envoi ponctuel de courriers."},{"name":"campagnes","description":"Premier fichier gratuit, campagnes de courrier automatique, suivi des courriers et des retours."}],"paths":{"/api/v1/outils/ne_guide_prospection":{"get":{"operationId":"ne_guide_prospection","summary":"Plan de prospection B2B par métier","description":"Utiliser quand l'utilisateur demande comment prospecter par courrier les entreprises nouvellement immatriculées en France, pour son métier ou une activité donnée (assureur, expert-comptable, agence web, cabinet de recrutement, agent immobilier, banque pro…). Rend le ciblage conseillé (codes NAF, zone, ancienneté), le canal, l'angle de la lettre et les étapes pour passer à l'envoi. Ne pas utiliser pour chercher des entreprises précises ni pour compter un ciblage. Aucun compte n'est nécessaire.","tags":["decouverte"],"parameters":[{"name":"metier","in":"query","required":true,"description":"Métier ou activité de la personne qui prospecte, en clair : « assureur », « courtier en assurance », « expert-comptable », « agence web »…","schema":{"type":"string"}},{"name":"format","in":"query","required":false,"description":"`texte` : rend le texte de l'outil seul, en text/markdown. Défaut : JSON.","schema":{"type":"string","enum":["json","texte"],"default":"json"}}],"security":[],"x-openai-isConsequential":false,"responses":{"200":{"description":"Réponse de l'outil.","content":{"application/json":{"schema":{"type":"object","required":["outil","ok","texte","donnees"],"properties":{"outil":{"type":"string","description":"Nom de l'outil appelé."},"ok":{"type":"boolean","description":"Toujours vrai sur un 200."},"texte":{"type":"string","description":"Réponse rédigée de l'outil, en Markdown : à montrer ou à résumer à l'utilisateur."},"donnees":{"type":"object","properties":{"metier":{"type":"string"},"generique":{"type":"boolean","description":"Vrai si aucun plan propre à ce métier n'existe (plan général)."},"ciblage_conseille":{"type":"object","properties":{"codes_naf":{"type":"array","items":{"type":"string"}},"age_min_mois":{"type":"integer"},"age_max_mois":{"type":"integer"},"delai_contact_mois":{"type":"integer"}}},"page_web":{"type":"string"},"lien_fichier_gratuit":{"type":"string","description":"Sans compte, quand le plan nomme des activités : formulaire du premier fichier gratuit sur le site, activités et ancienneté préremplies."}}}}}},"text/markdown":{"schema":{"type":"string","description":"Texte seul, avec ?format=texte ou Accept: text/markdown."}}}},"400":{"$ref":"#/components/responses/RequeteInvalide"},"401":{"$ref":"#/components/responses/AccesRequis"},"404":{"$ref":"#/components/responses/OutilInconnu"},"422":{"$ref":"#/components/responses/ErreurOutil"},"429":{"$ref":"#/components/responses/LimiteAtteinte"},"500":{"$ref":"#/components/responses/ErreurServeur"}}},"post":{"operationId":"ne_guide_prospection_post","summary":"Plan de prospection B2B par métier","description":"Utiliser quand l'utilisateur demande comment prospecter par courrier les entreprises nouvellement immatriculées en France, pour son métier ou une activité donnée (assureur, expert-comptable, agence web, cabinet de recrutement, agent immobilier, banque pro…). Rend le ciblage conseillé (codes NAF, zone, ancienneté), le canal, l'angle de la lettre et les étapes pour passer à l'envoi. Ne pas utiliser pour chercher des entreprises précises ni pour compter un ciblage. Aucun compte n'est nécessaire.","tags":["decouverte"],"parameters":[{"name":"format","in":"query","required":false,"description":"`texte` : rend le texte de l'outil seul, en text/markdown. Défaut : JSON.","schema":{"type":"string","enum":["json","texte"],"default":"json"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"metier":{"type":"string","description":"Métier ou activité de la personne qui prospecte, en clair : « assureur », « courtier en assurance », « expert-comptable », « agence web »…"}},"required":["metier"],"additionalProperties":false}}}},"security":[],"x-openai-isConsequential":false,"responses":{"200":{"description":"Réponse de l'outil.","content":{"application/json":{"schema":{"type":"object","required":["outil","ok","texte","donnees"],"properties":{"outil":{"type":"string","description":"Nom de l'outil appelé."},"ok":{"type":"boolean","description":"Toujours vrai sur un 200."},"texte":{"type":"string","description":"Réponse rédigée de l'outil, en Markdown : à montrer ou à résumer à l'utilisateur."},"donnees":{"type":"object","properties":{"metier":{"type":"string"},"generique":{"type":"boolean","description":"Vrai si aucun plan propre à ce métier n'existe (plan général)."},"ciblage_conseille":{"type":"object","properties":{"codes_naf":{"type":"array","items":{"type":"string"}},"age_min_mois":{"type":"integer"},"age_max_mois":{"type":"integer"},"delai_contact_mois":{"type":"integer"}}},"page_web":{"type":"string"},"lien_fichier_gratuit":{"type":"string","description":"Sans compte, quand le plan nomme des activités : formulaire du premier fichier gratuit sur le site, activités et ancienneté préremplies."}}}}}},"text/markdown":{"schema":{"type":"string","description":"Texte seul, avec ?format=texte ou Accept: text/markdown."}}}},"400":{"$ref":"#/components/responses/RequeteInvalide"},"401":{"$ref":"#/components/responses/AccesRequis"},"404":{"$ref":"#/components/responses/OutilInconnu"},"422":{"$ref":"#/components/responses/ErreurOutil"},"429":{"$ref":"#/components/responses/LimiteAtteinte"},"500":{"$ref":"#/components/responses/ErreurServeur"}}}},"/api/v1/outils/ne_suggerer_ciblage":{"get":{"operationId":"ne_suggerer_ciblage","summary":"Traduire une cible en codes NAF","description":"Utiliser quand l'utilisateur décrit en clair les entreprises qu'il veut viser (« les restaurants », « les artisans du bâtiment », « les cabinets vétérinaires ») et que les codes NAF/APE correspondants ne sont pas connus. Rend des codes NAF avec leur libellé, à passer en `codes_naf` aux outils de ciblage. Ne pas utiliser quand les codes NAF sont déjà connus. La correspondance est proposée par un modèle de langue, dans la limite de 30 appels par heure. Aucun compte n'est nécessaire.","tags":["decouverte"],"parameters":[{"name":"description","in":"query","required":true,"description":"Les entreprises à cibler, décrites en français courant (3 à 500 caractères).","schema":{"type":"string"}},{"name":"format","in":"query","required":false,"description":"`texte` : rend le texte de l'outil seul, en text/markdown. Défaut : JSON.","schema":{"type":"string","enum":["json","texte"],"default":"json"}}],"security":[],"x-openai-isConsequential":false,"responses":{"200":{"description":"Réponse de l'outil.","content":{"application/json":{"schema":{"type":"object","required":["outil","ok","texte","donnees"],"properties":{"outil":{"type":"string","description":"Nom de l'outil appelé."},"ok":{"type":"boolean","description":"Toujours vrai sur un 200."},"texte":{"type":"string","description":"Réponse rédigée de l'outil, en Markdown : à montrer ou à résumer à l'utilisateur."},"donnees":{"type":"object","properties":{"codes":{"type":"array","items":{"type":"string"},"description":"Codes NAF sans point, à passer en codes_naf."},"libelles":{"type":"array","items":{"type":"string"},"description":"Libellés des codes, dans le même ordre."}}}}}},"text/markdown":{"schema":{"type":"string","description":"Texte seul, avec ?format=texte ou Accept: text/markdown."}}}},"400":{"$ref":"#/components/responses/RequeteInvalide"},"401":{"$ref":"#/components/responses/AccesRequis"},"404":{"$ref":"#/components/responses/OutilInconnu"},"422":{"$ref":"#/components/responses/ErreurOutil"},"429":{"$ref":"#/components/responses/LimiteAtteinte"},"500":{"$ref":"#/components/responses/ErreurServeur"}}},"post":{"operationId":"ne_suggerer_ciblage_post","summary":"Traduire une cible en codes NAF","description":"Utiliser quand l'utilisateur décrit en clair les entreprises qu'il veut viser (« les restaurants », « les artisans du bâtiment », « les cabinets vétérinaires ») et que les codes NAF/APE correspondants ne sont pas connus. Rend des codes NAF avec leur libellé, à passer en `codes_naf` aux outils de ciblage. Ne pas utiliser quand les codes NAF sont déjà connus. La correspondance est proposée par un modèle de langue, dans la limite de 30 appels par heure. Aucun compte n'est nécessaire.","tags":["decouverte"],"parameters":[{"name":"format","in":"query","required":false,"description":"`texte` : rend le texte de l'outil seul, en text/markdown. Défaut : JSON.","schema":{"type":"string","enum":["json","texte"],"default":"json"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"description":{"type":"string","description":"Les entreprises à cibler, décrites en français courant (3 à 500 caractères)."}},"required":["description"],"additionalProperties":false}}}},"security":[],"x-openai-isConsequential":false,"responses":{"200":{"description":"Réponse de l'outil.","content":{"application/json":{"schema":{"type":"object","required":["outil","ok","texte","donnees"],"properties":{"outil":{"type":"string","description":"Nom de l'outil appelé."},"ok":{"type":"boolean","description":"Toujours vrai sur un 200."},"texte":{"type":"string","description":"Réponse rédigée de l'outil, en Markdown : à montrer ou à résumer à l'utilisateur."},"donnees":{"type":"object","properties":{"codes":{"type":"array","items":{"type":"string"},"description":"Codes NAF sans point, à passer en codes_naf."},"libelles":{"type":"array","items":{"type":"string"},"description":"Libellés des codes, dans le même ordre."}}}}}},"text/markdown":{"schema":{"type":"string","description":"Texte seul, avec ?format=texte ou Accept: text/markdown."}}}},"400":{"$ref":"#/components/responses/RequeteInvalide"},"401":{"$ref":"#/components/responses/AccesRequis"},"404":{"$ref":"#/components/responses/OutilInconnu"},"422":{"$ref":"#/components/responses/ErreurOutil"},"429":{"$ref":"#/components/responses/LimiteAtteinte"},"500":{"$ref":"#/components/responses/ErreurServeur"}}}},"/api/v1/outils/ne_estimer_volume":{"get":{"operationId":"ne_estimer_volume","summary":"Compter les entreprises visées et chiffrer la campagne","description":"Utiliser quand l'utilisateur veut savoir combien d'entreprises françaises correspondent à un ciblage (activité, zone, forme juridique, ancienneté) et ce que coûterait un courrier à chacune (1,50 € HT le pli). Rend un comptage et un coût, sans liste nominative. Ne pas utiliser pour obtenir les entreprises elles-mêmes (ne_rechercher_entreprises, avec un compte). Aucun compte n'est nécessaire.","tags":["decouverte"],"parameters":[{"name":"codes_naf","in":"query","required":false,"description":"Codes NAF/APE sans point (ex. [\"6201Z\", \"7022Z\"]). Vide = toutes activités. Utilisez ne_suggerer_ciblage pour les obtenir à partir d'une description en clair.","style":"form","explode":false,"schema":{"type":"array","items":{"type":"string"}}},{"name":"departements","in":"query","required":false,"description":"Codes de départements français (ex. [\"75\", \"69\", \"2A\"]). Vide = France entière.","style":"form","explode":false,"schema":{"type":"array","items":{"type":"string"}}},{"name":"region","in":"query","required":false,"description":"Région française, par son nom ou son code INSEE (« Auvergne-Rhône-Alpes » ou « 84 »). Ignoré si des départements ou un rayon sont donnés.","schema":{"type":"string"}},{"name":"adresse","in":"query","required":false,"description":"Centre d'un ciblage par rayon : adresse postale française ou nom de commune (« Lyon », « 12 rue de la République, Lyon »). À combiner avec rayon_km. L'adresse retenue est toujours rappelée dans la réponse — vérifiez-la.","schema":{"type":"string"}},{"name":"rayon_km","in":"query","required":false,"description":"Rayon en kilomètres autour de l'adresse (ou des coordonnées), de 5 à 100. Le rayon prime sur les départements et la région. La distance est calculée à vol d'oiseau sur la position réelle de chaque entreprise.","schema":{"type":"number"}},{"name":"latitude","in":"query","required":false,"description":"Latitude du centre (WGS84), pour se passer du géocodage. À utiliser avec longitude et rayon_km.","schema":{"type":"number"}},{"name":"longitude","in":"query","required":false,"description":"Longitude du centre (WGS84). À utiliser avec latitude et rayon_km.","schema":{"type":"number"}},{"name":"formes_juridiques","in":"query","required":false,"description":"Familles juridiques : ei, sas, sarl, sa, sci, societe-civile, association, copropriete, snc-commandite, cooperative-mutuelle, gie. Vide = toutes.","style":"form","explode":false,"schema":{"type":"array","items":{"type":"string"}}},{"name":"age_min_mois","in":"query","required":false,"description":"Ancienneté minimale en mois depuis l'immatriculation. 0 = dès la création.","schema":{"type":"number"}},{"name":"age_max_mois","in":"query","required":false,"description":"Ancienneté maximale en mois. Défaut 3. Au-delà de 12, on quitte les créations récentes pour le stock d'entreprises établies.","schema":{"type":"number"}},{"name":"format","in":"query","required":false,"description":"`texte` : rend le texte de l'outil seul, en text/markdown. Défaut : JSON.","schema":{"type":"string","enum":["json","texte"],"default":"json"}}],"security":[],"x-openai-isConsequential":false,"responses":{"200":{"description":"Réponse de l'outil.","content":{"application/json":{"schema":{"type":"object","required":["outil","ok","texte","donnees"],"properties":{"outil":{"type":"string","description":"Nom de l'outil appelé."},"ok":{"type":"boolean","description":"Toujours vrai sur un 200."},"texte":{"type":"string","description":"Réponse rédigée de l'outil, en Markdown : à montrer ou à résumer à l'utilisateur."},"donnees":{"type":"object","properties":{"total":{"type":"integer"},"total_borne":{"type":"boolean","description":"Vrai si le total est un plancher (comptage arrêté)."},"cout_vague_cents":{"type":"integer","description":"Coût d'un courrier à chacune, en centimes d'euro HT."},"ciblage":{"type":"string","description":"Ciblage appliqué, en clair."},"lien_fichier_gratuit":{"type":"string","description":"Sans compte : formulaire du premier fichier gratuit sur le site, ciblage prérempli."},"entreprises_fichier_gratuit":{"type":"integer","description":"Sans compte : entreprises que contiendrait ce premier fichier."},"entreprises_fichier_gratuit_borne":{"type":"boolean","description":"Vrai si ce nombre est un plancher (comptage arrêté)."}}}}}},"text/markdown":{"schema":{"type":"string","description":"Texte seul, avec ?format=texte ou Accept: text/markdown."}}}},"400":{"$ref":"#/components/responses/RequeteInvalide"},"401":{"$ref":"#/components/responses/AccesRequis"},"404":{"$ref":"#/components/responses/OutilInconnu"},"422":{"$ref":"#/components/responses/ErreurOutil"},"429":{"$ref":"#/components/responses/LimiteAtteinte"},"500":{"$ref":"#/components/responses/ErreurServeur"}}},"post":{"operationId":"ne_estimer_volume_post","summary":"Compter les entreprises visées et chiffrer la campagne","description":"Utiliser quand l'utilisateur veut savoir combien d'entreprises françaises correspondent à un ciblage (activité, zone, forme juridique, ancienneté) et ce que coûterait un courrier à chacune (1,50 € HT le pli). Rend un comptage et un coût, sans liste nominative. Ne pas utiliser pour obtenir les entreprises elles-mêmes (ne_rechercher_entreprises, avec un compte). Aucun compte n'est nécessaire.","tags":["decouverte"],"parameters":[{"name":"format","in":"query","required":false,"description":"`texte` : rend le texte de l'outil seul, en text/markdown. Défaut : JSON.","schema":{"type":"string","enum":["json","texte"],"default":"json"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"codes_naf":{"type":"array","items":{"type":"string"},"description":"Codes NAF/APE sans point (ex. [\"6201Z\", \"7022Z\"]). Vide = toutes activités. Utilisez ne_suggerer_ciblage pour les obtenir à partir d'une description en clair."},"departements":{"type":"array","items":{"type":"string"},"description":"Codes de départements français (ex. [\"75\", \"69\", \"2A\"]). Vide = France entière."},"region":{"type":"string","description":"Région française, par son nom ou son code INSEE (« Auvergne-Rhône-Alpes » ou « 84 »). Ignoré si des départements ou un rayon sont donnés."},"adresse":{"type":"string","description":"Centre d'un ciblage par rayon : adresse postale française ou nom de commune (« Lyon », « 12 rue de la République, Lyon »). À combiner avec rayon_km. L'adresse retenue est toujours rappelée dans la réponse — vérifiez-la."},"rayon_km":{"type":"number","description":"Rayon en kilomètres autour de l'adresse (ou des coordonnées), de 5 à 100. Le rayon prime sur les départements et la région. La distance est calculée à vol d'oiseau sur la position réelle de chaque entreprise."},"latitude":{"type":"number","description":"Latitude du centre (WGS84), pour se passer du géocodage. À utiliser avec longitude et rayon_km."},"longitude":{"type":"number","description":"Longitude du centre (WGS84). À utiliser avec latitude et rayon_km."},"formes_juridiques":{"type":"array","items":{"type":"string"},"description":"Familles juridiques : ei, sas, sarl, sa, sci, societe-civile, association, copropriete, snc-commandite, cooperative-mutuelle, gie. Vide = toutes."},"age_min_mois":{"type":"number","description":"Ancienneté minimale en mois depuis l'immatriculation. 0 = dès la création."},"age_max_mois":{"type":"number","description":"Ancienneté maximale en mois. Défaut 3. Au-delà de 12, on quitte les créations récentes pour le stock d'entreprises établies."}},"additionalProperties":false}}}},"security":[],"x-openai-isConsequential":false,"responses":{"200":{"description":"Réponse de l'outil.","content":{"application/json":{"schema":{"type":"object","required":["outil","ok","texte","donnees"],"properties":{"outil":{"type":"string","description":"Nom de l'outil appelé."},"ok":{"type":"boolean","description":"Toujours vrai sur un 200."},"texte":{"type":"string","description":"Réponse rédigée de l'outil, en Markdown : à montrer ou à résumer à l'utilisateur."},"donnees":{"type":"object","properties":{"total":{"type":"integer"},"total_borne":{"type":"boolean","description":"Vrai si le total est un plancher (comptage arrêté)."},"cout_vague_cents":{"type":"integer","description":"Coût d'un courrier à chacune, en centimes d'euro HT."},"ciblage":{"type":"string","description":"Ciblage appliqué, en clair."},"lien_fichier_gratuit":{"type":"string","description":"Sans compte : formulaire du premier fichier gratuit sur le site, ciblage prérempli."},"entreprises_fichier_gratuit":{"type":"integer","description":"Sans compte : entreprises que contiendrait ce premier fichier."},"entreprises_fichier_gratuit_borne":{"type":"boolean","description":"Vrai si ce nombre est un plancher (comptage arrêté)."}}}}}},"text/markdown":{"schema":{"type":"string","description":"Texte seul, avec ?format=texte ou Accept: text/markdown."}}}},"400":{"$ref":"#/components/responses/RequeteInvalide"},"401":{"$ref":"#/components/responses/AccesRequis"},"404":{"$ref":"#/components/responses/OutilInconnu"},"422":{"$ref":"#/components/responses/ErreurOutil"},"429":{"$ref":"#/components/responses/LimiteAtteinte"},"500":{"$ref":"#/components/responses/ErreurServeur"}}}},"/api/v1/outils/ne_relire_lettre":{"get":{"operationId":"ne_relire_lettre","summary":"Vérifier une lettre avant impression","description":"Utiliser quand une lettre de prospection a été rédigée et doit être vérifiée avant un envoi : longueur (le pli doit tenir sur une page ; au-delà, il est annulé automatiquement et n'est pas facturé), variable de personnalisation, P.S., et rappel des neuf règles de rédaction. N'envoie et n'enregistre rien. Ne pas utiliser pour rédiger la lettre elle-même. Aucun compte n'est nécessaire.","tags":["decouverte"],"parameters":[{"name":"lettre","in":"query","required":true,"description":"Texte de la lettre (20 000 caractères au plus). Variables disponibles, remplacées à l'impression : {{raisonSociale}}, {{dirigeant}}, {{ville}}.","schema":{"type":"string"}},{"name":"format","in":"query","required":false,"description":"`texte` : rend le texte de l'outil seul, en text/markdown. Défaut : JSON.","schema":{"type":"string","enum":["json","texte"],"default":"json"}}],"security":[],"x-openai-isConsequential":false,"responses":{"200":{"description":"Réponse de l'outil.","content":{"application/json":{"schema":{"type":"object","required":["outil","ok","texte","donnees"],"properties":{"outil":{"type":"string","description":"Nom de l'outil appelé."},"ok":{"type":"boolean","description":"Toujours vrai sur un 200."},"texte":{"type":"string","description":"Réponse rédigée de l'outil, en Markdown : à montrer ou à résumer à l'utilisateur."},"donnees":{"type":"object","properties":{"mots":{"type":"integer"},"alertes":{"type":"array","items":{"type":"string"}},"conforme":{"type":"boolean"}}}}}},"text/markdown":{"schema":{"type":"string","description":"Texte seul, avec ?format=texte ou Accept: text/markdown."}}}},"400":{"$ref":"#/components/responses/RequeteInvalide"},"401":{"$ref":"#/components/responses/AccesRequis"},"404":{"$ref":"#/components/responses/OutilInconnu"},"422":{"$ref":"#/components/responses/ErreurOutil"},"429":{"$ref":"#/components/responses/LimiteAtteinte"},"500":{"$ref":"#/components/responses/ErreurServeur"}}},"post":{"operationId":"ne_relire_lettre_post","summary":"Vérifier une lettre avant impression","description":"Utiliser quand une lettre de prospection a été rédigée et doit être vérifiée avant un envoi : longueur (le pli doit tenir sur une page ; au-delà, il est annulé automatiquement et n'est pas facturé), variable de personnalisation, P.S., et rappel des neuf règles de rédaction. N'envoie et n'enregistre rien. Ne pas utiliser pour rédiger la lettre elle-même. Aucun compte n'est nécessaire.","tags":["decouverte"],"parameters":[{"name":"format","in":"query","required":false,"description":"`texte` : rend le texte de l'outil seul, en text/markdown. Défaut : JSON.","schema":{"type":"string","enum":["json","texte"],"default":"json"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"lettre":{"type":"string","description":"Texte de la lettre (20 000 caractères au plus). Variables disponibles, remplacées à l'impression : {{raisonSociale}}, {{dirigeant}}, {{ville}}."}},"required":["lettre"],"additionalProperties":false}}}},"security":[],"x-openai-isConsequential":false,"responses":{"200":{"description":"Réponse de l'outil.","content":{"application/json":{"schema":{"type":"object","required":["outil","ok","texte","donnees"],"properties":{"outil":{"type":"string","description":"Nom de l'outil appelé."},"ok":{"type":"boolean","description":"Toujours vrai sur un 200."},"texte":{"type":"string","description":"Réponse rédigée de l'outil, en Markdown : à montrer ou à résumer à l'utilisateur."},"donnees":{"type":"object","properties":{"mots":{"type":"integer"},"alertes":{"type":"array","items":{"type":"string"}},"conforme":{"type":"boolean"}}}}}},"text/markdown":{"schema":{"type":"string","description":"Texte seul, avec ?format=texte ou Accept: text/markdown."}}}},"400":{"$ref":"#/components/responses/RequeteInvalide"},"401":{"$ref":"#/components/responses/AccesRequis"},"404":{"$ref":"#/components/responses/OutilInconnu"},"422":{"$ref":"#/components/responses/ErreurOutil"},"429":{"$ref":"#/components/responses/LimiteAtteinte"},"500":{"$ref":"#/components/responses/ErreurServeur"}}}},"/api/v1/outils/ne_statut_compte":{"get":{"operationId":"ne_statut_compte","summary":"État du compte et de ce qui reste à configurer","description":"Utiliser quand l'utilisateur demande l'état de son compte Nouvelles Entreprises, ou pour savoir ce qui manque quand un envoi est refusé. Rend les crédits courrier, l'état de l'abonnement et de la recharge mensuelle, l'adresse expéditeur, les campagnes, le décompte des courriers et ce qui reste à régler avant un envoi. Ne pas utiliser pour le détail des envois (ne_suivi_courriers) ni pour modifier une campagne. Nécessite un compte connecté.","tags":["compte"],"parameters":[{"name":"format","in":"query","required":false,"description":"`texte` : rend le texte de l'outil seul, en text/markdown. Défaut : JSON.","schema":{"type":"string","enum":["json","texte"],"default":"json"}}],"security":[{"bearerAuth":[]},{"oauth2":["lecture"]}],"x-openai-isConsequential":false,"responses":{"200":{"description":"Réponse de l'outil.","content":{"application/json":{"schema":{"type":"object","required":["outil","ok","texte","donnees"],"properties":{"outil":{"type":"string","description":"Nom de l'outil appelé."},"ok":{"type":"boolean","description":"Toujours vrai sur un 200."},"texte":{"type":"string","description":"Réponse rédigée de l'outil, en Markdown : à montrer ou à résumer à l'utilisateur."},"donnees":{"type":"object","properties":{"credits":{"type":"integer"},"abonnement_actif":{"type":"boolean"},"recharge_mensuelle_credits":{"type":["integer","null"]},"expediteur_complet":{"type":"boolean"},"campagnes":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"nom":{"type":"string"},"etat":{"type":"string"},"a_valider":{"type":"boolean","description":"Campagne préparée qui attend sa validation dans l'application : rien n'en part avant."},"lien_validation":{"type":["string","null"],"description":"Page où la valider (connexion au compte demandée)."},"courrier_automatique":{"type":"boolean"},"rythme_fichier":{"type":["string","null"],"description":"Rythme du fichier récurrent ; null si la campagne n'en reçoit pas (essai, pause, canal fichier fermé)."},"plis_envoyes":{"type":"integer"}}}},"campagnes_total":{"type":"integer"},"courriers_par_statut":{"type":"object","additionalProperties":{"type":"integer"}},"manques":{"type":"array","items":{"type":"string"}},"envoi_ponctuel_pret":{"type":"boolean"},"campagne_automatique_prete":{"type":"boolean"}}}}}},"text/markdown":{"schema":{"type":"string","description":"Texte seul, avec ?format=texte ou Accept: text/markdown."}}}},"400":{"$ref":"#/components/responses/RequeteInvalide"},"401":{"$ref":"#/components/responses/AccesRequis"},"403":{"$ref":"#/components/responses/PorteeInsuffisante"},"404":{"$ref":"#/components/responses/OutilInconnu"},"422":{"$ref":"#/components/responses/ErreurOutil"},"429":{"$ref":"#/components/responses/LimiteAtteinte"},"500":{"$ref":"#/components/responses/ErreurServeur"}}},"post":{"operationId":"ne_statut_compte_post","summary":"État du compte et de ce qui reste à configurer","description":"Utiliser quand l'utilisateur demande l'état de son compte Nouvelles Entreprises, ou pour savoir ce qui manque quand un envoi est refusé. Rend les crédits courrier, l'état de l'abonnement et de la recharge mensuelle, l'adresse expéditeur, les campagnes, le décompte des courriers et ce qui reste à régler avant un envoi. Ne pas utiliser pour le détail des envois (ne_suivi_courriers) ni pour modifier une campagne. Nécessite un compte connecté.","tags":["compte"],"parameters":[{"name":"format","in":"query","required":false,"description":"`texte` : rend le texte de l'outil seul, en text/markdown. Défaut : JSON.","schema":{"type":"string","enum":["json","texte"],"default":"json"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"security":[{"bearerAuth":[]},{"oauth2":["lecture"]}],"x-openai-isConsequential":false,"responses":{"200":{"description":"Réponse de l'outil.","content":{"application/json":{"schema":{"type":"object","required":["outil","ok","texte","donnees"],"properties":{"outil":{"type":"string","description":"Nom de l'outil appelé."},"ok":{"type":"boolean","description":"Toujours vrai sur un 200."},"texte":{"type":"string","description":"Réponse rédigée de l'outil, en Markdown : à montrer ou à résumer à l'utilisateur."},"donnees":{"type":"object","properties":{"credits":{"type":"integer"},"abonnement_actif":{"type":"boolean"},"recharge_mensuelle_credits":{"type":["integer","null"]},"expediteur_complet":{"type":"boolean"},"campagnes":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"nom":{"type":"string"},"etat":{"type":"string"},"a_valider":{"type":"boolean","description":"Campagne préparée qui attend sa validation dans l'application : rien n'en part avant."},"lien_validation":{"type":["string","null"],"description":"Page où la valider (connexion au compte demandée)."},"courrier_automatique":{"type":"boolean"},"rythme_fichier":{"type":["string","null"],"description":"Rythme du fichier récurrent ; null si la campagne n'en reçoit pas (essai, pause, canal fichier fermé)."},"plis_envoyes":{"type":"integer"}}}},"campagnes_total":{"type":"integer"},"courriers_par_statut":{"type":"object","additionalProperties":{"type":"integer"}},"manques":{"type":"array","items":{"type":"string"}},"envoi_ponctuel_pret":{"type":"boolean"},"campagne_automatique_prete":{"type":"boolean"}}}}}},"text/markdown":{"schema":{"type":"string","description":"Texte seul, avec ?format=texte ou Accept: text/markdown."}}}},"400":{"$ref":"#/components/responses/RequeteInvalide"},"401":{"$ref":"#/components/responses/AccesRequis"},"403":{"$ref":"#/components/responses/PorteeInsuffisante"},"404":{"$ref":"#/components/responses/OutilInconnu"},"422":{"$ref":"#/components/responses/ErreurOutil"},"429":{"$ref":"#/components/responses/LimiteAtteinte"},"500":{"$ref":"#/components/responses/ErreurServeur"}}}},"/api/v1/outils/ne_configurer_expediteur":{"post":{"operationId":"ne_configurer_expediteur","summary":"Renseigner l'adresse expéditeur imprimée sur les courriers","description":"Utiliser quand l'utilisateur donne ou corrige le nom et l'adresse postale à imprimer en expéditeur sur ses courriers ; aucun pli ne part sans cette adresse. Les quatre champs viennent de l'utilisateur : ne pas les déduire ni les compléter soi-même. Remplace l'adresse déjà enregistrée. Ne pas utiliser pour l'adresse d'un destinataire ni pour un ciblage géographique. Nécessite un compte connecté.","tags":["compte"],"parameters":[{"name":"format","in":"query","required":false,"description":"`texte` : rend le texte de l'outil seul, en text/markdown. Défaut : JSON.","schema":{"type":"string","enum":["json","texte"],"default":"json"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"nom":{"type":"string","description":"Raison sociale ou nom affiché en expéditeur."},"adresse":{"type":"string","description":"Numéro et voie (ex. « 12 rue de la République »)."},"code_postal":{"type":"string","description":"Code postal à 5 chiffres."},"ville":{"type":"string","description":"Commune."}},"required":["nom","adresse","code_postal","ville"],"additionalProperties":false}}}},"security":[{"bearerAuth":[]},{"oauth2":["envoi"]}],"x-openai-isConsequential":true,"responses":{"200":{"description":"Réponse de l'outil.","content":{"application/json":{"schema":{"type":"object","required":["outil","ok","texte","donnees"],"properties":{"outil":{"type":"string","description":"Nom de l'outil appelé."},"ok":{"type":"boolean","description":"Toujours vrai sur un 200."},"texte":{"type":"string","description":"Réponse rédigée de l'outil, en Markdown : à montrer ou à résumer à l'utilisateur."},"donnees":{"type":"object","properties":{"nom":{"type":"string"},"adresse":{"type":"string"},"code_postal":{"type":"string"},"ville":{"type":"string"}}}}}},"text/markdown":{"schema":{"type":"string","description":"Texte seul, avec ?format=texte ou Accept: text/markdown."}}}},"400":{"$ref":"#/components/responses/RequeteInvalide"},"401":{"$ref":"#/components/responses/AccesRequis"},"403":{"$ref":"#/components/responses/PorteeInsuffisante"},"404":{"$ref":"#/components/responses/OutilInconnu"},"422":{"$ref":"#/components/responses/ErreurOutil"},"429":{"$ref":"#/components/responses/LimiteAtteinte"},"500":{"$ref":"#/components/responses/ErreurServeur"}}}},"/api/v1/outils/ne_acheter_credits":{"post":{"operationId":"ne_acheter_credits","summary":"Préparer l'achat de crédits courrier","description":"Utiliser quand l'utilisateur demande à acheter des crédits courrier, ou à mettre en place ou changer sa recharge mensuelle. 1 crédit = 1 courrier = 1,50 € HT. Prépare la transaction chez le prestataire de paiement et rend un lien que l'utilisateur ouvre dans son navigateur pour payer : l'outil n'effectue aucun paiement. Mode « unique » : achat ponctuel. Mode « mensuel » : le même nombre de crédits rechargé chaque mois, en remplacement de la recharge en cours s'il y en a une. Ne pas utiliser pour consulter le solde (ne_statut_compte) ni pour arrêter une recharge mensuelle, qui se résilie depuis le compte sur le site. Nécessite un compte connecté.","tags":["compte"],"parameters":[{"name":"format","in":"query","required":false,"description":"`texte` : rend le texte de l'outil seul, en text/markdown. Défaut : JSON.","schema":{"type":"string","enum":["json","texte"],"default":"json"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"nombre":{"type":"integer","minimum":1,"description":"Nombre de crédits (1 crédit = 1 courrier = 1,50 € HT). Volumes proposés : 50, 100, 250, 500, 1 000, 3 000 ; tout autre nombre entier est accepté."},"mode":{"type":"string","enum":["unique","mensuel"],"description":"« unique » = achat ponctuel ; « mensuel » = recharge automatique chaque mois, qui remplace la recharge en cours. Défaut : unique."}},"required":["nombre"],"additionalProperties":false}}}},"security":[{"bearerAuth":[]},{"oauth2":["envoi"]}],"x-openai-isConsequential":true,"responses":{"200":{"description":"Réponse de l'outil.","content":{"application/json":{"schema":{"type":"object","required":["outil","ok","texte","donnees"],"properties":{"outil":{"type":"string","description":"Nom de l'outil appelé."},"ok":{"type":"boolean","description":"Toujours vrai sur un 200."},"texte":{"type":"string","description":"Réponse rédigée de l'outil, en Markdown : à montrer ou à résumer à l'utilisateur."},"donnees":{"type":"object","properties":{"url_paiement":{"type":"string"},"nombre":{"type":"integer"},"mode":{"type":"string","enum":["unique","mensuel"]},"total_ht_cents":{"type":"integer"},"remplace_recharge":{"type":"boolean"}}}}}},"text/markdown":{"schema":{"type":"string","description":"Texte seul, avec ?format=texte ou Accept: text/markdown."}}}},"400":{"$ref":"#/components/responses/RequeteInvalide"},"401":{"$ref":"#/components/responses/AccesRequis"},"403":{"$ref":"#/components/responses/PorteeInsuffisante"},"404":{"$ref":"#/components/responses/OutilInconnu"},"422":{"$ref":"#/components/responses/ErreurOutil"},"429":{"$ref":"#/components/responses/LimiteAtteinte"},"500":{"$ref":"#/components/responses/ErreurServeur"}}}},"/api/v1/outils/ne_lister_acces":{"get":{"operationId":"ne_lister_acces","summary":"Lister les assistants et clés qui ont accès au compte","description":"Utiliser quand l'utilisateur demande quels assistants ou quelles clés ont accès à son compte Nouvelles Entreprises. Rend chaque accès ouvert (connexion d'un assistant ou clé d'accès) avec son nom, sa provenance, ses droits, sa date de dernier usage, et le type et l'identifiant à passer à ne_revoquer_acces. Ne modifie rien. Ne pas utiliser pour couper un accès (ne_revoquer_acces). Nécessite un compte connecté.","tags":["compte"],"parameters":[{"name":"format","in":"query","required":false,"description":"`texte` : rend le texte de l'outil seul, en text/markdown. Défaut : JSON.","schema":{"type":"string","enum":["json","texte"],"default":"json"}}],"security":[{"bearerAuth":[]},{"oauth2":["lecture"]}],"x-openai-isConsequential":false,"responses":{"200":{"description":"Réponse de l'outil.","content":{"application/json":{"schema":{"type":"object","required":["outil","ok","texte","donnees"],"properties":{"outil":{"type":"string","description":"Nom de l'outil appelé."},"ok":{"type":"boolean","description":"Toujours vrai sur un 200."},"texte":{"type":"string","description":"Réponse rédigée de l'outil, en Markdown : à montrer ou à résumer à l'utilisateur."},"donnees":{"type":"object","properties":{"acces":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","enum":["cle","oauth"]},"id":{"type":"string"},"nom":{"type":"string"},"provenance":{"type":"string"},"portees":{"type":"string"},"depuis":{"type":"string","description":"Date (AAAA-MM-JJ) de création de la clé, ou début connu de la connexion."},"dernier_usage":{"type":["string","null"]},"cette_conversation":{"type":"boolean"}}}}}}}}},"text/markdown":{"schema":{"type":"string","description":"Texte seul, avec ?format=texte ou Accept: text/markdown."}}}},"400":{"$ref":"#/components/responses/RequeteInvalide"},"401":{"$ref":"#/components/responses/AccesRequis"},"403":{"$ref":"#/components/responses/PorteeInsuffisante"},"404":{"$ref":"#/components/responses/OutilInconnu"},"422":{"$ref":"#/components/responses/ErreurOutil"},"429":{"$ref":"#/components/responses/LimiteAtteinte"},"500":{"$ref":"#/components/responses/ErreurServeur"}}},"post":{"operationId":"ne_lister_acces_post","summary":"Lister les assistants et clés qui ont accès au compte","description":"Utiliser quand l'utilisateur demande quels assistants ou quelles clés ont accès à son compte Nouvelles Entreprises. Rend chaque accès ouvert (connexion d'un assistant ou clé d'accès) avec son nom, sa provenance, ses droits, sa date de dernier usage, et le type et l'identifiant à passer à ne_revoquer_acces. Ne modifie rien. Ne pas utiliser pour couper un accès (ne_revoquer_acces). Nécessite un compte connecté.","tags":["compte"],"parameters":[{"name":"format","in":"query","required":false,"description":"`texte` : rend le texte de l'outil seul, en text/markdown. Défaut : JSON.","schema":{"type":"string","enum":["json","texte"],"default":"json"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"security":[{"bearerAuth":[]},{"oauth2":["lecture"]}],"x-openai-isConsequential":false,"responses":{"200":{"description":"Réponse de l'outil.","content":{"application/json":{"schema":{"type":"object","required":["outil","ok","texte","donnees"],"properties":{"outil":{"type":"string","description":"Nom de l'outil appelé."},"ok":{"type":"boolean","description":"Toujours vrai sur un 200."},"texte":{"type":"string","description":"Réponse rédigée de l'outil, en Markdown : à montrer ou à résumer à l'utilisateur."},"donnees":{"type":"object","properties":{"acces":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","enum":["cle","oauth"]},"id":{"type":"string"},"nom":{"type":"string"},"provenance":{"type":"string"},"portees":{"type":"string"},"depuis":{"type":"string","description":"Date (AAAA-MM-JJ) de création de la clé, ou début connu de la connexion."},"dernier_usage":{"type":["string","null"]},"cette_conversation":{"type":"boolean"}}}}}}}}},"text/markdown":{"schema":{"type":"string","description":"Texte seul, avec ?format=texte ou Accept: text/markdown."}}}},"400":{"$ref":"#/components/responses/RequeteInvalide"},"401":{"$ref":"#/components/responses/AccesRequis"},"403":{"$ref":"#/components/responses/PorteeInsuffisante"},"404":{"$ref":"#/components/responses/OutilInconnu"},"422":{"$ref":"#/components/responses/ErreurOutil"},"429":{"$ref":"#/components/responses/LimiteAtteinte"},"500":{"$ref":"#/components/responses/ErreurServeur"}}}},"/api/v1/outils/ne_revoquer_acces":{"post":{"operationId":"ne_revoquer_acces","summary":"Révoquer l'accès d'un assistant ou d'une clé au compte","description":"Utiliser quand l'utilisateur demande de couper l'accès d'un assistant ou d'une clé à son compte Nouvelles Entreprises. Prend le type et l'identifiant rendus par ne_lister_acces. Une clé est refusée dès l'appel suivant ; pour un assistant connecté, ses jetons en cours et leur renouvellement sont coupés. Les autres accès restent ouverts. Irréversible : il faudra autoriser à nouveau l'assistant, ou créer une nouvelle clé. Révoquer l'accès qu'utilise l'assistant lui-même coupe la conversation en cours : ses appels suivants seront refusés. Ne pas utiliser pour lister les accès (ne_lister_acces). Nécessite un compte connecté.","tags":["compte"],"parameters":[{"name":"format","in":"query","required":false,"description":"`texte` : rend le texte de l'outil seul, en text/markdown. Défaut : JSON.","schema":{"type":"string","enum":["json","texte"],"default":"json"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","enum":["cle","oauth"],"description":"Type de l'accès, tel que rendu par ne_lister_acces."},"id":{"type":"string","description":"Identifiant de l'accès, tel que rendu par ne_lister_acces."}},"required":["type","id"],"additionalProperties":false}}}},"security":[{"bearerAuth":[]},{"oauth2":["envoi"]}],"x-openai-isConsequential":true,"responses":{"200":{"description":"Réponse de l'outil.","content":{"application/json":{"schema":{"type":"object","required":["outil","ok","texte","donnees"],"properties":{"outil":{"type":"string","description":"Nom de l'outil appelé."},"ok":{"type":"boolean","description":"Toujours vrai sur un 200."},"texte":{"type":"string","description":"Réponse rédigée de l'outil, en Markdown : à montrer ou à résumer à l'utilisateur."},"donnees":{"type":"object","properties":{"type":{"type":"string","enum":["cle","oauth"]},"id":{"type":"string"},"cette_conversation":{"type":"boolean"}}}}}},"text/markdown":{"schema":{"type":"string","description":"Texte seul, avec ?format=texte ou Accept: text/markdown."}}}},"400":{"$ref":"#/components/responses/RequeteInvalide"},"401":{"$ref":"#/components/responses/AccesRequis"},"403":{"$ref":"#/components/responses/PorteeInsuffisante"},"404":{"$ref":"#/components/responses/OutilInconnu"},"422":{"$ref":"#/components/responses/ErreurOutil"},"429":{"$ref":"#/components/responses/LimiteAtteinte"},"500":{"$ref":"#/components/responses/ErreurServeur"}}}},"/api/v1/outils/ne_rechercher_entreprises":{"get":{"operationId":"ne_rechercher_entreprises","summary":"Chercher des entreprises à contacter","description":"Utiliser quand l'utilisateur veut la liste des entreprises françaises à qui écrire pour un ciblage donné (activité, zone, forme juridique, ancienneté), typiquement avant un envoi ponctuel. Rend pour chacune la raison sociale, la forme juridique, le code NAF, la date de création, le code postal et la commune, et l'identifiant à passer à ne_envoyer_courriers. Sont écartées les entreprises fermées, celles qui ont déjà reçu un courrier de ce compte (un pli en erreur ou revenu non distribué ne compte pas : l'entreprise reste proposée) et celles pour lesquelles un retour est enregistré, dont « ne plus contacter ». Sans abonnement, la recherche porte uniquement, pour chaque campagne du compte, sur le ciblage et les dates de création de son dernier fichier (les créations plus récentes sont incluses dans l'abonnement). Au plus 2000 résultats par jour et par compte. Ne pas utiliser pour un simple comptage, que ne_estimer_volume fait sans compte. Nécessite un compte connecté.","tags":["envoi"],"parameters":[{"name":"codes_naf","in":"query","required":false,"description":"Codes NAF/APE sans point (ex. [\"6201Z\", \"7022Z\"]). Vide = toutes activités. Utilisez ne_suggerer_ciblage pour les obtenir à partir d'une description en clair.","style":"form","explode":false,"schema":{"type":"array","items":{"type":"string"}}},{"name":"departements","in":"query","required":false,"description":"Codes de départements français (ex. [\"75\", \"69\", \"2A\"]). Vide = France entière.","style":"form","explode":false,"schema":{"type":"array","items":{"type":"string"}}},{"name":"region","in":"query","required":false,"description":"Région française, par son nom ou son code INSEE (« Auvergne-Rhône-Alpes » ou « 84 »). Ignoré si des départements ou un rayon sont donnés.","schema":{"type":"string"}},{"name":"adresse","in":"query","required":false,"description":"Centre d'un ciblage par rayon : adresse postale française ou nom de commune (« Lyon », « 12 rue de la République, Lyon »). À combiner avec rayon_km. L'adresse retenue est toujours rappelée dans la réponse — vérifiez-la.","schema":{"type":"string"}},{"name":"rayon_km","in":"query","required":false,"description":"Rayon en kilomètres autour de l'adresse (ou des coordonnées), de 5 à 100. Le rayon prime sur les départements et la région. La distance est calculée à vol d'oiseau sur la position réelle de chaque entreprise.","schema":{"type":"number"}},{"name":"latitude","in":"query","required":false,"description":"Latitude du centre (WGS84), pour se passer du géocodage. À utiliser avec longitude et rayon_km.","schema":{"type":"number"}},{"name":"longitude","in":"query","required":false,"description":"Longitude du centre (WGS84). À utiliser avec latitude et rayon_km.","schema":{"type":"number"}},{"name":"formes_juridiques","in":"query","required":false,"description":"Familles juridiques : ei, sas, sarl, sa, sci, societe-civile, association, copropriete, snc-commandite, cooperative-mutuelle, gie. Vide = toutes.","style":"form","explode":false,"schema":{"type":"array","items":{"type":"string"}}},{"name":"age_min_mois","in":"query","required":false,"description":"Ancienneté minimale en mois depuis l'immatriculation. 0 = dès la création.","schema":{"type":"number"}},{"name":"age_max_mois","in":"query","required":false,"description":"Ancienneté maximale en mois. Défaut 3. Au-delà de 12, on quitte les créations récentes pour le stock d'entreprises établies.","schema":{"type":"number"}},{"name":"page","in":"query","required":false,"description":"Page de résultats, à partir de 1.","schema":{"type":"number"}},{"name":"taille_page","in":"query","required":false,"description":"Résultats par page (1 à 100, défaut 25).","schema":{"type":"number"}},{"name":"format","in":"query","required":false,"description":"`texte` : rend le texte de l'outil seul, en text/markdown. Défaut : JSON.","schema":{"type":"string","enum":["json","texte"],"default":"json"}}],"security":[{"bearerAuth":[]},{"oauth2":["lecture"]}],"x-openai-isConsequential":false,"responses":{"200":{"description":"Réponse de l'outil.","content":{"application/json":{"schema":{"type":"object","required":["outil","ok","texte","donnees"],"properties":{"outil":{"type":"string","description":"Nom de l'outil appelé."},"ok":{"type":"boolean","description":"Toujours vrai sur un 200."},"texte":{"type":"string","description":"Réponse rédigée de l'outil, en Markdown : à montrer ou à résumer à l'utilisateur."},"donnees":{"type":"object","properties":{"total":{"type":"integer","description":"Entreprises restant à contacter pour ce ciblage."},"total_borne":{"type":"boolean","description":"Vrai si le total est un plancher (comptage arrêté)."},"page":{"type":"integer"},"taille_page":{"type":"integer"},"ciblage":{"type":"string","description":"Ciblage appliqué, en clair."},"perimetre_essai":{"type":["object","null"],"description":"Compte sans abonnement : recherche limitée aux entreprises déjà livrées par les fichiers de ses campagnes, chacune sur le ciblage et la fenêtre de son dernier fichier (dates incluses). Nul pour un compte abonné.","properties":{"campagne":{"type":"string","description":"Nom de la campagne livrée, ou des campagnes, séparés par des virgules."},"du":{"type":"string","description":"AAAA-MM-JJ : plus ancienne date de création accessible, toutes campagnes confondues."},"au":{"type":"string","description":"AAAA-MM-JJ : plus récente date de création accessible, toutes campagnes confondues."},"campagnes":{"type":"array","description":"Détail par campagne livrée, la plus ancienne d'abord.","items":{"type":"object","properties":{"campagne_id":{"type":"string"},"campagne":{"type":"string"},"date_fichier":{"type":"string","description":"AAAA-MM-JJ : date du dernier fichier de la campagne."},"du":{"type":"string","description":"AAAA-MM-JJ."},"au":{"type":"string","description":"AAAA-MM-JJ."}}}}}},"entreprises":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Identifiant à passer à ne_envoyer_courriers."},"raison_sociale":{"type":"string"},"forme_juridique":{"type":"string"},"code_naf":{"type":"string"},"date_creation":{"type":"string","description":"AAAA-MM-JJ."},"code_postal":{"type":"string"},"commune":{"type":"string"}}}}}}}}},"text/markdown":{"schema":{"type":"string","description":"Texte seul, avec ?format=texte ou Accept: text/markdown."}}}},"400":{"$ref":"#/components/responses/RequeteInvalide"},"401":{"$ref":"#/components/responses/AccesRequis"},"403":{"$ref":"#/components/responses/PorteeInsuffisante"},"404":{"$ref":"#/components/responses/OutilInconnu"},"422":{"$ref":"#/components/responses/ErreurOutil"},"429":{"$ref":"#/components/responses/LimiteAtteinte"},"500":{"$ref":"#/components/responses/ErreurServeur"}}},"post":{"operationId":"ne_rechercher_entreprises_post","summary":"Chercher des entreprises à contacter","description":"Utiliser quand l'utilisateur veut la liste des entreprises françaises à qui écrire pour un ciblage donné (activité, zone, forme juridique, ancienneté), typiquement avant un envoi ponctuel. Rend pour chacune la raison sociale, la forme juridique, le code NAF, la date de création, le code postal et la commune, et l'identifiant à passer à ne_envoyer_courriers. Sont écartées les entreprises fermées, celles qui ont déjà reçu un courrier de ce compte (un pli en erreur ou revenu non distribué ne compte pas : l'entreprise reste proposée) et celles pour lesquelles un retour est enregistré, dont « ne plus contacter ». Sans abonnement, la recherche porte uniquement, pour chaque campagne du compte, sur le ciblage et les dates de création de son dernier fichier (les créations plus récentes sont incluses dans l'abonnement). Au plus 2000 résultats par jour et par compte. Ne pas utiliser pour un simple comptage, que ne_estimer_volume fait sans compte. Nécessite un compte connecté.","tags":["envoi"],"parameters":[{"name":"format","in":"query","required":false,"description":"`texte` : rend le texte de l'outil seul, en text/markdown. Défaut : JSON.","schema":{"type":"string","enum":["json","texte"],"default":"json"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"codes_naf":{"type":"array","items":{"type":"string"},"description":"Codes NAF/APE sans point (ex. [\"6201Z\", \"7022Z\"]). Vide = toutes activités. Utilisez ne_suggerer_ciblage pour les obtenir à partir d'une description en clair."},"departements":{"type":"array","items":{"type":"string"},"description":"Codes de départements français (ex. [\"75\", \"69\", \"2A\"]). Vide = France entière."},"region":{"type":"string","description":"Région française, par son nom ou son code INSEE (« Auvergne-Rhône-Alpes » ou « 84 »). Ignoré si des départements ou un rayon sont donnés."},"adresse":{"type":"string","description":"Centre d'un ciblage par rayon : adresse postale française ou nom de commune (« Lyon », « 12 rue de la République, Lyon »). À combiner avec rayon_km. L'adresse retenue est toujours rappelée dans la réponse — vérifiez-la."},"rayon_km":{"type":"number","description":"Rayon en kilomètres autour de l'adresse (ou des coordonnées), de 5 à 100. Le rayon prime sur les départements et la région. La distance est calculée à vol d'oiseau sur la position réelle de chaque entreprise."},"latitude":{"type":"number","description":"Latitude du centre (WGS84), pour se passer du géocodage. À utiliser avec longitude et rayon_km."},"longitude":{"type":"number","description":"Longitude du centre (WGS84). À utiliser avec latitude et rayon_km."},"formes_juridiques":{"type":"array","items":{"type":"string"},"description":"Familles juridiques : ei, sas, sarl, sa, sci, societe-civile, association, copropriete, snc-commandite, cooperative-mutuelle, gie. Vide = toutes."},"age_min_mois":{"type":"number","description":"Ancienneté minimale en mois depuis l'immatriculation. 0 = dès la création."},"age_max_mois":{"type":"number","description":"Ancienneté maximale en mois. Défaut 3. Au-delà de 12, on quitte les créations récentes pour le stock d'entreprises établies."},"page":{"type":"number","description":"Page de résultats, à partir de 1."},"taille_page":{"type":"number","description":"Résultats par page (1 à 100, défaut 25)."}},"additionalProperties":false}}}},"security":[{"bearerAuth":[]},{"oauth2":["lecture"]}],"x-openai-isConsequential":false,"responses":{"200":{"description":"Réponse de l'outil.","content":{"application/json":{"schema":{"type":"object","required":["outil","ok","texte","donnees"],"properties":{"outil":{"type":"string","description":"Nom de l'outil appelé."},"ok":{"type":"boolean","description":"Toujours vrai sur un 200."},"texte":{"type":"string","description":"Réponse rédigée de l'outil, en Markdown : à montrer ou à résumer à l'utilisateur."},"donnees":{"type":"object","properties":{"total":{"type":"integer","description":"Entreprises restant à contacter pour ce ciblage."},"total_borne":{"type":"boolean","description":"Vrai si le total est un plancher (comptage arrêté)."},"page":{"type":"integer"},"taille_page":{"type":"integer"},"ciblage":{"type":"string","description":"Ciblage appliqué, en clair."},"perimetre_essai":{"type":["object","null"],"description":"Compte sans abonnement : recherche limitée aux entreprises déjà livrées par les fichiers de ses campagnes, chacune sur le ciblage et la fenêtre de son dernier fichier (dates incluses). Nul pour un compte abonné.","properties":{"campagne":{"type":"string","description":"Nom de la campagne livrée, ou des campagnes, séparés par des virgules."},"du":{"type":"string","description":"AAAA-MM-JJ : plus ancienne date de création accessible, toutes campagnes confondues."},"au":{"type":"string","description":"AAAA-MM-JJ : plus récente date de création accessible, toutes campagnes confondues."},"campagnes":{"type":"array","description":"Détail par campagne livrée, la plus ancienne d'abord.","items":{"type":"object","properties":{"campagne_id":{"type":"string"},"campagne":{"type":"string"},"date_fichier":{"type":"string","description":"AAAA-MM-JJ : date du dernier fichier de la campagne."},"du":{"type":"string","description":"AAAA-MM-JJ."},"au":{"type":"string","description":"AAAA-MM-JJ."}}}}}},"entreprises":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Identifiant à passer à ne_envoyer_courriers."},"raison_sociale":{"type":"string"},"forme_juridique":{"type":"string"},"code_naf":{"type":"string"},"date_creation":{"type":"string","description":"AAAA-MM-JJ."},"code_postal":{"type":"string"},"commune":{"type":"string"}}}}}}}}},"text/markdown":{"schema":{"type":"string","description":"Texte seul, avec ?format=texte ou Accept: text/markdown."}}}},"400":{"$ref":"#/components/responses/RequeteInvalide"},"401":{"$ref":"#/components/responses/AccesRequis"},"403":{"$ref":"#/components/responses/PorteeInsuffisante"},"404":{"$ref":"#/components/responses/OutilInconnu"},"422":{"$ref":"#/components/responses/ErreurOutil"},"429":{"$ref":"#/components/responses/LimiteAtteinte"},"500":{"$ref":"#/components/responses/ErreurServeur"}}}},"/api/v1/outils/ne_envoyer_courriers":{"post":{"operationId":"ne_envoyer_courriers","summary":"Envoyer une vague de courriers postaux","description":"Utiliser quand l'utilisateur veut envoyer un courrier postal à des entreprises précises (identifiants rendus par ne_rechercher_entreprises, ou SIRET) : impression, mise sous pli, affranchissement et suivi, 1,50 € HT le pli, débité sur les crédits du compte. Fonctionne en deux temps : un appel sans `confirmation` ne fait que chiffrer l'envoi et rendre un jeton ; montrer ce récapitulatif à l'utilisateur, puis rappeler l'outil avec le jeton seulement après son accord explicite. Le jeton scelle les destinataires, la lettre, le code promo, le QR code et la campagne de rattachement : toute modification oblige à repasser par l'aperçu. Deux modes. Avec `lettre`, les plis partent pendant l'appel (50 destinataires au plus). Avec `campagne_id` et sans `lettre`, la lettre enregistrée sur la campagne part en arrière-plan (500 destinataires au plus). Dans les deux cas, les crédits sont réservés à la confirmation, avant le départ du premier pli, et remboursés pour tout pli qui ne part pas ; un email de confirmation est envoyé au titulaire du compte ; un envoi interrompu côté assistant se poursuit sur le serveur, et ne_suivi_courriers le montre. Sans abonnement, seules les entreprises du ciblage et des dates de création du dernier fichier de chaque campagne du compte peuvent recevoir un pli ; un seul envoi à la fois par compte. Ne pas utiliser pour programmer des envois récurrents (ne_preparer_campagne). Nécessite un compte connecté.","tags":["envoi"],"parameters":[{"name":"format","in":"query","required":false,"description":"`texte` : rend le texte de l'outil seul, en text/markdown. Défaut : JSON.","schema":{"type":"string","enum":["json","texte"],"default":"json"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"entreprise_ids":{"type":"array","items":{"type":"string"},"description":"Identifiants rendus par ne_rechercher_entreprises."},"sirets":{"type":"array","items":{"type":"string"},"description":"SIRET (14 chiffres), alternative aux identifiants."},"lettre":{"type":"string","description":"Texte de la lettre. Variables remplacées à l'impression : {{raisonSociale}}, {{dirigeant}}, {{ville}}. Une page maximum (120 à 160 mots). Absent avec `campagne_id` : la lettre enregistrée sur la campagne part, en arrière-plan."},"campagne_id":{"type":"string","description":"Identifiant d'une campagne du compte (ne_lister_campagnes). Rattache l'envoi à la campagne : statistiques, onglet de la campagne, éligibilité aux relances. Optionnel."},"confirmation":{"type":"string","description":"Jeton rendu par l'appel d'aperçu. Absent = aperçu chiffré, rien n'est envoyé."},"code_promo":{"type":"string","description":"Code promotionnel imprimé dans un encadré sous le texte. Avec `lettre` seulement ; avec `campagne_id`, omis = celui de la campagne, chaîne vide = aucun."},"description_promo":{"type":"string","description":"Libellé de l'offre accompagnant le code promo. Mêmes règles que code_promo."},"url_qr":{"type":"string","description":"URL encodée dans un QR code imprimé sous le texte (prise de rendez-vous, page d'offre). Mêmes règles que code_promo."},"libelle_qr":{"type":"string","description":"Légende affichée sous le QR code. Mêmes règles que code_promo."}},"additionalProperties":false}}}},"security":[{"bearerAuth":[]},{"oauth2":["envoi"]}],"x-openai-isConsequential":true,"responses":{"200":{"description":"Réponse de l'outil.","content":{"application/json":{"schema":{"type":"object","required":["outil","ok","texte","donnees"],"properties":{"outil":{"type":"string","description":"Nom de l'outil appelé."},"ok":{"type":"boolean","description":"Toujours vrai sur un 200."},"texte":{"type":"string","description":"Réponse rédigée de l'outil, en Markdown : à montrer ou à résumer à l'utilisateur."},"donnees":{"type":"object","properties":{"apercu":{"type":"boolean","description":"Vrai pour l'aperçu : rien n'est parti."},"mode":{"type":"string","enum":["immediat","arriere_plan"]},"destinataires":{"type":"integer"},"ecartes":{"type":"integer","description":"Destinataires non contactables retirés de l'envoi."},"hors_perimetre":{"type":"integer","description":"Compte sans abonnement : destinataires retirés, hors du ciblage et des dates de création du dernier fichier de chaque campagne du compte (compris dans `ecartes` à l'aperçu)."},"introuvables":{"type":"array","items":{"type":"string"},"description":"Identifiants ou SIRET inconnus, ignorés."},"cout_cents":{"type":"integer","description":"Coût en centimes d'euro HT."},"credits_disponibles":{"type":"integer"},"campagne_id":{"type":"string"},"campagne_nom":{"type":"string"},"confirmation":{"type":"string","description":"Jeton à repasser pour confirmer l'envoi (15 minutes)."},"envoyes":{"type":"integer","description":"Plis partis et débités, `a_verifier` compris."},"erreurs":{"type":"integer","description":"Plis refusés ou annulés : crédits remboursés."},"a_verifier":{"type":"integer","description":"Parmi les plis partis : remise non confirmée par le service d'envoi (réponse perdue, annulation refusée) ; débités, vérifiés auprès du service d'envoi."},"en_arriere_plan":{"type":"boolean"}}}}}},"text/markdown":{"schema":{"type":"string","description":"Texte seul, avec ?format=texte ou Accept: text/markdown."}}}},"400":{"$ref":"#/components/responses/RequeteInvalide"},"401":{"$ref":"#/components/responses/AccesRequis"},"403":{"$ref":"#/components/responses/PorteeInsuffisante"},"404":{"$ref":"#/components/responses/OutilInconnu"},"422":{"$ref":"#/components/responses/ErreurOutil"},"429":{"$ref":"#/components/responses/LimiteAtteinte"},"500":{"$ref":"#/components/responses/ErreurServeur"}}}},"/api/v1/outils/ne_recevoir_fichier_gratuit":{"post":{"operationId":"ne_recevoir_fichier_gratuit","summary":"Recevoir le premier fichier gratuit","description":"Envoie par email, à l'adresse du compte, un fichier CSV des entreprises correspondant au ciblage : celles créées depuis le 1er du mois précédent, ou toutes celles de la tranche d'ancienneté demandée. C'est l'essai gratuit du site, une fois par compte : le ciblage est enregistré comme campagne d'essai, sans courrier. Comme tout essai du site, cette campagne d'essai déclenche jusqu'à cinq emails de suivi à l'adresse du compte sur trois semaines, avec lien de désinscription. Utiliser quand l'utilisateur demande à recevoir ce fichier ou à essayer le service sur un ciblage. Ne pas utiliser pour envoyer des courriers ni pour préparer un courrier automatique (ne_preparer_campagne, qui envoie aussi ce premier fichier à un compte sans campagne ni abonnement), ni pour un compte qui a déjà une campagne ou un abonnement actif : l'outil refuse et indique la marche à suivre. Au moins un code NAF est requis. Nécessite un compte connecté.","tags":["campagnes"],"parameters":[{"name":"format","in":"query","required":false,"description":"`texte` : rend le texte de l'outil seul, en text/markdown. Défaut : JSON.","schema":{"type":"string","enum":["json","texte"],"default":"json"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"codes_naf":{"type":"array","items":{"type":"string"},"description":"Codes NAF/APE sans point (ex. [\"6201Z\", \"7022Z\"]). Au moins un code. ne_suggerer_ciblage les donne à partir d'une activité décrite en clair."},"departements":{"type":"array","items":{"type":"string"},"description":"Codes de départements français (ex. [\"75\", \"69\", \"2A\"]). Vide = France entière."},"region":{"type":"string","description":"Région française, par son nom ou son code INSEE (« Auvergne-Rhône-Alpes » ou « 84 »). Ignoré si des départements ou un rayon sont donnés."},"adresse":{"type":"string","description":"Centre d'un ciblage par rayon : adresse postale française ou nom de commune (« Lyon », « 12 rue de la République, Lyon »). À combiner avec rayon_km. L'adresse retenue est toujours rappelée dans la réponse — vérifiez-la."},"rayon_km":{"type":"number","description":"Rayon en kilomètres autour de l'adresse (ou des coordonnées), de 5 à 100. Le rayon prime sur les départements et la région. La distance est calculée à vol d'oiseau sur la position réelle de chaque entreprise."},"latitude":{"type":"number","description":"Latitude du centre (WGS84), pour se passer du géocodage. À utiliser avec longitude et rayon_km."},"longitude":{"type":"number","description":"Longitude du centre (WGS84). À utiliser avec latitude et rayon_km."},"formes_juridiques":{"type":"array","items":{"type":"string"},"description":"Familles juridiques : ei, sas, sarl, sa, sci, societe-civile, association, copropriete, snc-commandite, cooperative-mutuelle, gie. Vide = toutes."},"age_min_mois":{"type":"number","description":"Ancienneté minimale en mois depuis l'immatriculation. Défaut 0 : dès la création."},"age_max_mois":{"type":"number","description":"Ancienneté maximale en mois (600 au plus). Avec age_min_mois à 0 et la valeur par défaut (3), le fichier contient les créations depuis le 1er du mois précédent ; toute autre combinaison, toutes les entreprises de la tranche."},"nom":{"type":"string","description":"Nom de la campagne d'essai. Défaut : « Ma campagne »."}},"required":["codes_naf"],"additionalProperties":false}}}},"security":[{"bearerAuth":[]},{"oauth2":["envoi"]}],"x-openai-isConsequential":true,"responses":{"200":{"description":"Réponse de l'outil.","content":{"application/json":{"schema":{"type":"object","required":["outil","ok","texte","donnees"],"properties":{"outil":{"type":"string","description":"Nom de l'outil appelé."},"ok":{"type":"boolean","description":"Toujours vrai sur un 200."},"texte":{"type":"string","description":"Réponse rédigée de l'outil, en Markdown : à montrer ou à résumer à l'utilisateur."},"donnees":{"type":"object","properties":{"campagne_id":{"type":"string","description":"Identifiant de la campagne d'essai, pour ne_preparer_campagne et ne_modifier_campagne."},"entreprises":{"type":["integer","null"],"description":"Nombre d'entreprises du fichier."},"fichier_envoye":{"type":"boolean"},"contenu":{"type":"string"},"lien_validation":{"type":"string","description":"Page où la campagne se valide dans l'application."}}}}}},"text/markdown":{"schema":{"type":"string","description":"Texte seul, avec ?format=texte ou Accept: text/markdown."}}}},"400":{"$ref":"#/components/responses/RequeteInvalide"},"401":{"$ref":"#/components/responses/AccesRequis"},"403":{"$ref":"#/components/responses/PorteeInsuffisante"},"404":{"$ref":"#/components/responses/OutilInconnu"},"422":{"$ref":"#/components/responses/ErreurOutil"},"429":{"$ref":"#/components/responses/LimiteAtteinte"},"500":{"$ref":"#/components/responses/ErreurServeur"}}}},"/api/v1/outils/ne_preparer_campagne":{"post":{"operationId":"ne_preparer_campagne","summary":"Préparer une campagne de courrier automatique","description":"Utiliser quand l'utilisateur veut automatiser ses envois : qu'un courrier parte chaque jour ouvré aux entreprises nouvellement créées d'un ciblage. Enregistre la campagne dans le compte, inactive, avec son ciblage, sa lettre et sa relance. L'outil ne dépense rien et n'active aucun envoi ; l'activation, et le paiement s'il y en a un, se font dans l'application, via le lien rendu. Une fois validée, le courrier part chaque jour ouvré à 10 h (heure de Paris), 1,50 € HT le pli, vers les entreprises les plus récentes de la liste, dans la limite des crédits du compte, partagés entre ses campagnes. Pour un compte sans abonnement ni campagne, envoie aussi le premier fichier gratuit d'entreprises à l'adresse du compte. La campagne d'un tel compte est créée en essai et, comme tout essai du site, déclenche jusqu'à cinq emails de suivi à cette adresse sur trois semaines, avec lien de désinscription ; s'il a une recharge mensuelle, elle est créée en pause, sans ces emails. Sans abonnement, l'outil ne crée pas de nouvelle campagne pour un compte qui en a déjà une : il complète celle du premier fichier gratuit quand le ciblage est le même, sinon il rend le lien de validation de la campagne existante. Pour un compte abonné, chaque appel prépare une campagne de plus ; un appel identique rejoué dans les 30 minutes rend celle déjà préparée. Ne pas utiliser pour un envoi ponctuel à des entreprises choisies (ne_envoyer_courriers) ni pour modifier une campagne existante (ne_modifier_campagne). Au moins un code NAF et le texte de la lettre sont requis. Nécessite un compte connecté.","tags":["campagnes"],"parameters":[{"name":"format","in":"query","required":false,"description":"`texte` : rend le texte de l'outil seul, en text/markdown. Défaut : JSON.","schema":{"type":"string","enum":["json","texte"],"default":"json"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"codes_naf":{"type":"array","items":{"type":"string"},"description":"Codes NAF/APE sans point (ex. [\"6201Z\", \"7022Z\"]). Au moins un code. ne_suggerer_ciblage les donne à partir d'une activité décrite en clair."},"departements":{"type":"array","items":{"type":"string"},"description":"Codes de départements français (ex. [\"75\", \"69\", \"2A\"]). Vide = France entière."},"region":{"type":"string","description":"Région française, par son nom ou son code INSEE (« Auvergne-Rhône-Alpes » ou « 84 »). Ignoré si des départements ou un rayon sont donnés."},"adresse":{"type":"string","description":"Centre d'un ciblage par rayon : adresse postale française ou nom de commune (« Lyon », « 12 rue de la République, Lyon »). À combiner avec rayon_km. L'adresse retenue est toujours rappelée dans la réponse — vérifiez-la."},"rayon_km":{"type":"number","description":"Rayon en kilomètres autour de l'adresse (ou des coordonnées), de 5 à 100. Le rayon prime sur les départements et la région. La distance est calculée à vol d'oiseau sur la position réelle de chaque entreprise."},"latitude":{"type":"number","description":"Latitude du centre (WGS84), pour se passer du géocodage. À utiliser avec longitude et rayon_km."},"longitude":{"type":"number","description":"Longitude du centre (WGS84). À utiliser avec latitude et rayon_km."},"formes_juridiques":{"type":"array","items":{"type":"string"},"description":"Familles juridiques : ei, sas, sarl, sa, sci, societe-civile, association, copropriete, snc-commandite, cooperative-mutuelle, gie. Vide = toutes."},"age_min_mois":{"type":"number","description":"Ancienneté minimale en mois depuis l'immatriculation. Défaut 0 : dès la création."},"age_max_mois":{"type":"number","description":"Ancienneté maximale en mois (600 au plus). Avec age_min_mois à 0 et la valeur par défaut (3), la liste suit les créations des 90 derniers jours ; toute autre combinaison fixe une tranche d'âge, dont toutes les entreprises entrent dans la liste."},"nom":{"type":"string","description":"Nom de la campagne (ex. « RC Pro — BTP Rhône »). Défaut : « Ma campagne »."},"lettre":{"type":"string","description":"Texte de la lettre, imprimé à chaque passage une fois la campagne validée. Variables : {{raisonSociale}}, {{dirigeant}}, {{ville}}. ne_relire_lettre permet de la vérifier."},"frequence":{"type":"string","enum":["quotidien","hebdomadaire","mensuel"],"description":"Rythme du fichier d'entreprises envoyé par email une fois la campagne validée : chaque jour ouvré (défaut), chaque semaine ou chaque mois. Sans effet sur le prix ni sur le courrier."},"relance_auto":{"type":"boolean","description":"Relance des entreprises sans retour enregistré : jusqu'à deux courriers de plus par entreprise, espacés du délai ci-dessous, chacun un pli payant. Défaut : non."},"relance_delai_jours":{"type":"number","description":"Jours entre un courrier et la relance suivante (7 à 365, défaut 30)."},"courriers_par_mois":{"type":"integer","minimum":0,"description":"Budget retenu avec l'utilisateur, en courriers par mois (1 courrier = 1 crédit), reporté sur la page de validation ; rien n'est acheté par cet outil. Valeurs usuelles : 50, 100, 250, 500, 1 000, 3 000. Défaut : tiré du nombre d'entreprises de la liste."}},"required":["lettre","codes_naf"],"additionalProperties":false}}}},"security":[{"bearerAuth":[]},{"oauth2":["envoi"]}],"x-openai-isConsequential":true,"responses":{"200":{"description":"Réponse de l'outil.","content":{"application/json":{"schema":{"type":"object","required":["outil","ok","texte","donnees"],"properties":{"outil":{"type":"string","description":"Nom de l'outil appelé."},"ok":{"type":"boolean","description":"Toujours vrai sur un 200."},"texte":{"type":"string","description":"Réponse rédigée de l'outil, en Markdown : à montrer ou à résumer à l'utilisateur."},"donnees":{"type":"object","properties":{"preparee":{"type":"boolean","description":"Vrai si cet appel a préparé la campagne, ou, pour un compte abonné, s'il rejoue à l'identique l'appel qui l'a préparée (voir rejeu) ; faux s'il n'a rien enregistré, la réponse dit pourquoi."},"rejeu":{"type":"boolean","description":"Présent et vrai si un appel identique avait déjà préparé cette campagne (compte abonné) depuis moins de 30 minutes : cet appel n'a rien créé."},"campagne_id":{"type":"string"},"etat":{"type":"string","description":"essai ou en pause : la campagne n'envoie rien avant sa validation."},"lien_validation":{"type":["string","null"],"description":"Page où l'utilisateur valide la campagne ; lien de connexion à usage unique, valable 1 heure."},"fichier_entreprises":{"type":["integer","null"],"description":"Entreprises du premier fichier gratuit envoyé par cet appel."},"estimation":{"type":"object","properties":{"prochain_passage":{"type":"string","description":"Jour du prochain passage (AAAA-MM-JJ, heure de Paris)."},"plis":{"type":"integer"},"cout_cents":{"type":"integer"},"en_attente":{"type":["integer","null"]},"credits_au_passage":{"type":"integer"},"blocage":{"type":["string","null"],"description":"Ce qui empêche tout pli de cette campagne à ce passage : campagne_inactive, abonnement, validation (campagne préparée à valider dans l'application), expediteur, credits ; null si rien ne bloque."},"plis_pris_aux_autres_campagnes":{"type":"integer"}}},"courriers_par_mois":{"type":["integer","null"],"description":"Volume de la recharge mensuelle proposée sur la page de validation."}}}}}},"text/markdown":{"schema":{"type":"string","description":"Texte seul, avec ?format=texte ou Accept: text/markdown."}}}},"400":{"$ref":"#/components/responses/RequeteInvalide"},"401":{"$ref":"#/components/responses/AccesRequis"},"403":{"$ref":"#/components/responses/PorteeInsuffisante"},"404":{"$ref":"#/components/responses/OutilInconnu"},"422":{"$ref":"#/components/responses/ErreurOutil"},"429":{"$ref":"#/components/responses/LimiteAtteinte"},"500":{"$ref":"#/components/responses/ErreurServeur"}}}},"/api/v1/outils/ne_lister_campagnes":{"get":{"operationId":"ne_lister_campagnes","summary":"Lister les campagnes du compte","description":"Liste les campagnes du compte : état (essai, active, en pause, résiliée), campagnes préparées qui attendent leur validation dans l'application et l'adresse où les valider, ciblage, liste réelle où puise le courrier, plis envoyés et coût, plis prévus au prochain passage, identifiant. Utiliser quand l'utilisateur demande où en sont ses campagnes, ou pour obtenir l'identifiant attendu par ne_modifier_campagne. Ne pas utiliser pour le statut de distribution des plis (ne_suivi_courriers). Nécessite un compte connecté.","tags":["campagnes"],"parameters":[{"name":"format","in":"query","required":false,"description":"`texte` : rend le texte de l'outil seul, en text/markdown. Défaut : JSON.","schema":{"type":"string","enum":["json","texte"],"default":"json"}}],"security":[{"bearerAuth":[]},{"oauth2":["lecture"]}],"x-openai-isConsequential":false,"responses":{"200":{"description":"Réponse de l'outil.","content":{"application/json":{"schema":{"type":"object","required":["outil","ok","texte","donnees"],"properties":{"outil":{"type":"string","description":"Nom de l'outil appelé."},"ok":{"type":"boolean","description":"Toujours vrai sur un 200."},"texte":{"type":"string","description":"Réponse rédigée de l'outil, en Markdown : à montrer ou à résumer à l'utilisateur."},"donnees":{"type":"object","properties":{"campagnes":{"type":"array","items":{"type":"object"}},"prochain_passage":{"type":"object"}}}}}},"text/markdown":{"schema":{"type":"string","description":"Texte seul, avec ?format=texte ou Accept: text/markdown."}}}},"400":{"$ref":"#/components/responses/RequeteInvalide"},"401":{"$ref":"#/components/responses/AccesRequis"},"403":{"$ref":"#/components/responses/PorteeInsuffisante"},"404":{"$ref":"#/components/responses/OutilInconnu"},"422":{"$ref":"#/components/responses/ErreurOutil"},"429":{"$ref":"#/components/responses/LimiteAtteinte"},"500":{"$ref":"#/components/responses/ErreurServeur"}}},"post":{"operationId":"ne_lister_campagnes_post","summary":"Lister les campagnes du compte","description":"Liste les campagnes du compte : état (essai, active, en pause, résiliée), campagnes préparées qui attendent leur validation dans l'application et l'adresse où les valider, ciblage, liste réelle où puise le courrier, plis envoyés et coût, plis prévus au prochain passage, identifiant. Utiliser quand l'utilisateur demande où en sont ses campagnes, ou pour obtenir l'identifiant attendu par ne_modifier_campagne. Ne pas utiliser pour le statut de distribution des plis (ne_suivi_courriers). Nécessite un compte connecté.","tags":["campagnes"],"parameters":[{"name":"format","in":"query","required":false,"description":"`texte` : rend le texte de l'outil seul, en text/markdown. Défaut : JSON.","schema":{"type":"string","enum":["json","texte"],"default":"json"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"security":[{"bearerAuth":[]},{"oauth2":["lecture"]}],"x-openai-isConsequential":false,"responses":{"200":{"description":"Réponse de l'outil.","content":{"application/json":{"schema":{"type":"object","required":["outil","ok","texte","donnees"],"properties":{"outil":{"type":"string","description":"Nom de l'outil appelé."},"ok":{"type":"boolean","description":"Toujours vrai sur un 200."},"texte":{"type":"string","description":"Réponse rédigée de l'outil, en Markdown : à montrer ou à résumer à l'utilisateur."},"donnees":{"type":"object","properties":{"campagnes":{"type":"array","items":{"type":"object"}},"prochain_passage":{"type":"object"}}}}}},"text/markdown":{"schema":{"type":"string","description":"Texte seul, avec ?format=texte ou Accept: text/markdown."}}}},"400":{"$ref":"#/components/responses/RequeteInvalide"},"401":{"$ref":"#/components/responses/AccesRequis"},"403":{"$ref":"#/components/responses/PorteeInsuffisante"},"404":{"$ref":"#/components/responses/OutilInconnu"},"422":{"$ref":"#/components/responses/ErreurOutil"},"429":{"$ref":"#/components/responses/LimiteAtteinte"},"500":{"$ref":"#/components/responses/ErreurServeur"}}}},"/api/v1/outils/ne_modifier_campagne":{"post":{"operationId":"ne_modifier_campagne","summary":"Suspendre, reprendre ou modifier une campagne","description":"Modifie une campagne du compte. Suspendre le courrier automatique (courrier_actif false) et renommer s'appliquent immédiatement. Reprendre le courrier (courrier_actif true), remplacer la lettre ou changer le ciblage se font en deux temps : un appel sans `confirmation` n'applique que la suspension et le nom éventuels, et rend un aperçu (avant et après, prochain passage, plis et coût) avec un jeton ; l'appel identique avec ce jeton, après accord explicite de l'utilisateur, applique le reste. Seuls les champs fournis changent. La zone se remplace en entier, sauf sur une campagne par rayon où changer le seul rayon garde le centre, et inversement ; une seule borne d'ancienneté garde l'autre. Une campagne en pause, ou préparée et pas encore validée, s'active dans l'application : l'outil rend le lien, sans l'activer. Utiliser quand l'utilisateur veut arrêter, reprendre ou ajuster une campagne existante ; l'identifiant vient de ne_lister_campagnes. Ne pas utiliser pour créer une campagne (ne_preparer_campagne) ni pour un envoi ponctuel (ne_envoyer_courriers). Nécessite un compte connecté.","tags":["campagnes"],"parameters":[{"name":"format","in":"query","required":false,"description":"`texte` : rend le texte de l'outil seul, en text/markdown. Défaut : JSON.","schema":{"type":"string","enum":["json","texte"],"default":"json"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"campagne_id":{"type":"string","description":"Identifiant de la campagne (rendu par ne_lister_campagnes)."},"courrier_actif":{"type":"boolean","description":"false suspend le courrier automatique, tout de suite ; true le reprend, après aperçu et confirmation."},"nom":{"type":"string","description":"Nouveau nom, appliqué tout de suite."},"lettre":{"type":"string","description":"Nouveau texte de lettre pour les passages suivants, après aperçu et confirmation. Variables : {{raisonSociale}}, {{dirigeant}}, {{ville}}."},"codes_naf":{"type":"array","items":{"type":"string"},"description":"Nouveaux codes NAF/APE sans point, qui remplacent les actuels (au moins un). Absent : inchangés."},"departements":{"type":"array","items":{"type":"string"},"description":"Nouveaux départements (ex. [\"75\", \"69\", \"2A\"]), qui remplacent la zone. Absent : zone inchangée ; france_entiere pour tout le territoire."},"region":{"type":"string","description":"Région française, par son nom ou son code INSEE (« Auvergne-Rhône-Alpes » ou « 84 »). Ignoré si des départements ou un rayon sont donnés."},"adresse":{"type":"string","description":"Nouveau centre d'un ciblage par rayon (adresse postale française ou commune). Sur une campagne déjà par rayon, sans rayon_km, le rayon actuel est gardé. L'adresse retenue est rappelée dans l'aperçu."},"rayon_km":{"type":"number","description":"Nouveau rayon en kilomètres (5 à 100). Sur une campagne déjà par rayon, sans nouveau centre, le centre actuel est gardé."},"latitude":{"type":"number","description":"Latitude du centre (WGS84), pour se passer du géocodage. À utiliser avec longitude et rayon_km."},"longitude":{"type":"number","description":"Longitude du centre (WGS84). À utiliser avec latitude et rayon_km."},"formes_juridiques":{"type":"array","items":{"type":"string"},"description":"Nouvelles familles juridiques, qui remplacent les actuelles : ei, sas, sarl, sa, sci, societe-civile, association, copropriete, snc-commandite, cooperative-mutuelle, gie. Absent : inchangées ; toutes_formes retire le filtre."},"age_min_mois":{"type":"number","description":"Nouvelle ancienneté minimale en mois. Fournie seule, l'ancienneté maximale de la campagne est gardée."},"age_max_mois":{"type":"number","description":"Nouvelle ancienneté maximale en mois (600 au plus). Fournie seule, l'ancienneté minimale de la campagne est gardée (0 si elle n'en a pas). De 0 à 3 mois, la liste suit les créations des 90 derniers jours ; toute autre tranche entre entière dans la liste."},"france_entiere":{"type":"boolean","description":"true remplace la zone par la France entière."},"toutes_formes":{"type":"boolean","description":"true retire le filtre de forme juridique."},"confirmation":{"type":"string","description":"Jeton rendu par l'aperçu. Absent : seuls la suspension et le nom s'appliquent, le reste est chiffré sans être appliqué."}},"required":["campagne_id"],"additionalProperties":false}}}},"security":[{"bearerAuth":[]},{"oauth2":["envoi"]}],"x-openai-isConsequential":true,"responses":{"200":{"description":"Réponse de l'outil.","content":{"application/json":{"schema":{"type":"object","required":["outil","ok","texte","donnees"],"properties":{"outil":{"type":"string","description":"Nom de l'outil appelé."},"ok":{"type":"boolean","description":"Toujours vrai sur un 200."},"texte":{"type":"string","description":"Réponse rédigée de l'outil, en Markdown : à montrer ou à résumer à l'utilisateur."},"donnees":{"type":"object","properties":{"apercu":{"type":"boolean","description":"Vrai tant que les changements chiffrés ne sont pas appliqués."},"campagne_id":{"type":"string"},"appliques":{"type":"array","items":{"type":"string"}},"en_attente":{"type":"array","items":{"type":"string"}},"confirmation":{"type":"string"},"estimation":{"type":"object","properties":{"prochain_passage":{"type":"string","description":"Jour du prochain passage (AAAA-MM-JJ, heure de Paris)."},"plis":{"type":"integer"},"cout_cents":{"type":"integer"},"en_attente":{"type":["integer","null"]},"credits_au_passage":{"type":"integer"},"blocage":{"type":["string","null"],"description":"Ce qui empêche tout pli de cette campagne à ce passage : campagne_inactive, abonnement, validation (campagne préparée à valider dans l'application), expediteur, credits ; null si rien ne bloque."},"plis_pris_aux_autres_campagnes":{"type":"integer"}}},"lien_validation":{"type":["string","null"],"description":"Campagne en pause ou pas encore validée : page où l'utilisateur l'active."}}}}}},"text/markdown":{"schema":{"type":"string","description":"Texte seul, avec ?format=texte ou Accept: text/markdown."}}}},"400":{"$ref":"#/components/responses/RequeteInvalide"},"401":{"$ref":"#/components/responses/AccesRequis"},"403":{"$ref":"#/components/responses/PorteeInsuffisante"},"404":{"$ref":"#/components/responses/OutilInconnu"},"422":{"$ref":"#/components/responses/ErreurOutil"},"429":{"$ref":"#/components/responses/LimiteAtteinte"},"500":{"$ref":"#/components/responses/ErreurServeur"}}}},"/api/v1/outils/ne_suivi_courriers":{"get":{"operationId":"ne_suivi_courriers","summary":"Suivre les courriers envoyés","description":"Statut de distribution des courriers envoyés depuis le compte (en cours, envoyé, distribué, retourné, en erreur) et coût, envoi par envoi. Utiliser quand l'utilisateur demande où en sont ses courriers, combien sont arrivés ou ce qu'ils ont coûté. Ne pas utiliser pour la configuration des campagnes (ne_lister_campagnes). Nécessite un compte connecté.","tags":["campagnes"],"parameters":[{"name":"limite","in":"query","required":false,"description":"Nombre d'envois à détailler, du plus récent au plus ancien (1 à 20, défaut 5).","schema":{"type":"number"}},{"name":"format","in":"query","required":false,"description":"`texte` : rend le texte de l'outil seul, en text/markdown. Défaut : JSON.","schema":{"type":"string","enum":["json","texte"],"default":"json"}}],"security":[{"bearerAuth":[]},{"oauth2":["lecture"]}],"x-openai-isConsequential":false,"responses":{"200":{"description":"Réponse de l'outil.","content":{"application/json":{"schema":{"type":"object","required":["outil","ok","texte","donnees"],"properties":{"outil":{"type":"string","description":"Nom de l'outil appelé."},"ok":{"type":"boolean","description":"Toujours vrai sur un 200."},"texte":{"type":"string","description":"Réponse rédigée de l'outil, en Markdown : à montrer ou à résumer à l'utilisateur."},"donnees":{"type":"object","properties":{"par_statut":{"type":"object","additionalProperties":{"type":"integer"}},"envois":{"type":"array","items":{"type":"object"}}}}}}},"text/markdown":{"schema":{"type":"string","description":"Texte seul, avec ?format=texte ou Accept: text/markdown."}}}},"400":{"$ref":"#/components/responses/RequeteInvalide"},"401":{"$ref":"#/components/responses/AccesRequis"},"403":{"$ref":"#/components/responses/PorteeInsuffisante"},"404":{"$ref":"#/components/responses/OutilInconnu"},"422":{"$ref":"#/components/responses/ErreurOutil"},"429":{"$ref":"#/components/responses/LimiteAtteinte"},"500":{"$ref":"#/components/responses/ErreurServeur"}}},"post":{"operationId":"ne_suivi_courriers_post","summary":"Suivre les courriers envoyés","description":"Statut de distribution des courriers envoyés depuis le compte (en cours, envoyé, distribué, retourné, en erreur) et coût, envoi par envoi. Utiliser quand l'utilisateur demande où en sont ses courriers, combien sont arrivés ou ce qu'ils ont coûté. Ne pas utiliser pour la configuration des campagnes (ne_lister_campagnes). Nécessite un compte connecté.","tags":["campagnes"],"parameters":[{"name":"format","in":"query","required":false,"description":"`texte` : rend le texte de l'outil seul, en text/markdown. Défaut : JSON.","schema":{"type":"string","enum":["json","texte"],"default":"json"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"limite":{"type":"number","description":"Nombre d'envois à détailler, du plus récent au plus ancien (1 à 20, défaut 5)."}},"additionalProperties":false}}}},"security":[{"bearerAuth":[]},{"oauth2":["lecture"]}],"x-openai-isConsequential":false,"responses":{"200":{"description":"Réponse de l'outil.","content":{"application/json":{"schema":{"type":"object","required":["outil","ok","texte","donnees"],"properties":{"outil":{"type":"string","description":"Nom de l'outil appelé."},"ok":{"type":"boolean","description":"Toujours vrai sur un 200."},"texte":{"type":"string","description":"Réponse rédigée de l'outil, en Markdown : à montrer ou à résumer à l'utilisateur."},"donnees":{"type":"object","properties":{"par_statut":{"type":"object","additionalProperties":{"type":"integer"}},"envois":{"type":"array","items":{"type":"object"}}}}}}},"text/markdown":{"schema":{"type":"string","description":"Texte seul, avec ?format=texte ou Accept: text/markdown."}}}},"400":{"$ref":"#/components/responses/RequeteInvalide"},"401":{"$ref":"#/components/responses/AccesRequis"},"403":{"$ref":"#/components/responses/PorteeInsuffisante"},"404":{"$ref":"#/components/responses/OutilInconnu"},"422":{"$ref":"#/components/responses/ErreurOutil"},"429":{"$ref":"#/components/responses/LimiteAtteinte"},"500":{"$ref":"#/components/responses/ErreurServeur"}}}},"/api/v1/outils/ne_enregistrer_retour":{"post":{"operationId":"ne_enregistrer_retour","summary":"Enregistrer le retour d'un prospect","description":"Enregistre l'issue d'un prospect contacté : a appelé, rendez-vous pris, devenu client, pas intéressé, ou ne plus contacter. Une entreprise avec un retour n'est plus proposée aux envois ni aux relances du compte ; « ne_plus_contacter » est une exclusion définitive. Remplace le retour précédent de la même entreprise. Utiliser quand l'utilisateur rapporte la réponse d'une entreprise ou une demande de ne plus être contacté. Ne pas utiliser pour une entreprise qui n'a pas répondu. Nécessite un compte connecté.","tags":["campagnes"],"parameters":[{"name":"format","in":"query","required":false,"description":"`texte` : rend le texte de l'outil seul, en text/markdown. Défaut : JSON.","schema":{"type":"string","enum":["json","texte"],"default":"json"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"siret":{"type":"string","description":"SIRET (14 chiffres) de l'entreprise concernée."},"entreprise_id":{"type":"string","description":"Identifiant rendu par ne_rechercher_entreprises, alternative au SIRET."},"statut":{"type":"string","enum":["a_appele","rdv_pris","devenu_client","pas_interesse","ne_plus_contacter"],"description":"Issue constatée."},"note":{"type":"string","description":"Commentaire libre. Optionnel."}},"required":["statut"],"additionalProperties":false}}}},"security":[{"bearerAuth":[]},{"oauth2":["envoi"]}],"x-openai-isConsequential":true,"responses":{"200":{"description":"Réponse de l'outil.","content":{"application/json":{"schema":{"type":"object","required":["outil","ok","texte","donnees"],"properties":{"outil":{"type":"string","description":"Nom de l'outil appelé."},"ok":{"type":"boolean","description":"Toujours vrai sur un 200."},"texte":{"type":"string","description":"Réponse rédigée de l'outil, en Markdown : à montrer ou à résumer à l'utilisateur."},"donnees":{"type":"object","properties":{"entreprise_id":{"type":"string"},"statut":{"type":"string"}}}}}},"text/markdown":{"schema":{"type":"string","description":"Texte seul, avec ?format=texte ou Accept: text/markdown."}}}},"400":{"$ref":"#/components/responses/RequeteInvalide"},"401":{"$ref":"#/components/responses/AccesRequis"},"403":{"$ref":"#/components/responses/PorteeInsuffisante"},"404":{"$ref":"#/components/responses/OutilInconnu"},"422":{"$ref":"#/components/responses/ErreurOutil"},"429":{"$ref":"#/components/responses/LimiteAtteinte"},"500":{"$ref":"#/components/responses/ErreurServeur"}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"Clé d'accès créée par le titulaire depuis son espace client (https://nouvelles-entreprises.com/dashboard#assistants), ou jeton d'accès OAuth émis pour la ressource https://nouvelles-entreprises.com/api/mcp. En-tête Authorization uniquement."},"oauth2":{"type":"oauth2","description":"OAuth 2.1, client public : PKCE S256 obligatoire, enregistrement dynamique sur /oauth/register (RFC 7591). Ressource (RFC 8707) : https://nouvelles-entreprises.com/api/mcp, retenue par défaut si la demande n'en précise pas. L'utilisateur se connecte par un lien reçu par email ; le compte est créé à la première connexion.","flows":{"authorizationCode":{"authorizationUrl":"https://nouvelles-entreprises.com/oauth/authorize","tokenUrl":"https://nouvelles-entreprises.com/oauth/token","refreshUrl":"https://nouvelles-entreprises.com/oauth/token","scopes":{"lecture":"Lire le compte : état, campagnes, courriers, entreprises à contacter.","envoi":"Agir sur le compte : expéditeur, campagnes, accès, envoi de courriers payés en crédits.","offline_access":"Garder l'accès au-delà d'une heure (jeton de rafraîchissement)."}}}}},"schemas":{"Erreur":{"type":"object","required":["ok","erreur"],"properties":{"outil":{"type":"string","description":"Nom de l'outil, quand il est connu."},"ok":{"type":"boolean","description":"Toujours faux sur une erreur."},"erreur":{"type":"string","description":"Ce qui empêche l'appel et comment y remédier, en Markdown."},"donnees":{"type":"object","additionalProperties":true,"description":"Détail structuré, quand l'outil en rend un."},"outils_disponibles":{"type":"array","items":{"type":"string"},"description":"Sur un 404 : les outils existants."}}}},"responses":{"RequeteInvalide":{"description":"Arguments illisibles : paramètre inconnu, type incorrect, corps JSON invalide ou clé passée dans l'URL.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}},"text/markdown":{"schema":{"type":"string"}}}},"AccesRequis":{"description":"Accès requis, ou clé ou jeton refusé (inconnu, expiré, révoqué, émis pour un autre point d'accès).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}},"text/markdown":{"schema":{"type":"string"}}},"headers":{"WWW-Authenticate":{"description":"Défi Bearer, avec resource_metadata (métadonnées de la ressource protégée, RFC 9728) et scope.","schema":{"type":"string"}}}},"PorteeInsuffisante":{"description":"Le jeton n'a pas la portée exigée par l'outil (lecture ou envoi).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}},"text/markdown":{"schema":{"type":"string"}}},"headers":{"WWW-Authenticate":{"description":"Bearer error=\"insufficient_scope\", avec les portées à redemander.","schema":{"type":"string"}}}},"OutilInconnu":{"description":"Aucun outil de ce nom.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}},"text/markdown":{"schema":{"type":"string"}}}},"ErreurOutil":{"description":"L'outil a refusé l'appel ou n'a pas abouti (ciblage invalide, crédits insuffisants…) : le message dit quoi corriger.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}},"text/markdown":{"schema":{"type":"string"}}}},"LimiteAtteinte":{"description":"Limite d'appels sans compte atteinte (60 par minute et par adresse IP).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}},"text/markdown":{"schema":{"type":"string"}}},"headers":{"Retry-After":{"description":"Secondes à attendre.","schema":{"type":"integer"}}}},"ErreurServeur":{"description":"Incident technique : réessayer plus tard ; avant de relancer un envoi, vérifier avec ne_suivi_courriers qu'il n'est pas déjà parti.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}},"text/markdown":{"schema":{"type":"string"}}}}}}}