NXTL B2B REST API

Build global eSIM connectivity into your product.

Issue and manage NXTL data eSIMs, fund a pooled business balance, reconcile usage and receive signed events through one server-to-server API.

Designed for travel platforms, company mobility, customer benefits and compatible-device operations across NXTL-supported destinations.

Base URL https://nxtlsim.com/api/v1

API access is available to approved NXTL Business accounts.

From API key to first issued eSIM

01

Check reachability

GET /health
02

Confirm the account

GET /partner
03

Estimate issuance

POST /esims/estimate
04

Queue the eSIM

POST /esims
05

Receive the result

esim.provisioned or GET /jobs/{id}
WHAT THE API ENABLES

Put connectivity inside the workflow your business already owns.

The NXTL API removes the hand-off to a separate purchasing process. Issue at the moment connectivity is needed, keep your own reference attached, and bring status, usage and billing information back into your operation.

Fulfil a customer order

Attach an eSIM to a flight, stay, tour, relocation, membership or premium-service order. Use your booking or customer reference to reconcile the result.

Operate a travelling team or fleet

Issue individually or in bulk, label every line, change network policy and suspend, resume or terminate service from your own system.

Keep support and finance informed

Read usage and balance data, follow a consistent ledger, receive signed events and retain request IDs for support investigation.

The portal and API work with the same business account, balance and eSIM inventory—start manually and automate without moving to another platform.

DEVELOPER REFERENCE

Everything needed for a reliable first integration.

This reference documents the current NXTL B2B API. Use the endpoint groups below for human-readable integration guidance and the published OpenAPI document for machine-readable tooling.

0 operations · 0 groups
On this page

Before you start

The NXTL B2B REST API provides server-to-server endpoints for programmatic provisioning and management. Before integrating, ensure your environment meets these operational requirements:

Approved business account

API keys belong to an approved NXTL Business account and inherit its available scopes, quota and commercial configuration.

Funded pooled balance

Issuance and API-funded actions use the business account's available balance. Check the current issuance cost and capacity before creating a batch.

Server-side environment

Keep API and webhook secrets on a trusted server. Never place them in browser JavaScript, a public repository or a distributed mobile application.

HTTPS webhook receiver

Use an HTTPS endpoint, preserve the raw request body for signature verification and return a 2xx response after safely accepting the event.

Sandbox Guidance: There is no separate public sandbox base URL documented today. Use keys, labels and rollout limits agreed for your account, and begin with a contained pilot.

Quick start

This sequence confirms the key, estimates the account impact and queues one eSIM without exposing a secret to the client.

1. Check the public health endpoint

GET /health is the only public operation. Use it to confirm that the API is reachable; it does not prove that your key, balance or quota is ready.

Bash
curl -sS "https://nxtlsim.com/api/v1/health"

2. Confirm the key and account

The response identifies the business account and the permissions available to this key. Store the key as a server-side secret.

Bash
curl -sS \
  -H "X-NXTL-Key: $NXTL_KEY" \
  "https://nxtlsim.com/api/v1/partner"

3. Estimate before issuing

Read the returned estimate and affordability result before starting a larger issuance request. Current fees and account capacity come from the API; do not duplicate them as permanent constants in your application.

Bash
curl -sS -X POST \
  -H "X-NXTL-Key: $NXTL_KEY" \
  -H "Content-Type: application/json" \
  -d '{"quantity":1,"tier":"standard"}' \
  "https://nxtlsim.com/api/v1/esims/estimate"

4. Queue one reusable eSIM

A successful request returns HTTP 202 with a job ID. Issuance continues asynchronously. Poll GET /jobs/{id} or receive the esim.provisioned or esim.provision_failed event.

Bash
curl -sS -X POST \
  -H "X-NXTL-Key: $NXTL_KEY" \
  -H "Idempotency-Key: order-123-esim" \
  -H "Content-Type: application/json" \
  -d '{
    "nickname":"Traveller 123",
    "tier":"standard",
    "client_reference":"ORDER-123"
  }' \
  "https://nxtlsim.com/api/v1/esims"

Authentication and scopes

Authenticate requests by passing your API key in the X-NXTL-Key header on every operation except GET /health. A newly created key returns its secret once; subsequent key listings expose only public identifiers. Store secrets in a managed server-side secret store and rotate or revoke them independently.

