OTP et vérification de numéro par SMS pour les codeurs IA
Branchez la vérification par SMS dans n'importe quel projet depuis Claude Code, Cursor, Windsurf, ou en HTTP brut. Les codes partent par votre Android appairé, la comparaison se fait en temps constant, et un plafond strict de 5 codes par numéro par jour coupe l'abus à la racine.
Deux endpoints, un aller-retour
Même logique que l'appel vienne d'un assistant IA via MCP, d'un client externe en HTTPS ou de votre propre backend.
send_otp
Génère le code, stocke son hash avec la durée de vie et le compteur d'essais, puis pousse le SMS via votre Android appairé.
L'utilisateur le reçoit
Le client lit le SMS sur son téléphone et tape le code dans votre formulaire de vérification.
verify_otp
Comparaison en temps constant avec le dernier code émis. Renvoie verified et le nombre de tentatives restantes en cas d'échec.
POST uniquement, auth Bearer
Les GET renvoient 405. Les cookies sont ignorés. La clé API ne traîne jamais dans une URL ni dans l'historique.
Endpoint d'envoi
POST https://app.sms8.io/ajax/otp-send.php
- phone — requis, format E.164
- length — 4 à 8 chiffres, défaut 6
- expires_in — 60 à 900 secondes, défaut 300
- max_attempts — 1 à 10, défaut 5
- template — texte avec le placeholder
{code} - option / devices / useRandomDevice — sélection du device
Endpoint de vérification
POST https://app.sms8.io/ajax/otp-verify.php
- phone — requis, format E.164
- code — le code tapé par l'utilisateur
Réponses :
{verified: true}en succès{verified: false, reason: "code_mismatch", attempts_left: 4}- Autres raisons :
expired,not_found,max_attempts
Appels prêts à copier
Envoyer un OTP
curl -X POST https://app.sms8.io/ajax/otp-send.php \ -H "Authorization: Bearer YOUR_SMS8_API_KEY" \ -d "phone=+33612345678" # Surcharger les defauts : # -d "length=6" -d "expires_in=300" # -d "max_attempts=5" # -d "template=Votre code est {code}, expire bientot." # Choisir le device ou la SIM emettrice : # -d "option=0" --data-urlencode 'devices=["DEVICE_ID"]' # -d "option=1" # diffuse sur tous les devices # -d "option=2" # diffuse sur toutes les SIMs # -d "useRandomDevice=1" # un emetteur aleatoire
Vérifier un code
curl -X POST https://app.sms8.io/ajax/otp-verify.php \ -H "Authorization: Bearer YOUR_SMS8_API_KEY" \ -d "phone=+33612345678" \ -d "code=123456" # Succes : {"verified": true} # Echec : {"verified": false, "reason": "code_mismatch", "attempts_left": 4}
Depuis un assistant IA (MCP)
Si Claude Code, Cursor ou Windsurf sont branchés sur mcp.sms8.io, demandez : "Ajoute la vérification par SMS dans le flow d'inscription via sms8 MCP". L'assistant appelle send_otp et verify_otp avec vos valeurs par défaut et habille les routes d'inscription ou de connexion déjà en place.
Réglez une fois depuis le tableau de bord
Vous fixez les valeurs de repli une bonne fois. Elles s'appliquent dès qu'un appel laisse le champ vide. Les plafonds en dur restent en place quoi qu'il arrive.
Longueur du code
4 à 8 chiffres. Défaut 6. Court pour être retenu, long pour résister au brute-force.
Validité
60 à 900 secondes. Défaut 300 (5 min). Assez court pour limiter le replay, assez long pour que l'utilisateur tape.
Tentatives de vérification
1 à 10 essais avant verrouillage du code. Défaut 5.
Cooldown de renvoi
30 à 600 secondes entre deux envois vers le même numéro. Défaut 60.
Modèle de SMS
Adaptez le texte au ton de la marque. Une seule contrainte : conserver le placeholder {code}.
Éditez vos valeurs
L'aperçu en direct reflète chaque changement. Envoyez un vrai OTP sur votre numéro et faites tout le tour.
Plafonds en dur qui protègent vos clients
5 OTP par numéro / 24 h
Le plafond le plus strict. Non modifiable depuis le compte. Même si votre clé fuit, aucun numéro ne reçoit plus de 5 codes sur 24 h glissantes.
Contrôles transactionnels
Cooldown et plafond 24h tournent en SELECT ... FOR UPDATE. Pas moyen pour deux appels parallèles de passer outre.
Vérification temps constant
verify_otp s'appuie sur hash_equals. Aucune fuite de timing.
POST seulement, pas de cookies
Les GET sur les deux endpoints renvoient 405. Les cookies sont ignorés pour l'auth. Pas de CSRF via balise image.
Plafond d'essais par OTP
5 essais ratés par code par défaut. Ensuite le code est verrouillé et il faut un nouveau send_otp.
Messages d'erreur génériques
Les exceptions internes renvoient Internal error. Aucun stack trace ne fuit côté client.
Questions sur l'OTP
Comment j'envoie un OTP avec SMS8 ?
Faites un POST sur https://app.sms8.io/ajax/otp-send.php avec le numéro. L'endpoint accepte l'en-tête Authorization: Bearer. Champs optionnels : length (4 à 8), expires_in (60 à 900 s), max_attempts (1 à 10), template, et un sélecteur de device.
Comment marche verify_otp ?
POST le numéro et le code tapé par l'utilisateur sur https://app.sms8.io/ajax/otp-verify.php. Le serveur compare en temps constant avec le dernier OTP et renvoie verified: true ou verified: false. En cas d'échec, reason et attempts_left sont fournis.
Quel est le plafond anti-abus ?
Un même numéro reçoit au maximum 5 OTP sur 24 h glissantes. Plafond en dur, non modifiable, qui protège le destinataire même si votre clé fuit.
Faut-il du A2P 10DLC pour les OTP SMS8 ?
Non. SMS8 fait sortir les OTP par votre Android appairé et votre SIM, donc aucune inscription A2P 10DLC n'est requise.
L'assistant peut-il ajouter l'OTP tout seul ?
Oui. Le Skill livré pour Claude Code apprend à l'assistant quand appeler send_otp et verify_otp. Un prompt comme Ajoute la vérification au /signup suffit.