---
title: "Paternité en PROBABILITÉ calibrée — ta voix face à celle de l’IA, ou face à un autre humain"
method: POST
path: "/api/v1/verify"
tags: ["Mesure"]
---

# Paternité en PROBABILITÉ calibrée — ta voix face à celle de l’IA, ou face à un autre humain

`POST /api/v1/verify`

## Request

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

## Request body

- object
  - `text` string, required: Texte à attribuer.
  - `question` 'q1' | 'q2' | 'human' | 'author': q1 = ta voix contre celle de l’IA, la mesure principale (défaut : q1) ; q2 = toi contre un autre humain, en bêta, mesuré seulement si on le demande. Comparée à des imitations IA des auteurs du banc, réalisées à partir de leurs textes de référence. Les aliases historiques human/author restent acceptés.
  - `expectedReferenceId` string: Empreinte attendue depuis prepare_voice_context ; 409 avant calcul si elle a changé.
  - `reportedContextId` string: Contexte déclaré par le client, sans attestation de ce que son modèle a lu.
  - `portableExecutionId` string, uuid: Parcours suivi rendu par prepare_voice_context ; obligatoire avec reportedContextId.
  - `format` 'newsletter' | 'linkedin_post' | 'tweet_short' | 'thread' | 'tiktok_script' | 'instagram' | 'blog' | 'marketing_page' | 'academic_article' | 'email' | 'slack' | 'internal_note' | 'executive_communication': Format déclaré du texte mesuré.
  - `profileId` string: Voix visée. Par défaut, la voix active du compte.

## Response `200`

Succès.

