Integrate Ovrtxt into your stack in minutes. Our SDKs abstract away carrier routing, device detection, and webhook signature verification — leaving your team to focus on what matters.
The primary SDK. Full TypeScript types, async/await, WebSocket support for real-time auth events.
Sync and async clients. Django and FastAPI integrations built-in. Type hints throughout.
Idiomatic Go. Context support, zero external dependencies, structured errors.
From zero to verified in 5 lines.
Pick your language. Copy the snippet. That's your entire integration surface.
Installation
Quickstart
import { Ovrtxt } from '@ovrtxt/sdk'; const auth = new Ovrtxt({ apiKey: process.env.OVRTXT_SECRET_KEY }); const session = await auth.verify({ phone: "+15550192834", accountId: "acct_01HZXVK29S8T4MFQNPQ7RBK93A", brandId: "brd_01HZXVK29S8T4MFQNPQ7RBK93B", clientChallenge: "7f83b1657ff1fc53b92dc18148a1d65dfc2d4b1fa3d677284addd200126d9069", webhookUrl: "https://api.joesgym.com/webhooks/ovrtxt" }); // session.id — use to correlate the webhook event // session.fallbackUri — render this as your CTA if channel = sms_fallback console.log(session.id, session.channel);
Installation
Quickstart
from ovrtxt import Ovrtxt import os auth = Ovrtxt(api_key=os.environ["OVRTXT_SECRET_KEY"]) session = auth.verify( phone="+15550192834", account_id="acct_01HZXVK29S8T4MFQNPQ7RBK93A", brand_id="brd_01HZXVK29S8T4MFQNPQ7RBK93B", client_challenge="7f83b1657ff1fc53b92dc18148a1d65dfc2d4b1fa3d677284addd200126d9069", webhook_url="https://api.joesgym.com/webhooks/ovrtxt", ) # session.id — correlate with webhook data.id # session.channel — 'rcs' or 'sms_fallback' # session.fallback_uri — render as CTA if sms_fallback print(f"Session {session.id} via {session.channel}")
Installation
Quickstart
package main import ( "context" "fmt" "os" ovrtxt "github.com/ovrtxt/ovrtxt-go" ) func main() { client := ovrtxt.NewClient(os.Getenv("OVRTXT_SECRET_KEY")) session, err := client.Verify(context.Background(), &ovrtxt.VerifyParams{ Phone: "+15550192834", AccountID: "acct_01HZXVK29S8T4MFQNPQ7RBK93A", BrandID: "brd_01HZXVK29S8T4MFQNPQ7RBK93B", ClientChallenge: "7f83b1657ff1fc53b92dc18148a1d65dfc2d4b1fa3d677284addd200126d9069", WebhookURL: "https://api.joesgym.com/webhooks/ovrtxt", }) if err != nil { panic(err) } fmt.Printf("Session %s via %s\n", session.ID, session.Channel) }
What happens next
Device Detection
Ovrtxt pings the carrier graph to determine if the destination number supports RCS. No polling. No waiting.
RCS or Fallback URI
If RCS-capable: a branded rich card fires instantly. If not: session.fallbackUri contains the OS deep link — render it as a button on your login page.
Webhook or Poll
When the user taps Send, your webhookUrl receives a signed verification.completed event. Alternatively, poll GET /v1/verify/{id}.
User is Authenticated
Total wall-clock time: under 800ms average. Zero outbound OTP exposure. Zero bot attack surface.
End-to-End Zero-Knowledge Verification Pattern
// 1. Frontend (Browser): Generate secret & hash commitment const clientSecret = crypto.randomUUID(); const clientChallenge = await sha256(clientSecret); sessionStorage.setItem('ovrtxt_secret', clientSecret); // 2. Backend: Start verification session via Ovrtxt SDK const session = await auth.verify({ phone: req.body.phone, accountId: process.env.OVRTXT_ACCOUNT_ID, brandId: process.env.OVRTXT_BRAND_ID, clientChallenge: req.body.clientChallenge }); // 3. Backend (Final Auth): Retrieve session & validate cryptographic proof const activeSession = await auth.getSession(req.body.sessionId); const e2e_validation = sha256(req.body.clientSecret) === activeSession.clientChallenge; if (activeSession.status === 'approved' && e2e_validation) { issueUserSessionCookie(res, activeSession.phone); // 🔒 Mathematically verified }
Handling the fallback URI in your frontend:
// React / Mobile component if (session.channel === 'sms_fallback') { return ( <a href={session.fallbackUri} className="btn-auth"> 🔒 Tap to verify via SMS </a> ); }
| Capability | Node.js | Python | Go | REST API |
|---|---|---|---|---|
| Initiate Verification | ✓ | ✓ | ✓ | ✓ |
| Poll Session Status | ✓ | ✓ | ✓ | ✓ |
| Cancel Session | ✓ | ✓ | ✓ | ✓ |
| Webhook Signature Verification | ✓ | ✓ | ✓ | Manual |
| Native TypeScript Types | ✓ | — | — | — |
| WebSocket Realtime Events | ✓ | Soon | Soon | — |
| Async / Await Support | ✓ | ✓ | Context | — |
| Auto-Retry with Backoff | ✓ | ✓ | ✓ | Manual |
| Zero-Knowledge Client Binding | ✓ | ✓ | ✓ | ✓ |
| Usage / Billing Endpoint | ✓ | ✓ | ✓ | ✓ |
All our SDKs are open source. If you're working with a stack we don't support yet, file a GitHub issue or submit a PR — our team reviews contributions within 48 hours.
Star us on GitHub
Be notified when new SDK versions ship
Join Developer Slack
Get help from the Ovrtxt team in real-time
Read the Changelog
Every release. Every breaking change. Documented.