For websites & apps

Let your users verify with NumberBox numbers

Connect your website in a few minutes. When a user signs up with one of our virtual numbers, your OTP goes straight to their NumberBox screen — no SMS cost, no delay. Every other number works exactly as today.

How it works

Four steps, all automatic

1
User gets a number

Your user rents or buys a virtual number on NumberBox (for example +1 (202) 555-0103).

2
Signs up on your site

They enter that number on your sign-up or "verify phone" form, like any other number.

3
Your site asks us first

Before sending an SMS, your site sends the OTP to our Connect API. We answer in milliseconds: "ours" or "not ours".

4
The code appears

If it's ours, the user sees the code on NumberBox at once. If not, you send your normal SMS — nothing changes.

No SMS cost

OTPs to our numbers are not real SMS — you pay nothing for them.

Instant

Delivered in under a second, never lost by a carrier.

Private & safe

We accept an OTP only for a number a user holds right now. Messages for other numbers are never stored.

Nothing breaks

If our API is slow or down, your site just sends the normal SMS.

Connect

Two ways to connect

First, ask us for your connect key. Then pick one:

Recommended

A. Add a few lines to your SMS function

Most sites have one function that sends every SMS. Put this at the top of it. Our numbers go to us; everything else continues as before.

// Laravel: before your normal SMS code
function send_sms($to, $message)
{
    try {
        $r = Http::timeout(5)
            ->withHeaders(['X-Connect-Key' => env('NUMBERBOX_KEY')])
            ->post('https://number.joggotabd.com/api/connect/sms', ['to' => $to, 'text' => $message]);
        if ($r->json('ours')) {
            return; // a NumberBox number: done, no SMS needed
        }
    } catch (\Throwable $e) {
        // our API not reachable: just send the normal SMS
    }

    // ... your normal SMS sending stays here ...
}
async function sendSms(to, message) {
  try {
    const r = await fetch('https://number.joggotabd.com/api/connect/sms', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json', 'X-Connect-Key': process.env.NUMBERBOX_KEY },
      body: JSON.stringify({ to, text: message }),
      signal: AbortSignal.timeout(5000),
    });
    if ((await r.json()).ours) return; // handled by NumberBox
  } catch (e) { /* fall back to normal SMS */ }

  // ... your normal SMS sending ...
}
curl -X POST https://number.joggotabd.com/api/connect/sms \
  -H "X-Connect-Key: pk_your_key" \
  -d to=+12025550103 \
  -d text="Your verification code is 482913"

# {"ok":true,"ours":true,"delivered":true}   → done
# {"ok":true,"ours":false,"delivered":false} → send your normal SMS
No code

B. Change one setting

If your admin panel has an "SMS API URL" with {{number}} and {{message}}, replace it with:

https://number.joggotabd.com/api/connect/sms?key=pk_your_key&to={{number}}&text={{message}}

Tell us your old SMS URL when you get the key. Messages for our numbers stay with us; we pass every other message on to your old gateway, so all your users still get their SMS.

API reference

Connect API

Base URL https://number.joggotabd.com/api/connect. Send your key in the X-Connect-Key header (or a key field). Phone numbers may have spaces, dashes or a + sign; the country code is best.

CallSendAnswer
POST /smsto, text
GET also works, for URL-based SMS systems.
ours — is it our number
delivered — the user can see it now
reason: not_in_use — ours, but nobody holds it now (not stored)
forwarded — no-code mode: sent on to your old gateway
GET /checkphoneours, in_use — check a number without sending anything
GET /ping—ok and your site name — to test your key

Limits: 600 calls per minute per site. Wrong key → HTTP 401. Missing fields → HTTP 422.

Questions

For your team

With option A, no — your site only sends us a message when you call our API, and we keep it only if the number belongs to a NumberBox user right now. With option B, your messages pass through us so we can forward them; we do not store messages for other numbers.

We only deliver to numbers that a user holds at that moment. Old or unused numbers answer "not in use" and nothing is shown to anyone.

Use a short timeout (5 seconds, as in the example). On any error, your code just sends the normal SMS.

Connecting is free. Our users pay us for the numbers; your OTPs to them cost you nothing.

Ready to connect?

Ask us for a connect key. Most sites are live the same day.