Aller au contenu

Recevoir un lien de connexion pour obtenir une clé

POST
/v1/keys/request
curl --request POST \
--url https://api.arnakoff.com/v1/keys/request \
--header 'Content-Type: application/json' \
--data '{ "email": "[email protected]", "turnstile_token": "0.zrSnRHO7h0HwSjSCU8oyzbjEtD8p.d62306d4ee00c77dda697f959ebbd7bd97" }'

Envoie à l’adresse donnée un e-mail avec un lien de connexion à usage unique, valable 15 minutes, vers la page du site qui donne la clé. La réponse est la même que l’adresse ait déjà une clé ou non, et qu’un lien lui ait été envoyé récemment ou non : au-delà de quelques liens par heure pour une même adresse, la demande est acceptée sans nouvel envoi. Au-delà d’un nombre de liens par heure pour toutes les adresses ensemble, chaque demande reçoit 503 (key_request_unavailable), quelle que soit l’adresse, tant que le plafond est atteint.

Chaque requête porte un jeton Cloudflare Turnstile obtenu sur le site, valable une fois ; le quota est par adresse du client (politique key_request). CORS : seule l’origine du site est autorisée. L’adresse est gardée avec la demande jusqu’à 24 heures après la fin du lien, puis avec la clé qu’elle obtient.

Media typeapplication/json

L’adresse qui recevra le lien et le jeton anti-abus du site.

object
email
required

L’adresse e-mail du compte, qui recevra le lien de connexion.

string
>= 1 characters <= 320 characters
turnstile_token
required

Le jeton donné par le widget Cloudflare Turnstile du site, valable une fois.

string
>= 1 characters <= 2048 characters

Examples

Examplerequest

Une adresse, avec le jeton du widget

{
"email": "[email protected]",
"turnstile_token": "0.zrSnRHO7h0HwSjSCU8oyzbjEtD8p.d62306d4ee00c77dda697f959ebbd7bd97"
}

Demande acceptée. Un lien est envoyé si l’adresse peut en recevoir un.

RateLimit
required
string

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=1
RateLimit-Policy
required
string

Politique 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=60

Corps de requête qui n’est pas un objet JSON avec email et turnstile_token.

Media typeapplication/problem+json

Erreur au format RFC 9457 (application/problem+json).

object
type
required

Adresse de la page du site qui documente ce type d’erreur : la documentation des erreurs suivie du code.

string format: uri
title
required

Résumé du type d’erreur, en français, le même pour toutes ses occurrences.

string
status
required

Code de statut HTTP de la réponse.

integer
>= 400 <= 599
detail
required

Explication de cette occurrence, en français. Ne cite jamais une donnée personnelle.

string
instance

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.

string format: uri-reference
code
required

Identifiant stable du type d’erreur (liste ouverte). Chaque code a un exemple Problem… dans ce contrat.

string
/^[a-z][a-z0-9_]*$/

Examples

ExampleinvalidBody

Corps de demande de clé 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 email et turnstile_token.",
"instance": "tag:arnakoff.com,2026:request:7NQJ4ZWKX3C5RB2D6HVMTPLE9A",
"code": "invalid_body"
}

Jeton anti-abus absent, invalide, expiré ou déjà utilisé.

Media typeapplication/problem+json

Erreur au format RFC 9457 (application/problem+json).

object
type
required

Adresse de la page du site qui documente ce type d’erreur : la documentation des erreurs suivie du code.

string format: uri
title
required

Résumé du type d’erreur, en français, le même pour toutes ses occurrences.

string
status
required

Code de statut HTTP de la réponse.

integer
>= 400 <= 599
detail
required

Explication de cette occurrence, en français. Ne cite jamais une donnée personnelle.

string
instance

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.

string format: uri-reference
code
required

Identifiant stable du type d’erreur (liste ouverte). Chaque code a un exemple Problem… dans ce contrat.

string
/^[a-z][a-z0-9_]*$/

Examples

Examplefailed

Jeton anti-abus refusé

{
"type": "https://arnakoff.com/docs/erreurs/challenge_failed",
"title": "Vérification anti-abus échouée",
"status": 403,
"detail": "Le jeton anti-abus est absent, invalide, expiré ou déjà utilisé. Recharge la vérification et réessaie.",
"instance": "tag:arnakoff.com,2026:request:7NQJ4ZWKX3C5RB2D6HVMTPLE9A",
"code": "challenge_failed"
}

Corps de requête trop gros.

Media typeapplication/problem+json

Erreur au format RFC 9457 (application/problem+json).

object
type
required

Adresse de la page du site qui documente ce type d’erreur : la documentation des erreurs suivie du code.

string format: uri
title
required

Résumé du type d’erreur, en français, le même pour toutes ses occurrences.

string
status
required