HTTP Header Format
X-NXTL-Key: $NXTL_KEY
Scope IdentifierGranted Operations & Access Level
balance:readRead partner profile, balance totals, ledger history, top-up invoices, and quota snapshots.
balance:writeExecute programmatic account top-ups via saved payment method or invoicing.
esims:readQuery fleet inventory, inspect single ICCID status/wallet/events, estimate costs, poll jobs, and view usage CDRs.
esims:writeIssue single/bulk eSIMs, edit nicknames, switch network tiers, suspend, resume, or terminate profiles.
keys:readInspect registered public key identifiers, status, and associated metadata.
keys:writeCreate new scoped API access keys or instantly revoke compromised keys.
webhooks:readInspect configured webhook target URL, subscribed event list, HMAC signing secrets, and delivery logs.
webhooks:writeConfigure webhook subscriptions, dispatch synthetic test pings, and replay previous deliveries.
thresholds:readQuery configured spend, line usage, and balance threshold alert rules.
thresholds:writeCreate, update, enable/disable, or remove automated usage thresholds and auto-suspend policies.
audit:readAccess immutable audit logs for administrative actions, security revisions, and key lifecycles.
usage:readGranular usage telemetry access (accepted alongside esims:read or balance:read).

Build for safe retries and observable failures

Idempotency

Send Idempotency-Key on POST /esims, POST /esims/bulk-issue and POST /topup. Retrying the same operation with the same key returns the original outcome and adds Idempotent-Replayed: true. Generate a stable key from your own business operation—not a new random value for every retry.

Compatibility Note: X-NXTL-Idempotency-Key remains supported as a legacy alias. New integrations should use Idempotency-Key.

Rate limits

Read X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset on responses. Account configuration may change the limit, so do not hard-code one global request rate. Treat HTTP 429 as retryable after the indicated reset.

Request tracing

Every response includes X-Request-Id. Record it with failed operations and include it when asking NXTL support to investigate.

Issuance is asynchronous by design

A successful issuance request means NXTL accepted the work—not that a profile is already ready. Single and bulk issuance return a job ID. Use GET /jobs/{id} for status and per-row results, or subscribe to the relevant webhook events.

Estimate
→
Accepted (202)
→
Pending or running
→
Complete or failed
→
Per-line result
  • • POST /esims queues one eSIM and accepts nickname, tier and client_reference.
  • • POST /esims/bulk-issue accepts quantity from 1 to 1,000, plus tier, client_reference and metadata.
  • • POST /esims/estimate checks the proposed issuance cost and balance impact without creating eSIMs.
  • • GET /jobs lists asynchronous jobs.
  • • GET /jobs/{id} returns the current state, summary and per-row outcomes where available.
  • • /esim-requests/{job_id} is a legacy alias; use /jobs/{id} in new work.
Critical Implementation Warning: Do not deliver a QR code or tell the customer that provisioning succeeded from the 202 response alone. Wait for the completed job or esim.provisioned event.

Common integration recipes

Three end-to-end patterns reflecting standard operational architectures across travel, mobility, and device fleet deployments.

Issue when the booking is confirmed

  1. Use the booking or order ID as client_reference.
  2. Estimate the issuance cost with POST /esims/estimate.
  3. POST /esims with a stable Idempotency-Key.
  4. Record the returned job_id against the booking.
  5. Listen for esim.provisioned and attach the activation result to the customer journey.
  6. Route esim.provision_failed to support or fulfilment review.
Why it matters: The customer receives connectivity inside the journey they already trust, while the business keeps a reliable reconciliation key.

* Qualification: Roaming usage may be reported after activity. Thresholds are operational safeguards, not guaranteed instantaneous hard spending caps.

Manage the line after issuance

Repeated suspend and resume requests converge on the requested state. Termination is permanent and should require deliberate confirmation in your own workflow.

Identify

PATCH /esims/{iccid}/nickname

Change network tier

PATCH /esims/{iccid}/tier

Pause data

POST /esims/{iccid}/suspend

Resume data

POST /esims/{iccid}/resume

Terminate permanently

