Welcome to Troveana
Welcome to the TROVEANA eSIM API — a RESTful interface that lets you manage eSIM packages, create and track orders, send SMS, monitor usage, and receive real‑time webhook notifications.
This single page covers everything you need to integrate. Use the cards below to jump to a section.
The Basics
Quick Start
Three steps to your first successful request:
- Get your API key from your account manager.
- Pick an environment — use Sandbox for testing, Production for live customers.
- Make your first call — try listing packages:
curl -X GET "https://demo-public-api.troveana.net/api/v1/packages" \
-H "X-API-KEY: your_secret_api_key"That’s it — you’re integrated. Read on for the full reference.
Environments
TROVEANA provides two environments.
| Environment | Base URL | Use For |
|---|---|---|
| Production | https://api.troveana.com/api/v1 | Live customers, real billing, webhooks enabled |
| Sandbox | https://demo-public-api.troveana.net/api/v1 | Development, testing, demos |
Webhooks are Production‑onlyThe Sandbox environment supports every API operation except webhooks. Test webhook handling on Production against a dedicated test partner account.
Authentication
Every request must include your API key in the X-API-KEY header.
X-API-KEY: your_secret_api_keyExample:
curl -X GET "https://api.troveana.com/api/v1/packages" \
-H "X-API-KEY: your_secret_api_key"
Keep your API key secureNever expose your key in client‑side code, mobile apps, or public repositories. If your key is compromised, contact your account manager immediately to rotate it.
Response Structure
Every response follows the same envelope — so error handling works identically across all endpoints.
{
"success": true,
"data": {},
"error": null,
"refCode": 0,
"timestamp": 1702897200000
}| Field | Type | Description |
|---|---|---|
success | boolean | Indicates if the request was successful |
data | object | Response data (varies by endpoint) |
error | string | Error message if the request failed (null on success) |
refCode | integer | Internal reference code for tracking |
timestamp | long | Unix timestamp in milliseconds |
Success example:
{
"success": true,
"data": {
"trackingId": "TRK-20251218-001",
"status": "COMPLETED",
"iccid": "8901234567890123456"
},
"error": null,
"refCode": 0,
"timestamp": 1702897200000
}Error example:
{
"success": false,
"data": null,
"error": "Insufficient balance to complete this order",
"refCode": 422001,
"timestamp": 1702897200000
}
TipAlways check
successbefore readingdata. When it’sfalse, readerrorfor a human‑readable message andrefCodefor programmatic handling.
Pagination
Endpoints for eSIMs, order history, and packages support pagination.
| Parameter | Type | Default | Description |
|---|---|---|---|
page | integer | 1 | Page number (1‑indexed) |
pageSize | integer | 20 | Items per page (max: 100) |
sortBy | string | — | Field to sort by |
sortOrder | string | DESC | ASC or DESC |
Example request:
curl -X GET "https://api.troveana.com/api/v1/esims?page=1&pageSize=50" \
-H "X-API-KEY: your_secret_api_key"Paginated response:
{
"success": true,
"data": {
"items": [],
"pagination": {
"currentPage": 1,
"pageSize": 50,
"totalItems": 250,
"totalPages": 5,
"hasNextPage": true,
"hasPreviousPage": false
}
},
"error": null,
"refCode": 0,
"timestamp": 1702897200000
}
Iterating safelyUse
hasNextPageto decide when to stop — it’s safer than comparingcurrentPagetototalPageswhile new items are being added.
API Endpoints
Allowed Countries
Retrieve the list of countries accessible by your account.
Authentication required
GET /api/v1/allowed/countriesResponse:
{
"success": true,
"data": [
{
"code": "US",
"name": "United States",
"countryList": [],
"moreInfoAboutTheCountry": {
"id": "country_123",
"code": "US",
"name": "United States",
"currencyCode": "USD",
"lang": "en",
"active": true
}
}
],
"error": null,
"refCode": 0,
"timestamp": 1702897200000
}Packages
List all eSIM packages available for your account.
Authentication required
GET /api/v1/packagesQuery parameters:
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
page | integer | No | 1 | Page number |
pageSize | integer | No | 20 | Items per page (max: 100) |
countryCode | string | No | — | Filter by country |
sortBy | string | No | name | Sort field |
sortOrder | string | No | ASC | ASC or DESC |
Example:
curl -X GET "https://api.troveana.com/api/v1/packages?page=1&pageSize=20" \
-H "X-API-KEY: your_secret_api_key"Partner Balance
Check your current balance and available credit.
Authentication required
GET /api/v1/partner/balanceResponse:
{
"success": true,
"data": {
"partnerId": "partner_123",
"balance": 5000.00,
"currency": "USD",
"creditLimit": 10000.00,
"availableCredit": 5000.00,
"lastUpdated": "2025-12-18T10:30:00Z"
},
"error": null,
"refCode": 0,
"timestamp": 1702897200000
}
Before a batch orderCheck
availableCreditfirst to avoid"Insufficient balance"errors mid‑batch.
Orders
Create Order
Authentication required
POST /api/v1/ordersRequest body:
{
"item": "pkg_001",
"quantity": 1
}| Field | Type | Required | Description |
|---|---|---|---|
item | string | Yes | Package SKU or identifier |
quantity | integer | Yes | Number of eSIMs to order |
Success response:
{
"success": true,
"data": {
"status": "PENDING",
"trackingId": "TRK-20251218-001"
},
"error": null,
"refCode": 0,
"timestamp": 1702897200000
}
Save thetrackingIdYou’ll need it to poll the order and retrieve the ICCID, activation code, and QR code once fulfillment completes.
Get Order Details
Authentication required
POST /api/v1/orders/detailsRequest body:
{
"trackingId": "TRK-20251218-001"
}Response:
{
"success": true,
"data": {
"customerId": "partner_123",
"trackingId": "TRK-20251218-001",
"orderRequestTime": "2025-12-18T10:30:00Z",
"status": "COMPLETED",
"result": {
"iccid": "8901234567890123456",
"smdpAddress": "sm-dp.troveana.com",
"activationCode": "LPA:1$sm-dp.troveana.com$ABC123",
"qrCodeUrl": "https://api.troveana.com/qr/ABC123"
}
},
"error": null,
"refCode": 0,
"timestamp": 1702897200000
}eSIMs
List eSIMs
Authentication required
GET /api/v1/esimsQuery parameters:
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
page | integer | No | 1 | Page number |
pageSize | integer | No | 20 | Items per page (max: 100) |
status | string | No | — | Filter by status |
iccid | string | No | — | Filter by ICCID |
trackingId | string | No | — | Filter by tracking ID |
sortBy | string | No | createTime | Sort field |
sortOrder | string | No | DESC | ASC or DESC |
Installation QR Code
Get a direct link to the installation QR code for an eSIM.
Authentication required
GET /api/v1/esims/{iccid}/installation-qr| Parameter | Type | Required | Description |
|---|---|---|---|
iccid | string | Yes | eSIM ICCID |
Follow‑Up Page QR Code
Get a link to a follow‑up page containing the QR code plus usage information for the customer.
Authentication required
GET /api/v1/esims/{iccid}/followup-qrThe follow‑up page includes:
- Interactive installation QR code
- Data usage statistics
- Remaining data and validity period
- Step‑by‑step installation guide
Cancel eSIM
This is irreversibleCancelled eSIMs cannot be reactivated. Only eSIMs with status
ACTIVEorPENDINGcan be cancelled. Partial refunds may be available based on your partner agreement.
Authentication required
POST /api/v1/esims/cancelRequest body:
{
"iccid": "8901234567890123456",
"reason": "Customer request",
"trackingId": "TRK-CANCEL-20251218-001"
}Top‑Up eSIM
Recharge an existing eSIM with a new data package.
Authorized partners onlyThis endpoint is only available to partners who have been granted top‑up access. Contact your account manager to enable it.
Authentication required
POST /api/v1/esims/topupRequest body:
{
"iccid": "8901234567890123456",
"packageId": "pkg_topup_001",
"trackingId": "TRK-TOPUP-20251218-001"
}SMS
Send SMS
Authentication required
POST /api/v1/esims/sms/sendRequest body:
{
"iccid": "8901234567890123456",
"message": "Your verification code is: 123456",
"sender": "TROVEANA",
"trackingId": "TRK-SMS-20251218-001",
"metadata": {
"messageType": "verification",
"campaignId": "CAMPAIGN-001"
}
}| Field | Type | Required | Description |
|---|---|---|---|
iccid | string | Yes | Target eSIM ICCID |
message | string | Yes | SMS content (max 160 chars for single SMS) |
sender | string | No | Sender ID (default: TROVEANA) |
trackingId | string | Yes | Unique tracking ID for this SMS |
metadata | object | No | Additional custom data |
Get SMS Status
Authentication required
GET /api/v1/esims/sms/status/{trackingId}| Status | Meaning |
|---|---|
PENDING | Queued for delivery |
SENT | Sent to the carrier |
DELIVERED | Successfully delivered |
FAILED | Delivery failed |
EXPIRED | Expired before delivery |
Good to know
- SMS works only for eSIMs with active SMS support
- Messages over 160 characters are split into segments
- Delivery reports may take up to 30 seconds to update
- SMS costs are deducted from your partner balance
Order History
Retrieve the complete order history for your account.
Authentication required
GET /api/v1/history/ordersQuery parameters:
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
page | integer | No | 1 | Page number |
pageSize | integer | No | 20 | Items per page (max: 100) |
status | string | No | — | Filter by status |
startDate | string | No | — | Start date (ISO 8601) |
endDate | string | No | — | End date (ISO 8601) |
sortBy | string | No | orderRequestTime | Sort field |
sortOrder | string | No | DESC | ASC or DESC |
Example:
curl -X GET "https://api.troveana.com/api/v1/history/orders?page=1&pageSize=50&startDate=2025-12-01T00:00:00Z" \
-H "X-API-KEY: your_secret_api_key"Webhooks
Webhooks deliver real‑time notifications about eSIM events and usage updates to your server.
Production onlyWebhooks are only available in Production (
https://api.troveana.com). Contact your account manager to configure webhook endpoints.
Security
All webhook payloads are secured with asymmetric encryption and integrity verification:
- Encryption — Payload data is encrypted using your public RSA key
- Integrity — An MD5 hash of the unencrypted data is included for verification
Headers
Content-Type: application/json
X-Webhook-Signature: md5_hash_of_unencrypted_data
X-Webhook-Event: event_type
X-Webhook-Timestamp: 2025-12-18T10:30:00ZPayload Structure
{
"eventType": "esim.usage.updated",
"timestamp": "2025-12-18T10:30:00Z",
"encryptedData": "BASE64_ENCRYPTED_PAYLOAD",
"md5Hash": "5d41402abc4b2a76b9719d911017c592"
}Decryption Process
- Extract the
encryptedDatafield from the webhook payload - Decode the Base64‑encoded encrypted data
- Decrypt using your private RSA key
- Parse the decrypted JSON data
- Calculate MD5 hash of the decrypted data
- Compare with the
md5Hashfield to verify integrity
Event: esim.usage.updated
esim.usage.updatedDecrypted payload:
{
"iccid": "8901234567890123456",
"trackingId": "TRK-20251218-001",
"totalVolume": 5368709120,
"usedVolume": 1073741824,
"remainingVolume": 4294967296,
"usagePercentage": 20,
"lastUpdated": "2025-12-18T15:30:00Z"
}Response & Retries
Your endpoint must respond with 200 OK within 30 seconds. If we don’t receive a successful response, we retry with exponential backoff:
| Attempt | Delay |
|---|---|
| Retry 1 | After 1 minute |
| Retry 2 | After 5 minutes |
| Retry 3 | After 15 minutes |
| Retry 4 | After 1 hour |
| Retry 5 | After 6 hours |
Best practiceAcknowledge the webhook with
200 OKimmediately, then process the payload asynchronously. Long‑running handlers risk triggering unnecessary retries.
Need Help?
Contact your TROVEANA account manager for API keys, webhook configuration, top‑up access, or any integration questions.
Version 1.0 · © 2025 TROVEANA. All rights reserved.
Updated about 2 hours ago