Code de statut HTTP de la réponse.

integer
>= 400 <= 599
detail
required

Explication de cette occurrence, en français. Ne cite jamais une donnée personnelle.

string
instance

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.

string format: uri-reference
code
required

Identifiant stable du type d’erreur (liste ouverte). Chaque code a un exemple Problem… dans ce contrat.

string
/^[a-z][a-z0-9_]*$/

Examples

ExampletooLarge

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.

Media typeapplication/problem+json

Erreur au format RFC 9457 (application/problem+json).

object
type
required

Adresse de la page du site qui documente ce type d’erreur : la documentation des erreurs suivie du code.

string format: uri
title
required

Résumé du type d’erreur, en français, le même pour toutes ses occurrences.

string
status
required

Code de statut HTTP de la réponse.

integer
>= 400 <= 599
detail
required

Explication de cette occurrence, en français. Ne cite jamais une donnée personnelle.

string
instance

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.

string format: uri-reference
code
required

Identifiant stable du type d’erreur (liste ouverte). Chaque code a un exemple Problem… dans ce contrat.

string
/^[a-z][a-z0-9_]*$/

Examples

ExamplenotJSON

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"
}

Adresse e-mail invalide.

Media typeapplication/problem+json

Erreur au format RFC 9457 (application/problem+json).

object
type
required

Adresse de la page du site qui documente ce type d’erreur : la documentation des erreurs suivie du code.

string format: uri
title
required

Résumé du type d’erreur, en français, le même pour toutes ses occurrences.

string
status
required

Code de statut HTTP de la réponse.

integer
>= 400 <= 599
detail
required

Explication de cette occurrence, en français. Ne cite jamais une donnée personnelle.

string
instance

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.

string format: uri-reference
code
required

Identifiant stable du type d’erreur (liste ouverte). Chaque code a un exemple Problem… dans ce contrat.

string
/^[a-z][a-z0-9_]*$/

Examples

ExampleinvalidEmail

Adresse e-mail invalide pour le type donné

{
"type": "https://arnakoff.com/docs/erreurs/invalid_input",
"title": "Entrée invalide",
"status": 422,
"detail": "L'entrée n'est pas une adresse e-mail valide.",
"instance": "tag:arnakoff.com,2026:request:7NQJ4ZWKX3C5RB2D6HVMTPLE9A",
"code": "invalid_input"
}

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.

Media typeapplication/problem+json

Erreur au format RFC 9457 (application/problem+json).

object
type
required

Adresse de la page du site qui documente ce type d’erreur : la documentation des erreurs suivie du code.

string format: uri
title
required

Résumé du type d’erreur, en français, le même pour toutes ses occurrences.

string
status
required

Code de statut HTTP de la réponse.

integer
>= 400 <= 599
detail
required

Explication de cette occurrence, en français. Ne cite jamais une donnée personnelle.

string
instance

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.

string format: uri-reference
code
required

Identifiant stable du type d’erreur (liste ouverte). Chaque code a un exemple Problem… dans ce contrat.

string
/^[a-z][a-z0-9_]*$/

Examples

Examplequota

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"
}
RateLimit
required
string

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=1
RateLimit-Policy
required
string

Politique 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=60
Retry-After
required
integer

Secondes à attendre avant de réessayer (RFC 9110, section 10.2.3).

Example
30

Erreur interne du serveur.

Media typeapplication/problem+json

Erreur au format RFC 9457 (application/problem+json).

object
type
required

Adresse de la page du site qui documente ce type d’erreur : la documentation des erreurs suivie du code.

string format: uri
title
required

Résumé du type d’erreur, en français, le même pour toutes ses occurrences.

string
status
required

Code de statut HTTP de la réponse.

integer
>= 400 <= 599
detail
required

Explication de cette occurrence, en français. Ne cite jamais une donnée personnelle.

string
instance

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.

string format: uri-reference
code
required

Identifiant stable du type d’erreur (liste ouverte). Chaque code a un exemple Problem… dans ce contrat.

string
/^[a-z][a-z0-9_]*$/

Examples

Exampleinternal

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.

Media typeapplication/problem+json

Erreur au format RFC 9457 (application/problem+json).

object
type
required

Adresse de la page du site qui documente ce type d’erreur : la documentation des erreurs suivie du code.

string format: uri
title
required

Résumé du type d’erreur, en français, le même pour toutes ses occurrences.

string
status
required

Code de statut HTTP de la réponse.

integer
>= 400 <= 599
detail
required

Explication de cette occurrence, en français. Ne cite jamais une donnée personnelle.

string
instance

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.

string format: uri-reference
code
required

Identifiant stable du type d’erreur (liste ouverte). Chaque code a un exemple Problem… dans ce contrat.

string
/^[a-z][a-z0-9_]*$/

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"
}