Documentation
Appeler proprement
Cadence, budget de temps, pagination, idempotence et codes HTTP : les règles nécessaires pour passer du prototype à une intégration fiable.
La cadence, et le temps qu'on se donne
Se cadencer demande de connaître le plafond avant de s'y cogner. Les voici, tels qu'ils sont appliqués — et chaque réponse les porte, celles qui réussissent comprises : X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Window. Ralentis en lisant Remaining, plutôt qu'en attendant le 429.
| Ce qui est borné | Cadence | Compté par | Détail |
|---|---|---|---|
| Toute la surface | 60 / 60 s | par clé (ou par client OAuth) | Compté sur l’ensemble des appels /api/v1 et /api/mcp du même porteur. |
| Générer un texte | 10 / 10 s | par compte | Fenêtre PARTAGÉE avec l’éditeur de l’app : la clé ne contourne pas la cadence. |
| Créer un document | 10 / 10 s | par compte | Gratuit en crédits — la cadence est sa seule borne. |
| Créer un projet | 10 / 10 s | par compte | Gratuit en crédits — la cadence est sa seule borne. |
| Archiver, mettre à la corbeille ou restaurer | 10 / 60 s | par clé (ou client OAuth) | Lots de 10 maximum, prévisualisables avec dryRun. Aucune purge définitive par API/MCP. |
| Vérifier un certificat (sans clé) | 60 / 60 s | par adresse IP | Ouverte sans compte : le plafond se compte sur l’appelant lui-même, pas sur un porteur. |
| Lire les signaux de l’Observatoire (sans clé) | 30 / 60 s | par adresse IP | Ouverte sans compte, gratuite ; rien n’est gardé du texte lu. |
Retry-After ne part que sur un refus : c'est un en-tête de refus, et sur une réponse qui a réussi il se lirait comme un ordre d'attendre. Pas de X-RateLimit-Reset non plus : le limiteur ne connaît l'instant de remise à zéro qu'au refus, et un Reset approximatif ferait dormir un client à côté. Remaining vaut ce qu'il valait au passage de la garde — le jeton de la requête en cours est déjà décompté. Seule exception : la vérification de certificat est publiquement mise en cache, donc elle omet Remaining, qui appartient à un appelant et non à un cache.
Le budget de chaque appel
Chaque opération déclare le temps qu'elle s'autorise. Règle le timeout de ton client au moins dessus : /generate, /verify et /certify prennent jusqu'à 60 s, les lectures 10 à 15. Ces réponses ne sont pas streamées : rien n'arrive avant la fin, un client qui coupe à 30 s perd une génération déjà payée. Le budget de chaque opération est dans la spécification (x-kaneme-timeout-seconds), avec les plafonds ci-dessus (x-kaneme-rate-limits).
Le nombre de voix
1 voix incluse en Gratuit ; 2 par siège payant. Une voix supplémentaire coûte 5 crédits ; en Gratuit, elle exige un premier achat. Une création refusée répond 402 voice_limit_reached.
Lire une liste en entier
Chaque liste rend nextCursor. Tant qu'il n'est pas null, il reste des éléments : rappelle le même endpoint avec ?cursor=…. Nul = tu as tout vu — et cette fois c'est une information, pas une supposition. Le curseur est opaque : recopie-le, ne le fabrique pas. Un curseur illisible est refusé (400) plutôt qu'ignoré, sinon tu boucleras sur la première page en croyant avancer.
Rejouer un appel sans le payer deux fois
Ajoute Idempotency-Key: <ton identifiant> sur les écritures (/generate, /improve, /documents, /voices, /projects, /sources, /certify). Si un appel reste sans réponse, retente avec la même clé : tu récupères la réponse du premier, marquée idempotentReplay, sans second débit ni second document. Clé valable 24 h.
La même clé sur une demande différente est refusée (422) plutôt que rejouée : mieux vaut un refus lisible qu'une réponse qui ne correspond pas. Les mesures (/score, /verify, /compare) n'en prennent pas — une clé y masquerait une re-mesure volontaire.
Les codes, quand ça casse
Chaque erreur porte un code lisible en plus du statut HTTP. ⚠️ Ne pas confondre un ÉCHEC avec une abstention : celle-ci répond 200, avec probability: null.
| Statut | Cause | Que faire |
|---|---|---|
| 401 | Clé absente, inconnue ou révoquée. | Recrée-en une dans Connexions (kaneme.com/connexions). |
| 402 | Crédits insuffisants pour cette opération. | Appelle /estimate avant : il dit le prix et si tu peux le payer. |
| 404 | Ressource inexistante, ou qui ne t’appartient pas. | Les deux cas rendent le même code — dire lequel révélerait l’existence de la ressource d’un autre. |
| 422 | La demande est comprise mais la mesure n’a pas d’objet. | Corps trop court, corpus trop mince, certificat refusé : le motif est dans `code`. |
| 429 | Cadence dépassée. | Attends la fenêtre indiquée. Un retry immédiat la prolonge. |
| 503 | Une couche de mesure est momentanément indisponible. | Le seul code qui désigne un incident de notre côté. Réessayable. |