Real carrier delivery
Tests receive your OTP on a real mobile number, so you see what users see: delivery time, sender and message text.
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/.
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/.
Tests receive your OTP on a real mobile number, so you see what users see: delivery time, sender and message text.
United States, Canada and United Kingdom numbers, plus numbers from 190+ other countries depending on daily stock.
Plain HTTPS and JSON. Works from test frameworks, CI jobs, cron, scripts and any tool that can make HTTP requests.
Each run uses one number at the dashboard price. If your SMS never arrives, the charge is refunded automatically.
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 lengthPut 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:
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.
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.
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.
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.
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.
No official integrations. Any tool that can make HTTP requests can call the API, and its webhook step can receive sms.received events.
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.
There is no sandbox. GET endpoints are free to call; purchases use real balance but are refunded automatically if no SMS arrives.
What SMS verification and one-time passcodes are, why sites use them, how codes are delivered, and how SMS 2FA compares to authenticator apps and passkeys.
Read the guide →TroubleshootingNot getting an SMS verification code? Fix rate limits, country code format, voice-call fallback, rejected number types and resend timing, step by step.
Read the guide →TroubleshootingMost SMS codes arrive in seconds. Learn normal delivery times, when to resend, how long to wait before giving up, and what slows codes down.
Read the guide →Getting startedHow to choose a US, UK or Canadian number for SMS verification: app region rules, stock, price differences and what the country affects.
Read the guide →A REST API to buy temporary numbers and read SMS codes from code: bearer auth, polling or signed webhooks, clear error codes and automatic refunds.
Read more →API for resellersOffer SMS verification in your own panel, app or bot at your own prices. One balance, signed webhooks, and clear rules for your customers.
Read more →What you can buildLegitimate things to build with the Noir SMS API: verification bots, team number tools, OTP localization tests, privacy layers, and what is not allowed.
Read more →WhatsApp bulk messaging, the allowed wayUnsolicited WhatsApp bulk messages get numbers banned. Learn the allowed options: broadcast lists to opted-in contacts and Meta's official Cloud API.
Read more →Create a free account, add funds and generate your API key on the API page of your dashboard.
Use the Noir SMS API only for your own legitimate accounts or, as a reseller, for customers who follow the same Acceptable Use Policy. Bulk or automated account creation, spam, ban evasion and bypassing bank, fintech or identity checks are prohibited and lead to account closure.