Échanger un lien de connexion contre une clé
const url = 'https://api.arnakoff.com/v1/keys/redeem';const options = { method: 'POST', headers: {'Content-Type': 'application/json'}, body: '{"token":"4fQ8hZp2LmW9xR7cT1vB6nK3sD0aY5uE8iO2jG4wH7q"}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://api.arnakoff.com/v1/keys/redeem \ --header 'Content-Type: application/json' \ --data '{ "token": "4fQ8hZp2LmW9xR7cT1vB6nK3sD0aY5uE8iO2jG4wH7q" }'Échange le jeton d’un lien de connexion contre une nouvelle clé API, affichée une seule fois : le serveur n’en garde qu’une empreinte. Le jeton ne sert qu’une fois. La clé que l’adresse avait déjà est révoquée.
La page du site lit le jeton dans le fragment du lien (#…), qui n’est jamais envoyé à un
serveur, puis l’envoie dans le corps de cette requête. Quota par adresse du client
(politique key_request). CORS : seule l’origine du site est autorisée.
Request Bodyrequired
Section intitulée « Request Bodyrequired »Le jeton du lien de connexion.
object
Le jeton lu dans le fragment du lien, 43 caractères en base62.
Examples
Le jeton du lien
{ "token": "4fQ8hZp2LmW9xR7cT1vB6nK3sD0aY5uE8iO2jG4wH7q"}Responses
Section intitulée « Responses »La clé, à copier maintenant.
Une clé API qui vient d’être créée.
object
La clé, affichée cette seule fois. À garder secrète.
Les quatre derniers caractères de la clé, pour la reconnaître ensuite.
Heure de création de la clé.
Examples
Une clé de production
{ "api_key": "ark_live_7XkP2mQ9vR4tL8wN3bH6jF1sD5gA0c3VkXte", "hint": "kXte", "created_at": "2026-11-03T14:05:00Z"}Quota restant de la politique en cours, selon draft-ietf-httpapi-ratelimit-headers-11 :
r, requêtes encore permises maintenant ; t, secondes avant qu’une requête de plus soit
rendue (pendant ce délai, pas plus de r requêtes), 0 quand le quota est entier.
Example
"key";r=59;t=1Politique de quota, selon draft-ietf-httpapi-ratelimit-headers-11 : q, requêtes
permises par fenêtre ; w, fenêtre en secondes. Le quota entier peut être dépensé d’un
coup, puis il revient au même rythme sur la fenêtre. Politique key sur les routes de
vérification, par clé API (un lot compte pour une requête) ; politique ip sur les routes
sans clé, par adresse du client (préfixe /64 en IPv6) ; politique auth sur les routes de
vérification, par adresse du client, qui compte les clés refusées (mal formées, inconnues
ou révoquées) : une fois ce quota dépensé, les clés envoyées depuis cette adresse ne sont
plus vérifiées et la réponse est 429, même pour une clé valide. La politique auth
n’apparaît que sur ses réponses 429. Sur POST /v1/demo/check, politique demo par
adresse du client et politique demo_global pour tous les clients ensemble, qui
n’apparaît que sur ses réponses 429. Sur POST /v1/keys/request et
POST /v1/keys/redeem, politique key_request par adresse du client. Valeurs de l’exemple
données à titre d’illustration : les quotas dépendent de l’offre.
Example
"key";q=60;w=60Corps de requête qui n’est pas un objet JSON avec token.
Erreur au format RFC 9457 (application/problem+json).
object
Adresse de la page du site qui documente ce type d’erreur : la documentation des erreurs
suivie du code.
Résumé du type d’erreur, en français, le même pour toutes ses occurrences.
Code de statut HTTP de la réponse.
Explication de cette occurrence, en français. Ne cite jamais une donnée personnelle.
Identifiant de cette occurrence : l’URI tag:arnakoff.com,2026:request: suivie de
l’identifiant de la requête, celui de l’en-tête X-Request-ID de la réponse. À citer
quand on signale un problème. Absent d’une erreur d’un élément de POST /v1/check/batch.
Identifiant stable du type d’erreur (liste ouverte). Chaque code a un exemple
Problem… dans ce contrat.
Examples
Corps d'échange de lien mal formé
{ "type": "https://arnakoff.com/docs/erreurs/invalid_body", "title": "Corps de requête invalide", "status": 400, "detail": "Le corps de la requête doit être un objet JSON contenant token.", "instance": "tag:arnakoff.com,2026:request:7NQJ4ZWKX3C5RB2D6HVMTPLE9A", "code": "invalid_body"}Corps de requête trop gros.
Erreur au format RFC 9457 (application/problem+json).
object
Adresse de la page du site qui documente ce type d’erreur : la documentation des erreurs
suivie du code.
Résumé du type d’erreur, en français, le même pour toutes ses occurrences.
Code de statut HTTP de la réponse.
Explication de cette occurrence, en français. Ne cite jamais une donnée personnelle.
Identifiant de cette occurrence : l’URI tag:arnakoff.com,2026:request: suivie de
l’identifiant de la requête, celui de l’en-tête X-Request-ID de la réponse. À citer
quand on signale un problème. Absent d’une erreur d’un élément de POST /v1/check/batch.
Identifiant stable du type d’erreur (liste ouverte). Chaque code a un exemple
Problem… dans ce contrat.
Examples
Corps de requête trop gros
{ "type": "https://arnakoff.com/docs/erreurs/content_too_large", "title": "Corps de requête trop gros", "status": 413, "detail": "Le corps de la requête dépasse la taille autorisée.", "instance": "tag:arnakoff.com,2026:request:7NQJ4ZWKX3C5RB2D6HVMTPLE9A", "code": "content_too_large"}Corps de requête qui n’est pas en application/json.
Erreur au format RFC 9457 (application/problem+json).
object
Adresse de la page du site qui documente ce type d’erreur : la documentation des erreurs
suivie du code.
Résumé du type d’erreur, en français, le même pour toutes ses occurrences.
Code de statut HTTP de la réponse.
Explication de cette occurrence, en français. Ne cite jamais une donnée personnelle.
Identifiant de cette occurrence : l’URI tag:arnakoff.com,2026:request: suivie de
l’identifiant de la requête, celui de l’en-tête X-Request-ID de la réponse. À citer
quand on signale un problème. Absent d’une erreur d’un élément de POST /v1/check/batch.
Identifiant stable du type d’erreur (liste ouverte). Chaque code a un exemple
Problem… dans ce contrat.
Examples
Corps de requête qui n'est pas du JSON
{ "type": "https://arnakoff.com/docs/erreurs/unsupported_media_type", "title": "Type de contenu non pris en charge", "status": 415, "detail": "Le corps de la requête doit être en application/json.", "instance": "tag:arnakoff.com,2026:request:7NQJ4ZWKX3C5RB2D6HVMTPLE9A", "code": "unsupported_media_type"}Lien de connexion mal formé, inconnu, expiré ou déjà utilisé.
Erreur au format RFC 9457 (application/problem+json).
object
Adresse de la page du site qui documente ce type d’erreur : la documentation des erreurs
suivie du code.
Résumé du type d’erreur, en français, le même pour toutes ses occurrences.
Code de statut HTTP de la réponse.
Explication de cette occurrence, en français. Ne cite jamais une donnée personnelle.
Identifiant de cette occurrence : l’URI tag:arnakoff.com,2026:request: suivie de
l’identifiant de la requête, celui de l’en-tête X-Request-ID de la réponse. À citer
quand on signale un problème. Absent d’une erreur d’un élément de POST /v1/check/batch.
Identifiant stable du type d’erreur (liste ouverte). Chaque code a un exemple
Problem… dans ce contrat.
Examples
Lien de connexion inutilisable
{ "type": "https://arnakoff.com/docs/erreurs/invalid_login_link", "title": "Lien de connexion invalide", "status": 422, "detail": "Le lien de connexion est invalide, expiré ou déjà utilisé. Demande un nouveau lien.", "instance": "tag:arnakoff.com,2026:request:7NQJ4ZWKX3C5RB2D6HVMTPLE9A", "code": "invalid_login_link"}Quota dépassé : celui de la clé (key), de l’adresse (ip), des clés refusées depuis
l’adresse (auth), de l’accès de démonstration (demo, demo_global) ou des demandes de
clé (key_request), nommé dans RateLimit-Policy.
Erreur au format RFC 9457 (application/problem+json).
object
Adresse de la page du site qui documente ce type d’erreur : la documentation des erreurs
suivie du code.
Résumé du type d’erreur, en français, le même pour toutes ses occurrences.
Code de statut HTTP de la réponse.
Explication de cette occurrence, en français. Ne cite jamais une donnée personnelle.
Identifiant de cette occurrence : l’URI tag:arnakoff.com,2026:request: suivie de
l’identifiant de la requête, celui de l’en-tête X-Request-ID de la réponse. À citer
quand on signale un problème. Absent d’une erreur d’un élément de POST /v1/check/batch.
Identifiant stable du type d’erreur (liste ouverte). Chaque code a un exemple
Problem… dans ce contrat.
Examples
Quota dépassé
{ "type": "https://arnakoff.com/docs/erreurs/too_many_requests", "title": "Trop de requêtes", "status": 429, "detail": "Le quota de requêtes est atteint. Réessaie après le délai de l'en-tête Retry-After.", "instance": "tag:arnakoff.com,2026:request:7NQJ4ZWKX3C5RB2D6HVMTPLE9A", "code": "too_many_requests"}Quota restant de la politique en cours, selon draft-ietf-httpapi-ratelimit-headers-11 :
r, requêtes encore permises maintenant ; t, secondes avant qu’une requête de plus soit
rendue (pendant ce délai, pas plus de r requêtes), 0 quand le quota est entier.
Example
"key";r=59;t=1Politique de quota, selon draft-ietf-httpapi-ratelimit-headers-11 : q, requêtes
permises par fenêtre ; w, fenêtre en secondes. Le quota entier peut être dépensé d’un
coup, puis il revient au même rythme sur la fenêtre. Politique key sur les routes de
vérification, par clé API (un lot compte pour une requête) ; politique ip sur les routes
sans clé, par adresse du client (préfixe /64 en IPv6) ; politique auth sur les routes de
vérification, par adresse du client, qui compte les clés refusées (mal formées, inconnues
ou révoquées) : une fois ce quota dépensé, les clés envoyées depuis cette adresse ne sont
plus vérifiées et la réponse est 429, même pour une clé valide. La politique auth
n’apparaît que sur ses réponses 429. Sur POST /v1/demo/check, politique demo par
adresse du client et politique demo_global pour tous les clients ensemble, qui
n’apparaît que sur ses réponses 429. Sur POST /v1/keys/request et
POST /v1/keys/redeem, politique key_request par adresse du client. Valeurs de l’exemple
données à titre d’illustration : les quotas dépendent de l’offre.
Example
"key";q=60;w=60Secondes à attendre avant de réessayer (RFC 9110, section 10.2.3).
Example
30Erreur interne du serveur.
Erreur au format RFC 9457 (application/problem+json).
object
Adresse de la page du site qui documente ce type d’erreur : la documentation des erreurs
suivie du code.
Résumé du type d’erreur, en français, le même pour toutes ses occurrences.
Code de statut HTTP de la réponse.
Explication de cette occurrence, en français. Ne cite jamais une donnée personnelle.
Identifiant de cette occurrence : l’URI tag:arnakoff.com,2026:request: suivie de
l’identifiant de la requête, celui de l’en-tête X-Request-ID de la réponse. À citer
quand on signale un problème. Absent d’une erreur d’un élément de POST /v1/check/batch.
Identifiant stable du type d’erreur (liste ouverte). Chaque code a un exemple
Problem… dans ce contrat.
Examples
Erreur interne
{ "type": "https://arnakoff.com/docs/erreurs/internal_error", "title": "Erreur interne", "status": 500, "detail": "Le serveur a rencontré une erreur. Réessaie plus tard.", "instance": "tag:arnakoff.com,2026:request:7NQJ4ZWKX3C5RB2D6HVMTPLE9A", "code": "internal_error"}La demande ne peut pas être traitée pour le moment : envoi d’e-mails ou base des clés indisponible, plafond horaire d’envoi de liens atteint pour toutes les adresses, ou jeton anti-abus impossible à vérifier.
Erreur au format RFC 9457 (application/problem+json).
object
Adresse de la page du site qui documente ce type d’erreur : la documentation des erreurs
suivie du code.
Résumé du type d’erreur, en français, le même pour toutes ses occurrences.
Code de statut HTTP de la réponse.
Explication de cette occurrence, en français. Ne cite jamais une donnée personnelle.
Identifiant de cette occurrence : l’URI tag:arnakoff.com,2026:request: suivie de
l’identifiant de la requête, celui de l’en-tête X-Request-ID de la réponse. À citer
quand on signale un problème. Absent d’une erreur d’un élément de POST /v1/check/batch.
Identifiant stable du type d’erreur (liste ouverte). Chaque code a un exemple
Problem… dans ce contrat.
Examples
Demande de clé indisponible
{ "type": "https://arnakoff.com/docs/erreurs/key_request_unavailable", "title": "Demande de clé indisponible", "status": 503, "detail": "La demande de clé ne peut pas être traitée pour le moment. Réessaie plus tard.", "instance": "tag:arnakoff.com,2026:request:7NQJ4ZWKX3C5RB2D6HVMTPLE9A", "code": "key_request_unavailable"}Vérification anti-abus indisponible
{ "type": "https://arnakoff.com/docs/erreurs/challenge_unavailable", "title": "Vérification anti-abus indisponible", "status": 503, "detail": "Le jeton anti-abus ne peut pas être vérifié pour le moment. Réessaie plus tard.", "instance": "tag:arnakoff.com,2026:request:7NQJ4ZWKX3C5RB2D6HVMTPLE9A", "code": "challenge_unavailable"}