PATCH /esims/{iccid}/status
Network tier: PATCH /esims/{iccid}/tier and POST /esims/bulk-tier take cheapest or best_coverage. A fleet call sends iccids with that tier. A new eSIM uses cheapest unless the issue request sets a tier.

Treat money fields as accounting data, not display text

The business account uses a pooled balance. Current issuance fees, available balance, quota and account configuration must be read from the API instead of copied into application code.

GET /quotas

Read current balance context, lifetime quota, rate-limit state, issuance fee and key/subscription summary.

GET /balance

Read pool totals and per-eSIM wallet mirrors.

GET /balance/history

Read the balance ledger.

POST /topup

Credit the pool from available prepaid partner budget; amount_usd is the current request field.

GET /invoices

Read completed orders associated with API-driven balance top-ups.

Currency rules

Usage and pooled-balance records can contain USD or EUR depending on the eSIM profile generation and transaction. Read currency and amount as the native pair. Usage/CDR events also expose amount_usd and amount_eur where available; one converted field may be zero when it is not the native accounting amount, so zero must not be interpreted as free usage.

Display conversion can be requested with ?currency=EUR or Accept-Currency: EUR where supported, while canonical accounting fields remain available alongside. Preserve the native currency and amount in your ledger.

Reconcile usage at the level your operation needs

EndpointUse
GET /usage/summaryPartner-wide totals for a selected period
GET /usage/esimsPer-eSIM rollups and filters
GET /usage/cdrsItemised, paginated usage events
GET /usage/timeseriesDaily usage and top-up totals for reporting
GET /esims/{iccid}/usageUsage rows for one eSIM
GET /esims/{iccid}/eventsLedger/lifecycle events for one eSIM
Legacy Route Note: GET /usage/lines is retained as an alias. New integrations should use GET /usage/esims.

Threshold model

  • • Scope: balance, esim or legacy-compatible line
  • • Metrics: balance_below, line_usage_pct, line_usage_usd_today
  • • Period: instant, daily, weekly, monthly
  • • Action: notify or suspend

Create, update and remove rules through /thresholds. Keep the operational caveat visible: network usage records are not guaranteed to arrive in real time.

Webhooks and signed event delivery

NXTL delivers asynchronous lifecycle and billing events to your registered HTTPS webhook endpoint. Every inbound request includes the X-NXTL-Signature-V1 header containing the delivery timestamp and an HMAC-SHA256 signature calculated over {timestamp}.{raw_json_body} using your active webhook secret.

Header Specification: X-NXTL-Signature-V1: t=<unix_timestamp>,v1=<hmac_sha256_hex>. Always compute HMAC over the raw UTF-8 request payload before JSON parsing.

Verification Code Samples

const crypto = require('crypto');

function verifyNxtlWebhook(rawBody, signatureHeader, secret) {
  if (!signatureHeader) return false;
  
  // Format: t=<unix_timestamp>,v1=<hex_hmac_sha256>
  const parts = signatureHeader.split(',');
  const timestamp = parts.find(p => p.startsWith('t='))?.slice(2);
  const v1 = parts.find(p => p.startsWith('v1='))?.slice(3);
  
  if (!timestamp || !v1) return false;
  
  // Validate v1 is exactly 64 hexadecimal characters
  if (v1.length !== 64 || !/^[0-9a-f]{64}$/i.test(v1)) {
    return false;
  }
  
  // Reconstruct signed payload
  const signedPayload = `${timestamp}.${rawBody}`;
  const computedHex = crypto
    .createHmac('sha256', secret)
    .update(signedPayload, 'utf8')
    .digest('hex');
    
  const expectedBuf = Buffer.from(computedHex, 'hex');
  const suppliedBuf = Buffer.from(v1, 'hex');
  
  if (expectedBuf.length !== suppliedBuf.length) return false;
  return crypto.timingSafeEqual(expectedBuf, suppliedBuf);
}

Canonical Webhook Events (15 Events)

