API OTP pour Android

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.

Chaque OTP, entièrement personnalisable
longueur 4 à 8 validité 60 s à 15 min tentatives 1 à 10 cooldown 30 s à 10 min modèle par requête routage device / SIM
Comment ça marche

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.

ÉTAPE 01

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é.

ÉTAPE 02

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.

ÉTAPE 03

verify_otp

Comparaison en temps constant avec le dernier code émis. Renvoie verified et le nombre de tentatives restantes en cas d'échec.

Endpoints

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
exemples curl

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.

Vos valeurs par défaut

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.

Ouvrir les réglages OTP →

Modèle de sécurité

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.

FAQ

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.

Ajoutez la vérification de numéro en 60 secondes

Créez un compte gratuit, fixez vos valeurs OTP, et laissez votre assistant brancher la vérification dans votre app.