- AuthorshipVerdict
  - `measurement` object
    - `version` 'kaneme.measurement.v1', required
    - `axis` 'q1' | 'q2', required
    - `contrast` string, required
    - `display` string, nullable, required
    - `calibrationLanguage` 'fr' | 'en', required
    - `candidateLanguage` string, required
    - `engine` string, nullable
    - `model` string, required
    - `scoreVersion` string, required
    - `calibrationVersion` string, required
    - `calibrationSource` string, required
    - `limitation` string, required
  - `question` 'author' | 'human', required
  - `probability` number, nullable, required
  - `label` string: Bande en clair, dérivée de `probability` pour la question posée : « Signe cette voix », « Plausiblement cette voix », « Ambigu », puis « Voix générique » (q1) ou « Voix étrangère » (q2). Avant le 12/10/2026 : « Auteur probable », « Auteur plausible », « Imposteur probable ». Absent quand `unavailable` est présent.
  - `band` 'signature' | 'plausible' | 'ambiguous' | 'foreign': La bande de `label`, en clé stable : `signature`, `plausible`, `ambiguous`, `foreign` (sur q1, `foreign` est une écriture générique ; sur q2, une autre voix). Présent exactement quand `label` l’est. Depuis le contrat 5.3.0.
  - `unavailable` 'self_overlap' | 'unsupported_language' | 'voice_language_mismatch' | 'mixed_language' | 'embedding_layer' | 'out_of_distribution' | 'calibration_mismatch': self_overlap — Le texte à juger est déjà, pour l’essentiel, dans la référence qui le juge : la mesure porterait sur elle-même. Juge un texte que la référence ne contient pas — ou retire-le du corpus de cette voix. · unsupported_language — Le texte ne se lit ni en français ni en anglais, même en départageant ces deux seules langues : le verdict n’est calibré que sur elles, chacune avec son propre moteur. Lis le champ `language` de la réponse avant d’appeler : hors du français et de l’anglais, ne demande pas de verdict. · voice_language_mismatch — Le texte et la voix de référence ne sont pas écrits dans la même langue : chaque moteur ne compare un texte qu’à une voix de sa langue. Juge ce texte avec une voix écrite dans sa langue — crée-la si elle n’existe pas. Ne le traduis pas pour contourner ce refus. · mixed_language — Le texte est dans la langue de la voix, mais au moins une phrase entière est dans l’autre langue servie : la mesure mêlerait deux moteurs. Corrige ou retire les passages renvoyés dans `passages` (positions dans le texte), puis relance. Les mots isolés — anglicismes, marques — et les citations entre guillemets ne déclenchent pas ce refus. · embedding_layer — La couche de mesure profonde n’a pas répondu ; sans elle, aucune probabilité n’est calibrée. Réessaie dans un instant si la couche de mesure redevient disponible. · out_of_distribution — Le panel de contraste ne couvre pas le registre de cette voix : la marge existerait, elle ne voudrait rien dire. Verse dans la voix des textes de référence plus proches du registre mesuré. · calibration_mismatch — La version du moteur ne correspond pas à une calibration validée. Attends la correction de la configuration du moteur. Ne modifie ni ne traduis le texte pour contourner ce refus.
  - `language` string
  - `score` number, required
  - `version` string, required
  - `explanation` object
    - `version` string, required
    - `summary` string, required
    - `caveat` string, required
    - `factors` object[], required
      - `id` 'cadence' | 'registre' | 'structure' | 'lexique', required
      - `label` string, required
      - `status` 'aligned' | 'mixed' | 'different' | 'unmeasured', required
      - `gap` number, nullable, required
      - `detail` string, required
  - `passages` object[]: Présent uniquement avec `unavailable: "mixed_language"` : les phrases écrites dans l’autre langue, avec leurs positions (`start`, `end`) dans le texte jugé. Les corriger ou les retirer, puis relancer.
    - `text` string, required
    - `start` integer, required
    - `end` integer, required
    - `language` 'fr' | 'en', required
  - `receipt` object
    - `version` 'kaneme.measurement-receipt.v1', required
    - `measuredAt` string, required
    - `candidateDigest` string, required
    - `referenceId` string, required
    - `profileId` string, required
    - `profileRevision` string, required
    - `axis` 'q1' | 'q2', required
    - `engineVersion` string, required
    - `language` string, required
    - `format` string, nullable, required
    - `reportedContextId` string, nullable, required
    - `contextBinding` 'caller_reported', required
    - `probability` number, nullable, required
    - `unavailable` string, nullable, required
    - `measurement` object, required
      - `version` 'kaneme.measurement.v1', required
      - `axis` 'q1' | 'q2', required
      - `contrast` string, required
      - `display` string, nullable, required
      - `calibrationLanguage` 'fr' | 'en', required
      - `candidateLanguage` string, required
      - `engine` string, nullable
      - `model` string, required
      - `scoreVersion` string, required
      - `calibrationVersion` string, required
      - `calibrationSource` string, required
      - `limitation` string, required
  - `measurementId` string, nullable
  - `axis` 'q1' | 'q2', required
  - `profileId` string, required
  - `confidence` string, required
  - `carries` boolean, required
  - `selfOverlap` number, required
  - `creditsUsed` integer, required
  - `disclaimer` string, required
  - `fidelity` object, required
    - `version` 'kaneme.fidelity-verdict.v1', required
    - `primary` object, required
      - `status` 'measured' | 'unavailable', required
      - `label` string, required
      - `probability` number, nullable, required
    - `details` object, required
      - `q1` object, required
        - `status` 'measured' | 'unavailable', required
        - `probability` number, nullable, required
        - `label` string, nullable, required
        - `confidence` 'none' | 'low' | 'medium' | 'high', required
        - `unavailable` string, nullable, required
      - `style` object, required
        - `status` 'measured' | 'partial' | 'unavailable', required
        - `version` string, required
        - `dimensions` object[], required
          - `passages` object[]
            - `start` number, required
            - `end` number, required
            - `quote` string, required
            - `observation` string, required
            - `basis` 'reference' | 'preference' | 'observation', required
          - `id` 'rythme' | 'lexique' | 'structure' | 'signature', required
          - `label` string, required
          - `measured` boolean, required
          - `score` number, nullable, required
          - `detail` string, required
      - `meaning` object, required
        - `status` 'guarded' | 'warning' | 'not_measured', required
        - `lexicalRetention` number, nullable, required
        - `checks` string[], required
        - `detail` string, required
        - `limitation` string, required
      - `format` object, required
        - `format` string, nullable, required
        - `status` 'learned' | 'provisional' | 'q1_unmeasured' | 'unknown', required
        - `q1Measurable` boolean, nullable, required
        - `humanDocuments` integer, nullable, required
        - `humanWords` integer, nullable, required
        - `requiredDocuments` integer, nullable, required
        - `requiredWords` integer, nullable, required
        - `detail` string, required
    - `benchmarkPolicy` object, required
      - `mode` 'periodic_benchmark', required
      - `comparedPerUserGeneration` false, required
      - `note` string, required
    - `limitation` string, required
  - `executionReceipt` object
    - `version` 'kaneme.portable-execution.v1', required
    - `executionId` string, uuid, required
    - `status` 'context_prepared' | 'cost_estimated' | 'verifying' | 'verified', required
    - `createdAt` string, required
    - `completedAt` string, nullable, required
    - `expiresAt` string, required
    - `voice` object, required
      - `profileId` string, required
      - `voiceRevision` string, required
      - `referenceId` string, required
      - `contextId` string, required
      - `language` string, required
      - `format` string, required
    - `channel` string, required
    - `clientVersion` string, nullable, required
    - `estimate` object, nullable, required
      - `operation` 'verify', required
      - `credits` number, required
      - `conditional` boolean, required
    - `candidateDigest` string, nullable, required
    - `measurementId` string, nullable, required
    - `outcome` 'measured' | 'abstained', nullable, required
    - `steps` object[], required
      - `id` 'context_prepared' | 'cost_estimated' | 'text_submitted' | 'voice_verified', required
      - `status` 'completed' | 'pending', required
      - `evidence` 'server_observed' | 'client_submitted', required
      - `completedAt` string, nullable, required
    - `limitation` string, 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)