Event NameCategoryTrigger Condition & Payload Meaning
esim.provisioned eSIM Lifecycle eSIM successfully provisioned (one ICCID ready for profile download).
esim.provision_failed eSIM Lifecycle Asynchronous issuance failed for an order item.
esim.tier_changed eSIM Lifecycle Network tier changed (single or bulk).
esim.suspended eSIM Lifecycle eSIM suspended (data paused).
esim.reactivated eSIM Lifecycle eSIM resumed after suspend.
esim.terminated eSIM Lifecycle eSIM permanently terminated.
esim.exchanged eSIM Lifecycle Old eSIM swapped for a fresh one (device replacement).
esim.usage_threshold eSIM Lifecycle Per-eSIM usage threshold (e.g. 80% of cap) crossed.
balance.topup Pooled Balance API top-up credited the pooled balance.
balance.low Pooled Balance Pooled balance fell below configured threshold.
balance.exhausted Pooled Balance Pooled balance reached zero — auto-suspend may have fired.
usage.recorded Usage Telemetry Billable data usage recorded for an eSIM (amount, currency, volume, network).
job.completed Batch Processing Async bulk job (issuance, etc.) finished.
job.failed Batch Processing Async bulk job failed at least one row.
test.ping Diagnostics Manually-triggered test event from the partner portal.

Make failures understandable and supportable

NXTL API responses use a structured error object with error, type, code, message, doc_url, optional details and a request ID. Some earlier lifecycle and balance operations can return a compact { "error": "code" } object. Treat the HTTP status as authoritative, handle optional fields defensively and retain the X-Request-Id response header when contacting support.

Structured JSON Error Envelope
{
  "error": true,
  "type": "INSUFFICIENT_BALANCE",
  "code": "insufficient_balance",
  "message": "Pooled balance cannot cover the requested operation.",
  "doc_url": "https://nxtlsim.com/business-api/errors/insufficient_balance",
  "request_id": "req_8f1b2c3d4e5f",
  "details": {
    "required_usd": 11.99,
    "available_usd": 4.50
  }
}
Status CodeError TypeIntegration Meaning & Handling Guidance
400 BAD_REQUESTbad_requestInvalid request body or parameters. Inspect details field for validation errors. Some earlier endpoints may return compact {"error":"code"}.
401 UNAUTHORIZEDunauthorizedMissing, invalid or revoked API secret in the X-NXTL-Key header.
402 INSUFFICIENT_BALANCEinsufficient_balancePooled balance cannot cover the requested operation. Earlier paths may return compact insufficient_budget or insufficient_balance. Top up balance to resume.
403 ACCESS_DENIEDaccess_deniedValid key without the required access scope for the requested endpoint.
404 NOT_FOUNDnot_foundRequested resource (ICCID, Job ID, Delivery ID, Key ID) was not found.
409 QUOTA_EXCEEDEDquota_exhaustedPartner lifetime issuance quota would be exceeded on bulk issuance.
429 RATE_LIMIT_EXCEEDEDrate_limit_exceededRequest rate limit exceeded (or single issuance quota exceeded with {"error":"quota_exceeded"}). Check Retry-After header.
502 UPSTREAM_ERRORupstream_errorUpstream carrier provisioning or service dependency failed. Retry with exponential backoff.

Endpoint reference

All paths below are relative to https://nxtlsim.com/api/v1. This reference documents the current NXTL B2B API. Use the endpoint groups below for human-readable integration guidance and the published OpenAPI document for machine-readable tooling.

Current API boundaries

The public API exposes the operations documented above. Some adjacent capabilities still require NXTL operations or a commercial integration review.

  • A public destination/network catalogue and dynamic pricing feed is not part of the current documented REST surface. Use the NXTL Coverage and Data Pricing pages, and discuss machine-readable pricing needs during integration planning.
  • Detailed upstream network diagnostics remain a support function rather than a partner API response.
  • The API does not guarantee that a specific device accepts a third-party eSIM. Validate the model and configuration separately.
  • Usage events can arrive after network activity; reporting and threshold actions should not be treated as instantaneous.
  • Standard NXTL service is data-only and does not provide ordinary cellular voice or SMS numbers through this API.

If a required operation is not documented, treat it as unavailable until NXTL confirms it—do not build against undocumented endpoints, unpublished routes, or inferred upstream carrier capabilities.

READY TO DESIGN THE FIRST FLOW?

Bring the use case. Leave with an integration path.

Tell us who or what you need to connect, the markets involved, expected monthly volume and the system that should trigger fulfilment. We will assess account, device, commercial and API fit.

API approval is not automatic. Begin with a contained workflow and expand after the operational path is proven.