Reseller API Documentation
Integrate PikaSim eSIM purchasing into your application. Same pricing as on the website. Deliver eSIMs to your customers programmatically.
Authentication
All API requests require authentication via API key. Include your API key in the X-API-Key header:
X-API-Key: pk_live_your_api_key_here
Base URL
https://pikasim.com/api/v1/reseller
Account Endpoints
/account
Get your account information and current balance.
Response
{
"success": true,
"data": {
"companyName": "Your Company",
"status": "approved",
"balance": 10000,
"balanceFormatted": "$100.00",
"totalOrders": 42
}
}
/balance
Get your current wallet balance and available credit.
/transactions
List your transaction history with pagination.
Query Parameters
page- Page number (default: 1)limit- Items per page (default: 20, max: 100)type- Filter by type: deposit, order, topup, refund, adjustment
Package Endpoints
/packages
List available eSIM packages with full details.
Query Parameters
country- Filter by country code (e.g., US, JP, GB)region- Filter by region nameduration- Filter by duration in daysminData- Minimum data in GBmaxData- Maximum data in GBprivacy- Filter by privacy level:max- Only max privacy packages (non-HK/China IP routing)standard- Only standard packages (HK/China IP routing)all- All packages (default)
page- Page numberlimit- Items per page (max: 200)
Response
{
"success": true,
"data": {
"packages": [
{
"packageCode": "JP_7D_1GB",
"name": "Japan 7 Days 1GB",
"slug": "japan-7-days-1gb",
"location": "JP",
"region": null,
"isGlobalPackage": false,
"locationNetworkList": [
{
"locationName": "Japan",
"operatorList": [
{ "operatorName": "Docomo", "networkType": "4G" }
]
}
],
"volume": 1073741824,
"volumeGB": 1,
"dataType": 1,
"duration": 7,
"durationUnit": "DAY",
"speed": "4G/LTE",
"price": 500,
"priceFormatted": "$5.00",
"ipExport": "US",
"maxPrivacy": true,
"smsStatus": 0,
"supportTopUpType": true,
"activeType": 1,
"description": "7-day Japan eSIM with 1GB data"
}
],
"pagination": { "page": 1, "limit": 50, "total": 150, "pages": 3 }
}
}
Field Descriptions
price- Price in cents (500 = $5.00)volume- Data volume in bytesvolumeGB- Data volume in GBdataType- 1 = fixed data, 2 = daily reset unlimitedipExport- Country where traffic exits (null = HK)maxPrivacy- true if non-HK/China IP routingsmsStatus- 0 = no SMS, 1 = SMS supported, 2 = API SMS onlysupportTopUpType- Whether top-ups are availableactiveType- 1 = first install, 2 = first network connection
/packages/:packageCode
Get full details for a specific package (same fields as list response).
Order Endpoints
/orders
Create a new eSIM order. The eSIM details will be delivered via webhook when ready.
Request Body
{
"packageCode": "JP_7D_1GB",
"externalOrderId": "YOUR-REF-123" // Optional: your reference ID
}
Response
{
"success": true,
"data": {
"orderId": "65a4f8c9...",
"externalOrderId": "YOUR-REF-123",
"status": "processing",
"packageCode": "JP_7D_1GB",
"price": 518,
"priceFormatted": "$5.18",
"message": "Order created. eSIM details will be sent via webhook."
}
}
/orders
List your orders with pagination.
Query Parameters
status- Filter by status: pending, processing, completed, failedpage- Page numberlimit- Items per page
/orders/:orderId
Get details for a specific order including eSIM details if completed.
eSIM Endpoints
/esims/:iccid
Get full eSIM details including live status from the network.
Response
{
"success": true,
"data": {
"iccid": "8901234567890123456",
"orderId": "65a4f8c9...",
"externalOrderId": "YOUR-REF-123",
"packageCode": "JP_7D_1GB",
"packageName": "Japan 7 Days 1GB",
"qrCodeUrl": "https://...",
"activationCode": "LPA:1$...",
"lpaUrl": "https://...",
"shortUrl": "https://...",
"status": "IN_USE",
"smdpStatus": "ENABLED",
"totalData": 1073741824,
"usedData": 536870912,
"remainingData": 536870912,
"expireTime": "2024-01-22T00:00:00Z",
"apn": "internet",
"imsi": "...",
"msisdn": "+1234567890",
"packageList": [...],
"purchasedAt": "2024-01-15T10:30:00Z",
"createdAt": "2024-01-15T10:30:05Z"
}
}
/esims/:iccid/usage
Get detailed data usage statistics for an eSIM.
Response
{
"success": true,
"data": {
"iccid": "8901234567890123456",
"status": "IN_USE",
"smdpStatus": "ENABLED",
"statusDescription": "eSIM is active and in use",
"totalData": 1073741824,
"usedData": 536870912,
"remainingData": 536870912,
"totalDataGB": 1,
"usedDataGB": 0.5,
"remainingDataGB": 0.5,
"totalDataMB": 1024,
"usedDataMB": 512,
"remainingDataMB": 512,
"usagePercent": 50,
"expireTime": "2024-01-22T00:00:00Z",
"createTime": "2024-01-15T10:30:00Z",
"packageList": [
{
"packageCode": "JP_7D_1GB",
"packageName": "Japan 7 Days 1GB",
"volume": 1073741824,
"volumeGB": 1,
"duration": 7,
"createTime": "2024-01-15T10:30:00Z"
}
]
}
}
eSIM Status Values
GOT_RESOURCE- eSIM ready for installationIN_USE- eSIM is active and in useENABLED- eSIM is enabled and readySUSPENDED- eSIM has been suspendedUSED_UP- All data has been consumedREVOKED- eSIM has been revoked
/esims/:iccid/topup-options
Get available top-up packages for an eSIM.
/esims/:iccid/topup
Add data to an existing eSIM.
Request Body
{
"packageCode": "JP_TOPUP_1GB",
"externalOrderId": "YOUR-REF-456" // Optional
}
/esims/:iccid/cancel
Cancel an unused eSIM and receive a refund. Only works if the eSIM has not been installed yet.
Requirements
esimStatusmust beGOT_RESOURCEsmdpStatusmust beRELEASED
Response
{
"success": true,
"data": {
"iccid": "89852240810732443908",
"orderId": "65a4f8c9...",
"refundAmount": 500,
"refundFormatted": "$5.00",
"newBalance": 1500,
"newBalanceFormatted": "$15.00",
"message": "eSIM cancelled successfully. Refund added to your balance."
}
}
Error Response (eSIM already in use)
{
"success": false,
"error": "eSIM cannot be cancelled - already installed or in use",
"currentStatus": {
"esimStatus": "IN_USE",
"smdpStatus": "ENABLED"
},
"message": "Only unused eSIMs that have not been installed can be cancelled for a refund."
}
Deposit Endpoints
/deposit/stripe
Create a Stripe checkout session to add funds to your wallet.
Request Body
{
"amount": 10000 // Amount in cents ($100.00)
}
Response
{
"success": true,
"sessionId": "cs_live_...",
"checkoutUrl": "https://checkout.stripe.com/..."
}
/deposit/btcpay
Create a BTCPay invoice to add funds via cryptocurrency.
Request Body
{
"amount": 10000 // Amount in cents ($100.00)
}
Webhooks
Configure a webhook URL to receive real-time notifications when orders are completed.
/webhook
Update your webhook settings.
Request Body
{
"webhookUrl": "https://your-server.com/webhook",
"webhookEvents": ["esim.provisioned", "esim.topup.completed", "order.failed"]
}
/webhook/test
Send a test webhook to verify your endpoint.
Webhook Events
esim.provisioned- eSIM is ready with QR codeesim.topup.completed- Top-up was successfulorder.failed- Order failed (automatic refund issued)
Webhook Payload
{
"event": "esim.provisioned",
"timestamp": "2024-01-15T10:30:00Z",
"data": {
"orderId": "65a4f8c9...",
"externalOrderId": "YOUR-REF-123",
"packageCode": "JP_7D_1GB",
"esim": {
"iccid": "8901234567890123456",
"qrCodeUrl": "https://...",
"activationCode": "LPA:1$...",
"shortUrl": "https://..."
}
}
}
Webhook Security
All webhooks include an HMAC-SHA256 signature in the X-Webhook-Signature header. Verify the signature using your webhook secret:
const crypto = require('crypto');
function verifySignature(payload, signature, secret) {
const expected = crypto
.createHmac('sha256', secret)
.update(JSON.stringify(payload))
.digest('hex');
return signature === expected;
}
Error Handling
All errors return a consistent format:
{
"success": false,
"error": "Error message here"
}
HTTP Status Codes
| Code | Description |
|---|---|
| 200 | Success |
| 201 | Created (for new orders) |
| 400 | Bad Request - Invalid parameters |
| 401 | Unauthorized - Invalid or missing API key |
| 402 | Payment Required - Insufficient balance |
| 403 | Forbidden - Account suspended or IP not whitelisted |
| 404 | Not Found - Resource doesn't exist |
| 429 | Too Many Requests - Rate limit exceeded |
| 500 | Internal Server Error |
Rate Limiting
Default rate limit is 60 requests per minute. Rate limit headers are included in all responses:
X-RateLimit-Limit- Your rate limitX-RateLimit-Remaining- Remaining requestsX-RateLimit-Reset- Reset timestamp
Support
For API support or to become a reseller partner, contact us at [email protected]