Pour les développeurs et le QA
Recevez les SMS sur un vrai numéro américain, directement dans votre code.
Une vraie ligne mobile américaine, pas de VoIP, qui remet chaque SMS entrant à votre code : un webhook signé dès que le message est enregistré, et une API REST pour lister et interroger. Votre équipe garde la boîte de réception en direct, l'e-mail et Telegram. Une ligne, 24,99 $US par mois, résiliable à tout moment.
Pourquoi pas un numéro de plateforme télécom ?
Les numéros programmables des plateformes télécom sont le plus souvent classés comme VoIP. L'article de Twilio sur le filtrage de la VoIP avant l'envoi des codes montre son Lookup marquant un numéro Twilio comme nonFixedVoip (Twilio). Si le service sur lequel vous vous inscrivez, ou contre lequel vous testez, filtre la VoIP, son code n'arrivera jamais sur un numéro de plateforme. Une ligne Cleat est une ligne mobile. C'est toute la raison d'en prendre une. En savoir plus sur les types de ligne.
Démarrage rapide
- Prenez une ligne. Créez un compte, vérifiez votre identité et abonnez-vous.
- Créez une clé API dans les Réglages. Elle commence par
clt_et n'est affichée qu'une fois. - Ajoutez un endpoint de webhook dans les Réglages, si vous voulez les push : une URL HTTPS publique. Son secret de signature commence par
whsec_et n'est affiché qu'une fois. - Listez vos lignes, puis interrogez les SMS ou attendez les webhooks.
curl https://cleat.so/api/v1/lines \
-H "Authorization: Bearer $CLEAT_API_KEY"{
"data": [
{
"id": "8f14e45f-ceea-4b6b-9d3c-2a1f0e7c5b10",
"phone": "13055550100",
"label": "Staging sign-ups",
"status": "active",
"createdAt": "2026-09-11T10:00:00.000Z"
}
]
}curl "https://cleat.so/api/v1/lines/$LINE_ID/messages?after=2026-09-11T10:00:00Z&limit=50" \
-H "Authorization: Bearer $CLEAT_API_KEY"{
"data": [
{
"id": "c9a7e0d2-5b1f-4e8a-9f3c-6d2b1a0e4f77",
"line": { "id": "8f14e45f-ceea-4b6b-9d3c-2a1f0e7c5b10", "phone": "13055550100", "label": "Staging sign-ups" },
"from": "55512",
"body": "Your verification code is 704 118",
"code": "704118",
"receivedAt": "2026-09-11T10:02:41.000Z"
}
]
}Webhooks
Quand un SMS arrive, Cleat envoie un POST à chacun de vos endpoints avec ce corps JSON, un header cleat-signature et le user agent Cleat-Webhooks/1.0 :
{
"type": "message.received",
"data": {
"id": "c9a7e0d2-5b1f-4e8a-9f3c-6d2b1a0e4f77",
"line": { "id": "8f14e45f-ceea-4b6b-9d3c-2a1f0e7c5b10", "phone": "13055550100", "label": "Staging sign-ups" },
"from": "55512",
"body": "Your verification code is 704 118",
"code": "704118",
"receivedAt": "2026-09-11T10:02:41.000Z"
}
}Le header de signature ressemble à t=1789120961,v1=5d41…. v1 est le HMAC-SHA256 en hexadécimal du timestamp, d'un point et du corps brut, avec pour clé le secret de signature de l'endpoint. Vérifiez-le sur les octets bruts avant de les parser, et refusez les timestamps anciens pour qu'une livraison capturée ne puisse pas être rejouée.
import crypto from "node:crypto";
import express from "express";
const app = express();
const secret = process.env.CLEAT_WEBHOOK_SECRET; // whsec_…
// cleat-signature: t=<unix seconds>,v1=<hex HMAC-SHA256 of "t.body">
function verified(header, body) {
const parts = Object.fromEntries(String(header).split(",").map((part) => part.split("=")));
const expected = crypto.createHmac("sha256", secret).update(`${parts.t}.${body}`).digest("hex");
const fresh = Math.abs(Date.now() / 1000 - Number(parts.t)) < 300;
return fresh && parts.v1?.length === expected.length &&
crypto.timingSafeEqual(Buffer.from(parts.v1), Buffer.from(expected));
}
app.post("/cleat-webhook", express.raw({ type: "application/json" }), (req, res) => {
const body = req.body.toString("utf8");
if (!verified(req.get("cleat-signature"), body)) return res.sendStatus(401);
const { type, data } = JSON.parse(body);
if (type === "message.received") {
// data.code is Cleat's best guess at a one-time code; data.body is the full text.
console.log(data.line.phone, data.from, data.code ?? data.body);
}
res.sendStatus(200);
});
app.listen(3000);Détails de livraison
- Les endpoints doivent être des URL
https://publiques. Cleat ne suit pas les redirections. - Répondez avec n'importe quel statut 2xx en moins de 10 secondes.
- Chaque SMS est envoyé une fois. Si votre endpoint était indisponible, rattrapez le retard via l'API avec
?after=et lereceivedAtdu dernier SMS traité. L'idd'un SMS ne change jamais : servez-vous-en pour écarter les doublons. - Jusqu'à cinq endpoints par espace de travail. Les Réglages affichent le dernier statut de chaque endpoint et le nombre de livraisons échouées d'affilée.
codeest la meilleure hypothèse de Cleat sur le code à usage unique, ounull. Lebodycomplet est toujours là.- Un code dicté lors d'un appel automatique arrive de la même façon : l'appel est transcrit et livré comme un
message.received, avec la transcription dansbody, le numéro appelant dansfrometcoderempli. Rien dans le payload n'indique qu'une livraison venait d'un appel plutôt que d'un SMS.
Référence de l'API
| Endpoint | Ce qu'il renvoie |
|---|---|
GET /api/v1/lines | Les lignes de l'espace de travail de la clé API, de la plus récente à la plus ancienne : id, phone, label, status (active, grace ou released) et createdAt. |
GET /api/v1/lines/{lineId}/messages | Les SMS d'une ligne. after (ISO 8601) renvoie les SMS reçus après cet instant, du plus ancien au plus récent, pour interroger en boucle. before pagine en arrière, du plus récent au plus ancien. limit va de 1 à 200, 50 par défaut. |
Authorization: Bearer clt_…. Erreurs : 400 pour un timestamp mal formé, 401 pour une clé absente ou révoquée, 402 tant qu'une ligne est suspendue, 404 pour une ligne hors de l'espace de travail de la clé, 429 au-delà de la limite.Limites et permissions
120 requêtes par minute et par clé API ; au-delà, l'API répond 429. Seul le propriétaire de l'espace de travail peut créer des clés API et des endpoints de webhook, et une clé révoquée cesse de fonctionner immédiatement.
Les usages qui conviennent
- Les comptes de votre propre entreprise : consoles cloud, bureaux d'enregistrement, prestataires de paiement, avec les codes publiés sur un canal que votre ingénieur d'astreinte surveille.
- Le staging et le QA de vos propres parcours d'inscription et de connexion, face à un numéro qui se comporte comme le téléphone d'un client.
- Les projets personnels qui ont besoin d'un numéro mobile américain au dossier.
Les usages qui ne conviennent pas
- Envoyer des SMS. Cleat Line est en réception seule.
- Les tests de charge ou les parcs de numéros. Chaque ligne est un abonnement distinct avec un titulaire vérifié. Cleat n'est pas fait pour gérer beaucoup de numéros.
- Les comptes qui ne sont ni les vôtres ni ceux de votre entreprise.
- Tout ce qui demande de la voix en direct. Une ligne ne peut pas appeler, il n'y a pas de sonnerie à décrocher, pas d'audio à diffuser et pas d'enregistrement à récupérer : seulement la transcription d'un appel une fois qu'il est terminé.
Comparatif
| Numéro de plateforme télécom | Numéros MailSlurp | Cleat Line | |
|---|---|---|---|
| Type de numéro | Souvent VoIP au classement ; le Lookup de Twilio marque un numéro Twilio comme nonFixedVoip | “dedicated, non-VoIP mobile numbers” (MailSlurp) | Vraie ligne mobile américaine, pas de VoIP |
| Conçu pour | Envoyer et recevoir à grande échelle | Le QA et les tests de développement | Vos propres comptes, le QA et les petites équipes |
| Vérification du titulaire | KYC entreprise et enregistrement 10DLC | Non précisé | Pièce d'identité officielle et selfie, ou contrôle sans selfie examiné par une personne |
| Amener les SMS dans le code | Webhooks et API | API et webhooks | Webhooks signés et API REST, plus Telegram, e-mail et la boîte de réception |
| Prix | Par numéro plus par message | Pas affiché sur la page | 24,99 $US par mois, SMS entrants compris |
Vous partagez des codes avec des personnes qui ne codent pas ? Voir la 2FA partagée pour les équipes. Pourquoi Google Voice et les autres numéros internet ratent des codes : Google Voice et les codes de vérification. Comment nous traitons l'identité : confiance et sécurité. Les règles de facturation complètes : tarif.
Questions
Y a-t-il une offre gratuite ou un bac à sable ?
Non. Une ligne coûte 24,99 $US par mois, résiliable à tout moment, et personne n'obtient de ligne sans vérifier son identité.
Puis-je envoyer des SMS via l'API ?
Non. Cleat Line reçoit ; elle n'envoie jamais.
Et si un service dicte le code par téléphone au lieu de l'envoyer par SMS ?
L'appel est transcrit et arrive sur votre webhook et dans l'API comme un message ordinaire, avec le code extrait et le numéro appelant dans from. Aucun champ ne vous dit qu'il s'agissait d'un appel.
Y a-t-il des limites de débit ?
Oui : 120 requêtes par minute et par clé API. Les livraisons de webhook ne comptent pas dedans.
À quelle vitesse partent les webhooks ?
Cleat envoie le POST à vos endpoints dès qu'il a enregistré le SMS, en même temps que la boîte en direct, l'e-mail et Telegram. Nous n'avons pas publié de latence mesurée, donc nous n'en annonçons pas.
Puis-je avoir plusieurs numéros ?
Vous pouvez ajouter des lignes à un espace de travail, et chacune est son propre abonnement à 24,99 $US. Cleat n'est pas fait pour gérer des parcs de numéros.
Conservez-vous mes messages ?
Les SMS sont conservés jusqu'à ce que vous supprimiez l'espace de travail ou votre compte. La Politique de confidentialité, en anglais donne les détails.
Sources
Les informations sur les autres entreprises viennent de leurs propres pages, vérifiées en septembre 2026.
- Twilio, filtering VoIP numbers before sending codes https://www.twilio.com/en-us/blog/filter-voip-before-otp-verification
- MailSlurp, phone numbers https://www.mailslurp.com/product/phone-number-sms-service/