verifying-phones

Verifies phone numbers via SMS OTP using the Sendly Verify API. Sends codes, checks codes, handles expiry, and provides hosted verification sessions. Applies for phone verification, OTP, 2FA, or passwordless login flows.

Safety Notice

This listing is from the official public ClawHub registry. Review SKILL.md and referenced scripts before running.

Copy this and send it to your AI assistant to learn

Install skill "verifying-phones" with this command: npx skills add sendly-live/verifying-phones

Phone Verification with Sendly

Quick start

import Sendly from "@sendly/node";

const sendly = new Sendly(process.env.SENDLY_API_KEY!);

const verification = await sendly.verify.send({ to: "+15551234567" });
console.log(verification.id); // ver_abc123

const result = await sendly.verify.check(verification.id, { code: "123456" });
console.log(result.status); // "verified" | "failed" | "expired"

REST API

Base URL: https://sendly.live/api/v1

Send OTP

curl -X POST https://sendly.live/api/v1/verify \
  -H "Authorization: Bearer $SENDLY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"to": "+15551234567", "app_name": "MyApp", "code_length": 6, "timeout_secs": 300}'

Required: to (E.164 format)

Optional: app_name (shown in SMS), code_length (4–10, default 6), timeout_secs (default 300)

Response:

{
  "id": "ver_abc123",
  "status": "pending",
  "phone": "+15551234567",
  "expires_at": "2026-04-01T10:05:00Z"
}

In sandbox mode (sk_test_* keys), the response includes sandbox_code with the actual code.

Check code

curl -X POST https://sendly.live/api/v1/verify/ver_abc123/check \
  -H "Authorization: Bearer $SENDLY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"code": "123456"}'

Statuses: verified, failed (wrong code), expired, max_attempts_exceeded (3 attempts max)

Resend OTP

curl -X POST https://sendly.live/api/v1/verify/ver_abc123/resend \
  -H "Authorization: Bearer $SENDLY_API_KEY"

Hosted verification sessions

Zero-code verification UI hosted by Sendly:

curl -X POST https://sendly.live/api/v1/verify/sessions \
  -H "Authorization: Bearer $SENDLY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"success_url": "https://yourapp.com/verified?token={TOKEN}", "brand_name": "MyApp"}'

Returns a url the user visits. After verification, redirects to success_url with a token. Validate the token server-side:

curl -X POST https://sendly.live/api/v1/verify/sessions/validate \
  -H "Authorization: Bearer $SENDLY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"token": "tok_from_redirect"}'

Node.js SDK

import Sendly from "@sendly/node";
const sendly = new Sendly(process.env.SENDLY_API_KEY!);

const v = await sendly.verify.send({ to: "+15551234567", appName: "MyApp" });
const check = await sendly.verify.check(v.id, { code: "123456" });
const resend = await sendly.verify.resend(v.id);
const session = await sendly.verify.sessions.create({ successUrl: "https://app.com/done?token={TOKEN}", brandName: "MyApp" });
const validated = await sendly.verify.sessions.validate({ token: "tok_xxx" });

Error handling

ErrorMeaningAction
invalid_phone_numberNot E.164 formatFormat as +{country}{number}
verification_expiredCode timed outCall resend or start new verification
max_attempts_exceeded3 wrong codesStart new verification
rate_limit_exceededToo many requestsWait and retry

Sandbox testing

With sk_test_* keys, the sandbox_code field in the send response contains the code. No real SMS is sent. OTP to +15005550000 always works.

Full reference

Source Transparency

This detail page is rendered from real SKILL.md content. Trust labels are metadata-based hints, not a safety guarantee.

Related Skills

Related by shared tags or category signals.

Coding

run.dev — Local Dev Environment Manager

Local dev environment manager. Process management, automatic HTTPS domains, SSL certificates, reverse proxy, and AI crash diagnosis — single binary, zero con...

Registry SourceRecently Updated
Coding

ifly-image-understanding

iFlytek Image Understanding (图片理解) — analyze and answer questions about images using Spark Vision model. WebSocket API, pure Python stdlib, no pip dependencies.

Registry SourceRecently Updated
Coding

Civic Google

Use gog (Google CLI) without manual OAuth setup — Civic handles token management automatically

Registry SourceRecently Updated
2000Profile unavailable
Coding

Agent Browser.Skip

A fast Rust-based headless browser automation CLI with Node.js fallback that enables AI agents to navigate, click, type, and snapshot pages via structured co...

Registry SourceRecently Updated
2000Profile unavailable