API for your own system

Integrate Noir SMS into your own system: internal tools, OTP testing, CI and monitoring

If your product sends verification codes by SMS, the hardest part to test is the part you do not control: whether a real carrier delivers your message to a real phone in another country, how fast, and what it looks like when it lands. With the Noir SMS API, your test can buy a real mobile number, type it into your own sign-up form and read the SMS your system sent. This page covers QA, CI, monitoring and internal tools. Use it on your own apps and accounts; the full reference is at /api/docs/.

  • Same prices as the dashboard
  • Refund if no SMS
  • Signed webhooks

Quick answer

The Noir SMS API lets your own software rent a real mobile number in the US, Canada, the UK or 190+ other countries, wait for an SMS and read it, all over HTTPS at https://noirsms.com/api/v1. Teams use it to test their own app's sign-up and OTP flows end to end, run those tests in CI, monitor that their verification SMS actually arrives in each country, and give internal tools a number without using anyone's personal phone. Any tool that can make HTTP requests can call it. Each test costs one normal number, refunded automatically if no SMS arrives in 20 minutes. Docs: https://noirsms.com/api/docs/.

Highlights

01

Real carrier delivery

Tests receive your OTP on a real mobile number, so you see what users see: delivery time, sender and message text.

02

Many countries

United States, Canada and United Kingdom numbers, plus numbers from 190+ other countries depending on daily stock.

03

Fits your pipeline

Plain HTTPS and JSON. Works from test frameworks, CI jobs, cron, scripts and any tool that can make HTTP requests.

04

Pay per test

Each run uses one number at the dashboard price. If your SMS never arrives, the charge is refunded automatically.

Testing your own sign-up and OTP flow

An end-to-end OTP test has three moves: get a number, submit it to your app, read the code. The API maps cleanly onto that. Pick the service code that matches how your app's SMS is classified. If your product is not listed by name, the "Any other" option covers apps not in the list; check GET /services for the exact code in each country. Buy a number with POST /numbers, have your browser automation or API client submit phone to your sign-up form, then poll GET /numbers/{id} until status is received.

Assert on what matters to you: that an SMS arrived at all, how long it took, that sms[].code has the expected length, and that sms[].text uses the right wording, brand name and language. If nothing arrives, that is a real finding about your delivery, and the number is refunded when it expires.

import time, requests

BASE = "https://noirsms.com/api/v1"
H = {"Authorization": "Bearer nsk_live_YOUR_KEY"}

def buy(service, country):
    r = requests.post(f"{BASE}/numbers", json={"service": service, "country": country}, headers=H)
    r.raise_for_status()
    return r.json()

def wait_for_code(number_id, timeout=300):
    deadline = time.time() + timeout
    while time.time() < deadline:
        n = requests.get(f"{BASE}/numbers/{number_id}", headers=H).json()
        if n["status"] == "received":
            return n["sms"][0]
        if n["status"] in ("expired", "canceled"):
            return None
        time.sleep(4)
    return None

num = buy("go", "gb")
# ... drive YOUR app's sign-up form with num["phone"] here ...
sms = wait_for_code(num["id"])
assert sms, "No OTP received for " + num["phone"]
print(sms["text"])  # check wording, sender format and code length

Running OTP tests in CI

Put the API key in your CI secret store, never in the repository. Because each run buys a real number, run the SMS test on a schedule, before releases or on changes to the auth flow, rather than on every commit. A few practical rules help:

  • Set a timeout below the 20-minute window, and treat no SMS as a test failure, not a flaky retry loop.
  • Call POST /numbers/{id}/finish when the test passes, and cancel after 2 minutes when you abort early, so numbers are released.
  • Handle 400 no_numbers by skipping or switching country: you were not charged, and stock varies daily.
  • Check GET /balance at the start of the job so a low balance fails clearly instead of as a mysterious 402.

Monitoring that your OTP delivery works

SMS delivery breaks quietly: a sender registration expires, a carrier starts filtering a template, a provider route degrades in one country. A scheduled synthetic check catches it before support tickets do. Every hour or every few hours, buy a number in each country you care about, for example the US, Canada and the UK, trigger a verification SMS from your own system and record whether it arrived and how long it took. Alert when a country fails twice in a row.

Stay under 120 requests per minute per key, or use the sms.received webhook instead of polling. Remember that a number is single use: buy a fresh one for every check.

Internal tools, Zapier and no-code

You do not need to write a full integration. Any tool that can make HTTP requests with a header can call the API: an internal admin panel, a spreadsheet script, a workflow automation platform's HTTP or webhook step, or a small serverless function. Noir SMS does not offer official plugins for these tools; you configure a generic HTTP request with the base URL https://noirsms.com/api/v1 and the Authorization header. For no-code tools, the webhook works well as a trigger: point it at the tool's incoming-webhook URL and route sms.received events wherever your team needs them. Keep the key inside the tool's credential store, and remember it can spend your balance.

Keep it to your own systems

This kind of integration is meant for apps you build, accounts you own and services you are authorized to test. Using automation to create accounts in bulk on other platforms, or to get around their limits, is prohibited by the Noir SMS Acceptable Use Policy and usually by those platforms' terms too, and it leads to account closure.

Step by step

  1. Get a keyGenerate an API key on the API page of your dashboard and store it in your CI or tool's secret store.
  2. Script the flowBuy a number, submit it to your own sign-up form, then poll or use the webhook to read the SMS.
  3. Assert and releaseCheck delivery time and message text, then finish the number. Missed SMS are refunded automatically.

Frequently asked questions

Can I test OTP delivery in many countries?

Yes. The US, Canada and the UK are the main countries, and numbers from 190+ others are available depending on daily stock. GET /countries shows what is in stock right now.

Can I reuse one number across test runs?

No. Each number is for one verification and stays reserved for 20 minutes. While it is open you can request another SMS with /resend, but buy a new number for each run.

Does Noir SMS have an official Zapier or no-code integration?

No official integrations. Any tool that can make HTTP requests can call the API, and its webhook step can receive sms.received events.

How fast should a test expect the SMS?

Usually within seconds of your system sending it. Poll every 3 to 5 seconds and set a timeout; the number stays reserved for 20 minutes.

Is there a test mode that does not spend balance?

There is no sandbox. GET endpoints are free to call; purchases use real balance but are refunded automatically if no SMS arrives.

Related services

Related guides

More solutions

Start building with the Noir SMS API

Create a free account, add funds and generate your API key on the API page of your dashboard.