IoT SIM API: quick start in 4 steps with cURL, Python and Node.js
REST and JSON. API keys issued instantly. Activate a SIM, read usage and register a webhook in under 10 minutes. Sandbox with simulated SIMs included.
API at a glance
The Universal eSIMs IoT SIM API is a REST and JSON interface at api.universalesims.com/v1 with keys issued instantly, 600 requests per minute per key, 12 core endpoints, 8 signed webhook event types and a sandbox with 20 simulated SIMs. Connectivity costs US$1.00 per active SIM per month plus US$0.004 per MB; the API itself is free.
Prices checked on 25 October 2026 · Inactive SIMs are free · No minimum order · Billed monthly in USD or INR
Quick start: key, activate, usage, webhook
Get an API key
Create an account, open Settings, API keys, and create a key scoped to a role. Keys are issued instantly. Use ue_test_ keys against the sandbox and ue_live_ keys against production.
Activate a SIM
POST /v1/sims/{iccid}/activate. The SIM becomes active within 60 seconds. Billing starts on the first data session, not on this call.
Read usage
GET /v1/sims/{iccid}/usage?from=YYYY-MM-DD returns daily MB, sessions, last network and country. GET /v1/usage returns the account pool. Data refreshes every 5 minutes.
Set a webhook
POST /v1/webhooks with a URL and event list. Verify the X-UE-Signature header (HMAC-SHA256 of the raw body with your webhook secret). We retry 5 times over 24 hours on non-2xx responses.
cURL
curl -X POST https://api.universalesims.com/v1/sims/8991000012345678901/activate \
-H "Authorization: Bearer ue_live_your_key"
curl "https://api.universalesims.com/v1/sims/8991000012345678901/usage?from=2026-11-01" \
-H "Authorization: Bearer ue_live_your_key"
curl -X POST https://api.universalesims.com/v1/webhooks \
-H "Authorization: Bearer ue_live_your_key" -H "Content-Type: application/json" \
-d '{"url":"https://example.com/hooks/ue","events":["sim.usage_threshold","sim.imei_changed"]}'
Python
API = "https://api.universalesims.com/v1"
H = {"Authorization": "Bearer ue_live_your_key"}
iccid = "8991000012345678901"
requests.post(f"{API}/sims/{iccid}/activate", headers=H).raise_for_status()
usage = requests.get(f"{API}/sims/{iccid}/usage", headers=H, params={"from": "2026-11-01"}).json()
print(usage["total_mb"], usage["last_network"])
requests.post(f"{API}/webhooks", headers=H, json={
"url": "https://example.com/hooks/ue",
"events": ["sim.usage_threshold", "sim.geofence_breach"],
})
Node.js
const headers = { Authorization: 'Bearer ue_live_your_key', 'Content-Type': 'application/json' };
const iccid = '8991000012345678901';
await fetch(`${API}/sims/${iccid}/activate`, { method: 'POST', headers });
const usage = await fetch(`${API}/sims/${iccid}/usage?from=2026-11-01`, { headers }).then((r) => r.json());
console.log(usage.total_mb, usage.last_network);
await fetch(`${API}/webhooks`, { method: 'POST', headers, body: JSON.stringify({
url: 'https://example.com/hooks/ue', events: ['sim.usage_threshold', 'sim.imei_changed'],
}) });
Webhook payload example
"id": "evt_01J9",
"type": "sim.usage_threshold",
"created": "2026-11-03T08:14:22Z",
"data": {
"iccid": "8991000012345678901",
"group": "fleet-north",
"threshold_mb": 50,
"used_mb": 50.4,
"country": "IN",
"network": "Airtel"
}
}
Endpoints
Core API endpoints (v1)
Webhook events: sim.attached, sim.detached, sim.usage_threshold, sim.geofence_breach, sim.imei_changed, sim.status_changed, account.pool_low, invoice.created.
Rate limits, sandbox and environments
Environments and limits
Tooling
Postman collection
Every endpoint with sandbox and production environments. Download link published at launch.
OpenAPI 3.1
Generate clients in any language. Spec link published at launch.
SDK snippets
Python, Node.js and cURL on GitHub under MIT. Repository link published at launch.
What the API costs
Nothing. You pay for active SIMs and data. See the pricing page.
IoT SIM pricing by volume tier
Universal eSIMs vs Onomondo vs Pelion vs 1GLOBAL
What each provider publishes on its own website, observed October 2026. We publish every price, accept orders from 1 SIM and ship a 100MB trial against the 50MB that is standard elsewhere.
IoT connectivity providers compared, observed October 2026
Competitor details are as displayed on their public pages in October 2026 and change without notice. Where a provider publishes no price we say so rather than guess.
Technical specifics
API technical specifics
Security and compliance
These are commitments and a roadmap, stated plainly. We do not list certifications we do not yet hold.
Security and compliance commitments
Developer questions
How quickly can I get API access?
Immediately. API keys are issued when you create an account. The REST API uses JSON, we publish a Postman collection, and there are snippets in Python, Node.js and cURL. A sandbox with simulated SIMs lets you test activation, usage and webhooks without hardware.
What are the API rate limits?
600 requests per minute per key on production and 120 per minute on the sandbox. Bulk endpoints accept up to 1,000 ICCIDs per call for activate, suspend and resume. Responses include X-RateLimit-Remaining and Retry-After headers. Enterprise accounts can request higher limits.
How does the sandbox work?
A sandbox account with 20 simulated SIMs is created with every account. Simulated SIMs generate usage, attach events and threshold alerts on a schedule so you can test webhooks end to end. Sandbox keys start with ue_test_ and never touch production SIMs or billing.
How are webhooks secured and retried?
Every delivery carries an X-UE-Signature header containing an HMAC-SHA256 of the raw request body using your webhook secret, plus a timestamp to prevent replay. Non-2xx responses are retried 5 times with exponential back-off over 24 hours. Failed deliveries are listed in the console for manual replay.
Is there a Postman collection or OpenAPI spec?
Both. The Postman collection and the OpenAPI 3.1 document are linked from this page at launch (placeholder links below). The collection includes environment files for sandbox and production and example calls for every endpoint.
Which SDKs do you provide?
Snippets and small helper modules in Python, Node.js and cURL, published on GitHub under the MIT licence at launch. The API is plain REST with JSON, so any HTTP client works. Go and Java examples are on the roadmap.
How do I handle pagination?
List endpoints return 100 items per page with a next_cursor field. Pass cursor=next_cursor to get the next page. Cursors are stable for 24 hours. Filter lists by group, status, country and last_seen_before to keep result sets small.
Can I automate activation from my own provisioning flow?
Yes. A common pattern: your factory test rig calls activate during end-of-line test, your warehouse calls suspend before shipping, and your customer onboarding calls resume on first registration. Each call is idempotent and returns the current SIM state.
What does an API error look like?
JSON with a type, a human-readable message and a request_id, using standard HTTP status codes: 400 for validation, 401 for a bad key, 403 for role scope, 404 for an unknown ICCID, 409 for an invalid state transition and 429 for rate limits. Quote the request_id to support.
Related IoT pages
• Free trial kit
· • IoT SIM pricing
· • Connectivity platform
· • Coverage and roaming rules
· • Private APN and VPN
· • Partner API
· • Consumer electronics integration
· • Contact us
Keys in minutes, SIMs in days
Request the trial kit and start in the sandbox today.
Universal eSIMs IoT Connectivity Platform
Connectivity management platform for IoT SIMs: activate, suspend, pooled data, usage alerts, geo-fencing, diagnostics, IMEI lock, REST API and webhooks.
Price Currency: USD
Operating System: Web, REST API
Application Category: BusinessApplication