---
title: "Fais APPRENDRE la voix : accepté / rejeté / rejet qualifié — gratuit"
method: POST
path: "/api/v1/signal"
tags: ["Voix"]
---

# Fais APPRENDRE la voix : accepté / rejeté / rejet qualifié — gratuit

`POST /api/v1/signal`

## Request

- Base URL: `https://kaneme.com`
- URL: `https://kaneme.com/api/v1/signal`
- Auth: HTTP bearer

## Request body

- object
  - `kind` 'accept' | 'reject' | 'reject_reason', required: « accept » (la sortie lui ressemble), « reject » (pas tout à fait), « reject_reason » (qualifie un rejet déjà envoyé — n’ajoute PAS un second signal).
  - `reason` 'trop_corporate' | 'trop_long' | 'pas_assez_direct' | 'trop_generique' | 'mauvais_angle': Raison du rejet, pour « reject_reason » seulement. Une raison inconnue est refusée.
  - `profileId` string: Voix visée. Par défaut, la voix active du compte.
  - `format` 'newsletter' | 'linkedin_post' | 'tweet_short' | 'thread' | 'tiktok_script' | 'instagram' | 'blog' | 'marketing_page' | 'academic_article' | 'email' | 'slack' | 'internal_note' | 'executive_communication': Canal du texte jugé. C’est LUI qui nourrit le compteur par format, donc la sous-voix de ce canal — sans lui, le signal ne compte que globalement.
  - `projectId` string: Projet concerné, pour le journal de la voix.
  - `documentId` string: Document concerné, pour le journal de la voix.
  - `sourceTitle` string: Intitulé lisible dans le journal.
  - `proposed` string: Le TEXTE que la machine avait proposé (avec « reject »). À envoyer avec `kept` : le signal de réécriture est dérivé serveur des deux textes, jamais reçu tout fait.
  - `kept` string: Le TEXTE remis à la place par l’auteur. Sans lui, `proposed` est ignoré.

## Response `200`

Succès.

- union
  - object
    - `ok` true, required
    - `profileId` string, required
    - `kind` 'reject_reason', required
    - `total` number, required
  - object
    - `ok` true, required
    - `profileId` string, required
    - `kind` 'accept' | 'reject', required
    - `calibration` object, required
      - `level` number, required
      - `signals` number, required
      - `inLevel` number, required
      - `forNext` number, required
      - `toNext` number, required

## Other responses

- `400`: Requête invalide (champ manquant, borne dépassée, curseur illisible).
- `401`: Clé absente, invalide ou révoquée.
- `402`: Crédits insuffisants, OU surface non ouverte à ce compte. code = "subscription_required" : L’API et le MCP se paient en crédits, et ce compte n’en a plus. Recharge ton solde pour réactiver ta clé. code = "credits_exhausted" : lire `window` pour savoir quoi faire (recharger, attendre la période, demander à un admin de relever le budget, relever le plafond de la clé).
- `404`: Ressource introuvable.
- `409`: Conflit d’état ou de clé d’idempotence.
- `422`: Le moteur s’abstient ou le corpus est insuffisant.
- `429`: Cadence dépassée (code « rate_limited »). La réponse porte X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Window et Retry-After — attends la fenêtre indiquée : un retry immédiat la prolonge. Les plafonds appliqués sont dans x-kaneme-rate-limits. Quand le refus vient d’un plafond PAR OPÉRATION (générer, créer un document ou un projet, déposer une source), ces nombres sont ceux de CETTE opération, pas ceux de la surface.
- `500`: Erreur interne.
- `503`: Service ou compteur temporairement indisponible.

---

[API](https://skmtc.dev/kaneme/apis/kaneme-api.md) · [All operations](https://skmtc.dev/kaneme/apis/kaneme-api/llms.txt) · [OpenAPI document](https://skmtc.dev/kaneme/apis/kaneme-api/revisions/752895651cd0?raw)
