cleat.

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

  1. Prenez une ligne. Créez un compte, vérifiez votre identité et abonnez-vous.
  2. Créez une clé API dans les Réglages. Elle commence par clt_ et n'est affichée qu'une fois.
  3. 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.
  4. Listez vos lignes, puis interrogez les SMS ou attendez les webhooks.
Lister les lignes de votre espace de travail
curl https://cleat.so/api/v1/lines \
  -H "Authorization: Bearer $CLEAT_API_KEY"
Réponse
{
  "data": [
    {
      "id": "8f14e45f-ceea-4b6b-9d3c-2a1f0e7c5b10",
      "phone": "13055550100",
      "label": "Staging sign-ups",
      "status": "active",
      "createdAt": "2026-09-11T10:00:00.000Z"
    }
  ]
}
Les SMS reçus après un instant donné, du plus ancien au plus récent
curl "https://cleat.so/api/v1/lines/$LINE_ID/messages?after=2026-09-11T10:00:00Z&limit=50" \
  -H "Authorization: Bearer $CLEAT_API_KEY"
Réponse
{
  "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 :

Corps de la requête
{
  "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.

Vérifier et traiter une livraison (Node.js, Express)
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 le receivedAt du dernier SMS traité. L'id d'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.
  • code est la meilleure hypothèse de Cleat sur le code à usage unique, ou null. Le body complet 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 dans body, le numéro appelant dans from et code rempli. 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

EndpointCe qu'il renvoie
GET /api/v1/linesLes 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}/messagesLes 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.
URL de base https://cleat.so. Authentifiez-vous avec 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écomNuméros MailSlurpCleat Line
Type de numéroSouvent 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 pourEnvoyer et recevoir à grande échelleLe QA et les tests de développementVos propres comptes, le QA et les petites équipes
Vérification du titulaireKYC entreprise et enregistrement 10DLCNon préciséPièce d'identité officielle et selfie, ou contrôle sans selfie examiné par une personne
Amener les SMS dans le codeWebhooks et APIAPI et webhooksWebhooks signés et API REST, plus Telegram, e-mail et la boîte de réception
PrixPar numéro plus par messagePas affiché sur la page24,99 $US par mois, SMS entrants compris
Les informations sur les autres entreprises viennent de leurs propres pages, vérifiées en septembre 2026.

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.

  1. Twilio, filtering VoIP numbers before sending codes https://www.twilio.com/en-us/blog/filter-voip-before-otp-verification
  2. MailSlurp, phone numbers https://www.mailslurp.com/product/phone-number-sms-service/

Prenez une ligne et une clé API.

24,99 $US par mois, résiliable à tout moment.