Real SIM numbers for AI agents: SMS verification, rentals, proxies, cloud browser, x402 deposits.
io.github.virtualsms-io/sms — VirtualSMS MCP Server
The io.github.virtualsms-io/sms MCP server provides access to real SIM numbers for AI agents, covering SMS verification, rentals, proxies, cloud browser use, and x402 deposits. It supports workflows related to phone verification and OTP delivery, and is distributed via a GitHub repository and an npm package.
🛠️ Key Features
Real SIM numbers for AI agents
SMS verification
Rentals and proxies
Cloud browser support
x402 deposits
Related topics include OTP and phone verification
🚀 Use Cases
SMS verification flows for AI agents
Rental-based virtual phone number scenarios
OTP handling and phone verification automation
Development with MCP alongside tools like Claude MCP and Cline/Codex-style editors
⚡ Developer Benefits
MCP server integration (Model Context Protocol)
Topic coverage for “mcp-server”, “model-context-protocol”, and “virtual-phone-number”
18 available tools referenced for this server
⚠️ Limitations
The provided source excerpt lists functionality and topics but does not enumerate specific tool names, request/response formats, or documented operational constraints.
Get all available SMS verification services (Telegram, WhatsApp, Google, etc.). Use this to discover valid service codes before buying a number.
Parameters1
search
string
optional
Filter services by name (optional)
Raw schema
{
"type": "object",
"properties": {
"search": {
"type": "string",
"description": "Filter services by name (optional)"
}
},
"required": []
}
virtualsms_list_countries
Get all available countries for SMS verification. Use this to discover valid country codes before buying a number.
Parameters1
service
string
optional
Filter countries available for a specific service (optional)
Raw schema
{
"type": "object",
"properties": {
"service": {
"type": "string",
"description": "Filter countries available for a specific service (optional)"
}
},
"required": []
}
virtualsms_get_price
Check the price and availability for a specific service + country combination. Always check price before buying to confirm availability.
Parameters2
service
string
required
Service code (e.g. "telegram", "whatsapp", "google")
Purchase a virtual phone number for SMS verification. Returns order_id and phone_number. Use check_sms to poll for the verification code, or use wait_for_code to do it automatically.
Parameters2
service
string
required
Service code (e.g. "telegram", "whatsapp", "google")
Check if an SMS verification code has been received for an order. Returns status, phone_number, and (when delivered) messages[] array plus an extracted code. Poll this every 5-10 seconds after buying a number, or use wait_for_sms to block until delivery.
Parameters1
order_id
string
required
Order ID returned from buy_number
Raw schema
{
"type": "object",
"properties": {
"order_id": {
"type": "string",
"description": "Order ID returned from buy_number"
}
},
"required": [
"order_id"
]
}
virtualsms_cancel_order
Cancel an order and request a refund. Only works if no SMS has been received yet. Use this if the service is taking too long or you want to try a different number. **Cooldown:** cancel is only available 120 seconds after purchase. Check `cancel_available_at` on the order before calling. Calling earlier returns a `cooldown_active` error from this MCP server (no backend round-trip).
Wait (block) until the SMS arrives on an existing order_id, or until timeout. Uses real-time WebSocket delivery with automatic polling fallback. Pass an order_id from create_order. To buy AND wait in one step, call create_order then this tool.
Parameters2
order_id
string
required
Existing order ID returned from create_order
timeout_seconds
number
optional
How long to wait for SMS in seconds (default: 60, min: 5, max: 600)
Raw schema
{
"type": "object",
"properties": {
"order_id": {
"type": "string",
"description": "Existing order ID returned from create_order"
},
"timeout_seconds": {
"type": "number",
"description": "How long to wait for SMS in seconds (default: 60, min: 5, max: 600)",
"default": 60,
"minimum": 5,
"maximum": 600
}
},
"required": [
"order_id"
]
}
virtualsms_find_cheapest
Find the cheapest countries for a given service, sorted by price. Returns available countries with prices and stock levels so you can pick the best deal.
Parameters2
service
string
required
Service code (e.g. "telegram", "whatsapp", "google")
Find the right service code using natural language. Don't know the exact code? Just search "uber", "binance", "steam" etc. Returns matching services with similarity scores.
Parameters1
query
string
required
Natural language search query (e.g. "uber", "whatsapp", "binance")
Swap a phone number on an existing order. Gets a new number for the same service and country without additional charge. Use when the current number isn't receiving SMS. **Cooldown:** swap is only available 120 seconds after purchase. Check `swap_available_at` on the order before calling. Calling earlier returns a `cooldown_active` error from this MCP server (no backend round-trip).
Parameters1
order_id
string
required
Order ID to swap — must be in waiting/created status with no SMS received
Raw schema
{
"type": "object",
"properties": {
"order_id": {
"type": "string",
"description": "Order ID to swap — must be in waiting/created status with no SMS received"
}
},
"required": [
"order_id"
]
}
virtualsms_list_orders
List your active orders. Essential for crash recovery — if your session was interrupted, use this to find pending orders and their phone numbers, then use check_sms to retrieve codes.
Parameters1
status
string
optional
Optional status filter: "pending", "sms_received", "cancelled", "completed"
Get the full details of a specific order, including status, phone number, service, country, timestamps, and any received SMS code/text. Use this when you have an order_id and need the latest state beyond what check_sms returns.
Parameters1
order_id
string
required
Order ID to retrieve full details for
Raw schema
{
"type": "object",
"properties": {
"order_id": {
"type": "string",
"description": "Order ID to retrieve full details for"
}
},
"required": [
"order_id"
]
}
virtualsms_cancel_all_orders
Bulk-cancel every currently active order in your account. Returns the number of orders cancelled plus any failures. Useful for quick cleanup after a batch run or test session.
List past orders with optional filters for status, service, country, and a lookback window in days. Returns up to 50 orders (server cap) ordered most-recent-first.
Parameters5
status
string
optional
Optional status filter: "completed", "cancelled", "expired", "sms_received", "waiting"
service
string
optional
Optional service code filter (e.g. "telegram", "whatsapp")
country
string
optional
Optional country ISO code filter (e.g. "US", "GB")
since_days
number
optional
Only include orders from the last N days
limit
number
optional
Max orders to return (default: 20, server cap: 50)
Raw schema
{
"type": "object",
"properties": {
"status": {
"type": "string",
"description": "Optional status filter: \"completed\", \"cancelled\", \"expired\", \"sms_received\", \"waiting\""
},
"service": {
"type": "string",
"description": "Optional service code filter (e.g. \"telegram\", \"whatsapp\")"
},
"country": {
"type": "string",
"description": "Optional country ISO code filter (e.g. \"US\", \"GB\")"
},
"since_days": {
"type": "number",
"description": "Only include orders from the last N days"
},
"limit": {
"type": "number",
"description": "Max orders to return (default: 20, server cap: 50)",
"default": 20
}
},
"required": []
}
virtualsms_get_stats
Account usage stats aggregated from your order history: total orders, success rate, total spend, top services/countries, and status breakdown over a configurable lookback window.
Parameters1
since_days
number
optional
Window in days for activity stats (default: 30)
Raw schema
{
"type": "object",
"properties": {
"since_days": {
"type": "number",
"description": "Window in days for activity stats (default: 30)",
"default": 30
}
},
"required": []
}
virtualsms_get_profile
Full account profile: email, Telegram link status, current balance, lifetime spend, total orders, active API keys, and account creation date.
Transaction history for the account with optional filters for type, date range, and pagination. Types: "deposit", "purchase", "refund", "admin_credit".
Parameters5
type
string
optional
Filter by type: "deposit", "purchase", "refund", "admin_credit"
VirtualSMS is an account verification platform for developers and AI agents. It combines one-time SMS verification, dedicated number rentals, matching-country proxies and private cloud browser sessions behind one API, one MCP server and one prepaid balance.
Infrastructure for AI agents that need real-world phone verification.
The numbers are carrier-issued mobile numbers, backed by real physical SIM cards on carrier networks, not VoIP, which is why they pass the line-type checks that reject VoIP numbers at signup.
From one prepaid balance you can:
receive one-time SMS codes from $0.05
rent dedicated numbers from 1 to 30 days
buy matching-country residential, mobile and datacenter proxies
launch private cloud browser sessions that work alongside your number and proxy (beta)
All four work together from one prepaid balance, one API and one dashboard. Use only the pieces you need, or combine them into a single verification workflow.
Most providers solve one piece of the verification workflow. VirtualSMS combines numbers, rentals, proxies and cloud browser sessions behind one API, SDKs and an MCP server, so you use only the pieces you need or combine them into one workflow.
VirtualSMS can be used by individuals manually, integrated into applications with SDKs and APIs, or driven by AI agents through MCP. Use the platform through a REST API, official SDKs for Node, Python, PHP, Ruby and .NET, a hosted MCP server, or automation tools like n8n.
This server exposes that platform to any MCP client. Built for AI agents. Designed for agentic workflows. Works with Claude Code, Claude Desktop, Cursor, Windsurf and every MCP-compatible client, with no wrapper code to write.
Quickstart
Paste this into your MCP client's config. Nothing to install, no Node.js required on the client:
Get an API key at virtualsms.io. Then ask your agent:
"Buy me a Telegram number in the cheapest country and wait for the code."
Prefer to run it locally over stdio instead:
bash
npx virtualsms-mcp
Why VirtualSMS
Verifying an account should not mean stitching together numbers from one provider, proxies from another, and browser sessions from a third: multiple accounts, multiple balances and APIs, and support spread across vendors. VirtualSMS brings those pieces together behind one balance, one API and one MCP server.
VirtualSMS combines all three under one account, and gives you one way to drive them:
Carrier-issued mobile numbers. Backed by real physical SIM cards, not VoIP, so they resolve as mobile at signup.
Matching-country proxies. Residential, mobile and datacenter pools, so the number and the IP agree.
Runnable versions of the first two live in examples/.
Client setup
Every client runs the same npx virtualsms-mcp stdio command. Only the file location and format differ. The hosted config above works anywhere streamableHttp is supported and is the recommended path.
Claude Desktop
Edit ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
Yes, via ChatGPT's Developer Mode. Open Settings, turn on Developer mode, then add https://mcp.virtualsms.io/mcp as a custom connector (Plus, Pro, Business, Enterprise and Edu plans; not available on the free tier). Setup is a URL paste rather than a config file, so it differs from the client setups above. ChatGPT only connects to remote MCP servers over SSE or streaming HTTP, so use the hosted endpoint, not the local stdio command. The REST API is still there if you would rather build a custom GPT or Action instead.
Configuration
Variable
Required
Default
Description
VIRTUALSMS_API_KEY
Yes, for account tools
none
Your VirtualSMS API key. Keys carry a vsms_ prefix
VIRTUALSMS_BASE_URL
No
https://virtualsms.io
API base URL
VIRTUALSMS_ENABLE_SESSIONS
No
off
Serves 3 additional session-drive tools when set to 1, true or yes. Off by default
VIRTUALSMS_ENABLE_RELEASE
No
off
Serves the early-release rental tool when set to 1, true or yes. Off by default while its refund terms are being settled
Tools
40 tools by default. Set VIRTUALSMS_ENABLE_SESSIONS=1 to expose 3 more.
Tool names are shown below without the virtualsms_ prefix for readability. The real wire names are prefixed: virtualsms_create_order, virtualsms_get_sms, and so on.
Activation and account (18 tools)
The core SMS verification surface: discover a service, price it, buy a number, get the code.
Tool
Auth
Description
list_services
Yes
All available verification services. Optional search filter
list_countries
Yes
All available countries. Optional service filter
get_price
No
Price and availability for a service plus country pair
find_cheapest
No
Cheapest countries for a service, sorted by price, with real stock counts
search_services
Yes
Natural-language service lookup. "telega" finds Telegram
get_balance
Yes
Account balance in USD
get_profile
Yes
Email, Telegram link, balance, lifetime spend, total orders, active API keys
get_stats
Yes
Orders, success rate, spend, and status/service/country breakdown
get_transactions
Yes
Transaction history with type, date range, and pagination filters
create_order
Yes
Buy a number for a service plus country. Returns order_id and phone_number
get_sms
Yes
Poll an order for the code. Use for batch and cron jobs
wait_for_sms
Yes
Block until the SMS lands on an existing order_id, or until timeout
get_order
Yes
Full order detail plus every received message
list_orders
Yes
Your active orders. Essential for crash recovery
order_history
Yes
Past orders with status, service, country, and date filters
cancel_order
Yes
Cancel and refund, if no SMS arrived. 120s cooldown after purchase
cancel_all_orders
Yes
Bulk-cancel every active order
swap_number
Yes
Swap for a new number, same service and country, no extra charge. 120s cooldown
get_sms vs wait_for_sms:wait_for_sms is the recommended default for interactive agent workflows. It blocks and returns the moment the SMS arrives over WebSocket. Use get_sms for batch jobs, cron-driven polling, or when you already manage your own polling loop.
wait_for_sms takes an order_id, not a service and country. Call create_order first, then pass the returned order_id. That is the two-step buy-and-wait flow.
Rentals (9 tools)
Keep a number by the day instead of buying a single verification. Two tiers:
Full Access: local SIM inventory, for a whole number that works across any service. Every country in stock today lists 1, 7 and 30 days, at prices that vary per country. Durations and prices are not hardcoded here on purpose: call rentals_available for the live list per country and treat that as authoritative.
Platform: sourced via our global supplier network, locked to one chosen service, durations of 1, 3 or 7 days. Call rentals_price for the exact retail price of a (service, country, duration) combo.
Stock, durations and pricing all differ per tier and per country, so call rentals_available before committing to either. An active rental can be extended with extend_rental at the current catalog price, in the same durations its tier allows.
Both tiers carry the same refund terms: cancel for a full refund within 20 minutes of purchase and before the first SMS arrives. Platform cancels are additionally subject to a 2 minute minimum hold, so a cancel inside the first 2 minutes is rejected and has to be retried.
Tool
Auth
Description
rentals_pricing
Yes
Full Access pricing tiers: durations and prices
rentals_available
Yes
Countries with rental stock, counts, and pricing, per tier
rentals_services
Yes
Services available for Platform-tier rental in a country, with stock and price
rentals_price
Yes
Retail price for a service, country, and duration combination
create_rental
Yes
Rent a number. Check availability and price first
list_rentals
Yes
Your rentals across both tiers, filterable by status
get_rental
Yes
Full detail for one rental: tier, number, service lock, status, expiry, SMS
extend_rental
Yes
Extend an active rental. Charges the current catalog price
cancel_rental
Yes
Full refund, within 20 minutes of purchase and before any SMS
Proxy (10 tools)
Matching-country proxies, so the number and the IP agree. Three pools: residential, mobile and datacenter. Buy traffic by the GB, then generate a connection string.
Tool
Auth
Description
list_proxy_catalog
Yes
Pool types, countries, and price per GB. Start here
list_proxy_locations
No
Cities, states, ASNs, or ZIPs for a pool type plus country. No purchase required
buy_proxy
Yes
Purchase proxy traffic in GB. Returns credentials and remaining balance
list_proxies
Yes
Your proxies with remaining GB and credentials. Returns proxy_id values
generate_proxy_endpoint
Yes
Build a ready-to-use connection string: country, state, city, ZIP or ASN targeting, rotating or sticky, HTTP or SOCKS5
rotate_proxy
Yes
Request a fresh exit IP for an existing proxy
test_proxy
Yes
Prove a proxy works. Reports exit IP, country, city, ISP, and latency
get_proxy_usage
Yes
Cached GB used and remaining, plus request count, for one proxy
get_proxy_usage_history
Yes
Per-day traffic and request series over the last 7 or 30 days
set_proxy_targeting
Yes
Persist a default geo-targeting on a proxy sub-user
Other (3 tools)
Tool
Auth
Description
retry_order
Yes
Ask for the SMS to be resent to the same number. Not all order types support it
check_number
No
Carrier and line-type lookup for any E.164 number: mobile, landline or VoIP, plus spam risk
start_manual_registration_session
Yes
Beta, invite-only. Start a country-matched cloud browser you drive yourself in a live viewer. Agent-driven navigation is a separate opt-in (the session tools). Join https://t.me/VirtualSMS_io for beta access
Session tools (3 more, off by default)
Beta, invite-only. The browser stack is early. It works, but the shape of these tools can still change and there is no stability guarantee yet. Join https://t.me/VirtualSMS_io for beta access and updates.
Served only when VIRTUALSMS_ENABLE_SESSIONS is set to 1, true or yes. Not exposed on the default surface.
Tool
Description
navigate_session
Navigate an active browser session to a URL
session_viewer
Live viewer URL and current status for an active session
rentals_available(tier: "full_access")
→ countries holding local SIM stock, each with its own duration and price list
create_rental(tier: "full_access", country: "FR", duration_hours: 720)
→ {rental_id: "rnt_1", phone_number: "+33...", expires_in_days: 30}
Stock is per country and per tier, so discover first and rent second. rentals_available(tier: "platform") covers a different, service-locked catalogue.
Account verification infrastructure is the stack that gets a real account through a signup flow that demands a phone number. It has five layers, and a gap in any one of them fails the whole chain:
Numbers. A carrier-issued mobile line, because the line type gets checked.
SMS. The verification code, delivered to that number and readable by software rather than by a human holding a handset.
Proxy. An IP in the same country as the number, so the two agree.
Browser. A clean environment to drive the signup itself.
Automation. An API or an agent that runs the chain end to end, unattended.
Most providers sell the first two layers and leave you to source the rest, which is exactly where the number, the IP and the browser stop telling the same story. VirtualSMS provides the infrastructure behind all five.
VirtualSMS is an account verification platform for individuals, developers, and AI agents. It combines one-time SMS verification, dedicated number rentals, matching-country proxies, and private cloud browser sessions behind one API, one MCP server, and one prepaid balance.
What is an MCP server for SMS verification?
MCP (Model Context Protocol) is an open standard that lets an AI client call external tools. An MCP server for SMS verification exposes phone-number and verification-code operations as tools an agent can call directly, so the agent buys the number, waits for the code and reads it back without any glue code from you. This repo is that server for VirtualSMS: 40 tools covering verification, rentals and proxies. If you are not driving an agent at all, the same operations are available as a plain REST verification API.
When should I use this?
Your AI agent needs to sign in to or register an account that demands a phone number.
You are testing an OTP or signup flow and want fresh numbers on demand instead of a drawer of test SIMs.
You need a verification code retrieved automatically, in CI or in an unattended job.
You need a number and a matching-country IP that agree with each other.
You are driving signup automation in a browser and would rather the number, the IP and the browser came from one place than three.
You need a temporary phone number for one code, or a dedicated one you keep for up to 30 days.
You want per-code pricing from $0.05 with no subscription and no monthly number rental.
When should I NOT use this?
Honest answers, so you do not waste an afternoon:
You need to send SMS. This platform receives; it does not send. Use a messaging provider such as Twilio.
You need a permanent number for your business. Verification numbers are temporary by design, and rentals run in days, not years. Buy a real line from a carrier.
You need codes on a number you already own. There is no port-in. The numbers come from our inventory.
You are running A2P marketing campaigns. Wrong tool entirely.
You are trying to evade a platform's terms of service. Whether your use complies with the terms of the service you verify against is your responsibility, not ours.
Can Claude or Cursor receive SMS verification codes?
Yes, through this server. Claude Code, Claude Desktop, Cursor, Windsurf, Cline, Zed, Continue.dev, Codex, OpenClaw and Hermes are all MCP clients, and each one is a config paste away (see Client setup). Once installed, "buy a Telegram number and wait for the code" is a request the agent can carry out end to end. ChatGPT can reach it too, through Developer Mode custom connectors (see Does this work with ChatGPT?), or through the REST API if you would rather not enable Developer Mode.
How do AI agents receive OTP codes automatically?
Two tool calls. create_order buys a number for a given service and country and returns an order_id. wait_for_sms then blocks on that order_id and returns the moment the code arrives, pushed over WebSocket, typically in 2 to 15 seconds. The agent never polls, never sleeps in a loop, and never needs a human to read a phone. If you would rather drive your own loop, get_sms polls a single order instead.
How is this different from Twilio?
Twilio is a full communications platform: send and receive SMS and voice, long-lived numbers, A2P campaigns, the lot. VirtualSMS does one job, which is receiving verification codes on demand. The practical differences:
Line type. Twilio numbers are VoIP. Many services reject VoIP numbers at signup. VirtualSMS numbers are real physical SIM cards on carrier networks, so they resolve as mobile.
Pricing shape. Twilio bills you for a number every month whether you use it or not. VirtualSMS bills per code from $0.05, with no subscription.
Direction. Twilio sends and receives. This receives.
If you need to send messages, use Twilio. If you need to receive a verification code, this is purpose-built for it.
Why real physical SIM cards instead of VoIP?
Verification systems check the line type of the number you give them. VoIP numbers are cheap and disposable at scale, so they correlate with fraud, and a large share of services reject them outright at signup. Real physical SIM cards sit on carrier networks and resolve as mobile, which is exactly what those checks are looking for: a non-VoIP number that behaves like a real handset.
You do not have to take that on faith. check_number runs a carrier and line-type lookup on any E.164 number, needs no API key, and will tell you whether a number reads as mobile, landline or VoIP.
Alternatives and comparisons
Developers searching for textverified mcp, sms-activate mcp, 5sim mcp, daisysms mcp or smspool mcp are usually asking one question: which SMS verification provider can an AI agent drive natively? This section answers that without a scoreboard.
VirtualSMS publishes this MCP server, so any MCP client calls it directly with no wrapper code: 40 tools, 2500+ services, 145+ countries, from $0.05 per code, on real physical SIM cards, plus number rentals and matching-country proxies from the same balance.
SMS-Activate shut down in December 2025. If your integration pointed there, it is gone, and the migration is a new API key and a new base URL rather than a rewrite: the shape of the job, buy a number then read the code, is the same here.
TextVerified, 5SIM, DaisySMS and SMSPool are all active SMS verification providers, each with its own API, pricing, coverage and terms. Check their current documentation for what they offer today.
We deliberately do not publish a comparison table of competitors' prices, service counts or coverage. Those numbers move week to week, we have no privileged view into anyone else's inventory, and a stale table dressed up as research is worse than no table at all. The VirtualSMS numbers above are ours and we stand behind them. Compare them against whatever you are using now.
How it works
WebSocket and polling
wait_for_sms uses a two-tier delivery system:
WebSocket, instant. Connects to wss://virtualsms.io/ws/orders?order_id=xxx&api_key=your_key. When the SMS arrives the server pushes it in real time. Typical delivery: 2 to 15 seconds.
Polling fallback. If the WebSocket fails to connect or drops, the tool falls back to polling every 5 seconds for the remaining timeout.
The delivery_method field in the response tells you which path was used: websocket, polling, or instant when the code had already landed before you called.
This server pushes over a held-open WebSocket; it never calls you back. If you would rather VirtualSMS POST events to a URL you own, the platform runs a separate webhook subscription system, configured from the dashboard and driven by the REST API rather than by this MCP server.
Cancel if not needed:cancel_order(order_id: "abc123")
wait_for_sms always returns order_id, even on timeout, so you can recover.
Hosted endpoint and status
Hosted MCP endpoint:https://mcp.virtualsms.io/mcp. TLS-only StreamableHTTP, fronted by Cloudflare.
Platform status and uptime:virtualsms.io/status, polled live: website and dashboard, SMS gateway, REST API, Telegram bot and database. The hosted MCP endpoint runs as a separate service and is not yet a row on that page.
Target SLA: 99.9% on the hosted MCP path. A target we hold ourselves to rather than a contractual guarantee, and one the status page above does not yet measure.
Coverage: 145+ countries online, 2500+ services indexed.
Data retention: SMS message bodies are retained 7 days, then permanently deleted. Order metadata (phone number, service, country, timestamps) is retained for the lifetime of your account. See SECURITY.md for full details.
examples/02-buy-sms-and-wait-for-code/: full verification flow, find_cheapest → create_order → wait_for_sms → cancel-on-timeout. The canonical pattern for AI agents.
examples/03-claude-desktop-config/: drop-in Claude Desktop config plus a transcript of "ask Claude what's my balance" over StreamableHTTP.
SDKs and tools
The same platform, from whatever you already write in:
git clone https://github.com/virtualsms-io/mcp-server.git
cd mcp-server
npm install
npm run build # tsc
npm test# vitest
npx tsc --noEmit # typecheck only
Two transports share one tool table: src/index.ts (stdio) and src/http-server.ts (StreamableHTTP). Tool definitions and handlers live in src/tools.ts. If you add a tool, wire it into both transports. src/__tests__/transport-parity.test.ts fails the build if you forget, and src/__tests__/docs-tool-names.test.ts fails if the docs name a tool that does not exist.
Release notes for v1.0.0 to v1.3.1 are in CHANGELOG.md.
Security
API keys are passed via the x-api-key header (hosted) or the VIRTUALSMS_API_KEY environment variable (local stdio), and are rotatable from your account at virtualsms.io. Full policy, retention detail and disclosure process: SECURITY.md.
Built by VirtualSMS.io. Account verification for developers and AI agents, on real physical SIM cards: 2500+ services · 145+ countries · from $0.05 per code.