Seyyah Reseller API
Integrate eSIM purchasing and management directly into your platform. Offer global data connectivity to your customers through a simple, reliable REST API.
Authentication
All API requests must include your API key as a query parameter. Keep your API key confidential and never expose it in client-side code.
curl "https://your-subdomain.seyyahmobile.com/api/plans?api_key=YOUR_API_KEY"
| Parameter | Location | Required | Description |
|---|---|---|---|
api_key |
Query string | Required | Your unique API key provided by Seyyah |
403 Forbidden response.
Base URL
All endpoints are relative to your assigned subdomain:
https://{your-subdomain}.seyyahmobile.com/api
Replace {your-subdomain} with your assigned subdomain slug.
List Available Plans
Retrieve all available eSIM plans grouped by country/region, with your reseller-specific pricing.
Response
{
"success": true,
"data": [
{
"category_id": 45,
"category_name": {
"en": "Turkey",
"tr": "Türkiye"
},
"iso2": "TR",
"plans": [
{
"plan_id": 120,
"name": "Turkey 5GB - 30 Days",
"data_gb": 5,
"validity_days": 30,
"price": 8.50,
"supports_topup": true,
"code": "TR-5GB-30D"
},
{
"plan_id": 121,
"name": "Turkey 10GB - 30 Days",
"data_gb": 10,
"validity_days": 30,
"price": 14.00,
"supports_topup": true,
"code": "TR-10GB-30D"
}
]
}
]
}
Plan Object
| Field | Type | Description |
|---|---|---|
plan_id | integer | Unique identifier. Use this when creating orders. |
name | string | Human-readable plan name |
data_gb | number | Data allowance in GB |
validity_days | integer | Validity period in days from activation |
price | number | Your reseller price in USD |
supports_topup | boolean | Whether this plan supports data top-ups |
code | string | New, optional Stable package code (country + data + validity, e.g. TR-10GB-30D). Never changes and is never reused. You may keep using plan_id; both keep working. |
Create Order
Create a new eSIM purchase or top-up. The order amount is deducted from your wallet balance. eSIM provisioning occurs asynchronously — you'll receive the result via your webhook URL.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
plan_id | integer | Required | The plan ID from /plans (or send code instead) |
code | string | Optional | Stable package code from /plans, accepted instead of plan_id. If both are sent, plan_id is used. Order responses and webhooks echo the plan_id / plan you ordered and include code. |
type | string | Required | "purchase" for new eSIM or "topup" to add data |
customer_email | string | Required | End customer's email address |
customer_name | string | Optional | End customer's display name |
webhook_url | string | Required | URL to receive order status updates |
idempotency_key | string | Required | Unique key to prevent duplicate orders (max 191 chars) |
iccid | string | Required if topup | ICCID of the existing eSIM to top up |
Example: New Purchase
curl -X POST "https://your-subdomain.seyyahmobile.com/api/orders?api_key=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"plan_id": 120,
"type": "purchase",
"customer_email": "[email protected]",
"customer_name": "John Doe",
"webhook_url": "https://yoursite.com/webhooks/esim",
"idempotency_key": "order-2026-02-26-abc123"
}'
Example: Top-Up
curl -X POST "https://your-subdomain.seyyahmobile.com/api/orders?api_key=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"plan_id": 121,
"type": "topup",
"customer_email": "[email protected]",
"webhook_url": "https://yoursite.com/webhooks/esim",
"idempotency_key": "topup-2026-02-26-xyz789",
"iccid": "8901234567890123456"
}'
Success Response
{
"success": true,
"data": {
"id": 5432,
"uuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"customer_name": "John Doe",
"customer_email": "[email protected]",
"type": "purchase",
"plan_name": "Turkey 5GB - 30 Days",
"data_gb": 5,
"validity_days": 30,
"amount": 8.50,
"currency": "USD",
"created_at": "2026-02-26T10:30:00+00:00",
"completed_at": null,
"failed_at": null,
"failure_reason": null,
"status": "processing",
"esim": null
},
"wallet_balance": 491.50
}
status: "processing".
eSIM provisioning happens in the background. You will receive the eSIM details via your webhook once the order completes.
Get Order Status
Retrieve the current status and details of an existing order. You can look up orders by ID, UUID, or your idempotency key.
The {order} can be any of:
| Type | Example | Description |
|---|---|---|
| Order ID | 5432 | Numeric auto-increment ID |
| UUID | a1b2c3d4-e5f6-... | Universal unique identifier |
| Idempotency Key | order-2026-02-26-abc123 | Your custom idempotency key |
Completed Order Response
{
"success": true,
"data": {
"id": 5432,
"uuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"customer_name": "John Doe",
"customer_email": "[email protected]",
"type": "purchase",
"plan_name": "Turkey 5GB - 30 Days",
"data_gb": 5,
"validity_days": 30,
"amount": 8.50,
"currency": "USD",
"created_at": "2026-02-26T10:30:00+00:00",
"completed_at": "2026-02-26T10:30:45+00:00",
"failed_at": null,
"failure_reason": null,
"status": "completed",
"esim": {
"iccid": "8901234567890123456",
"lpa": "LPA:1$rsp.example.com$ABCD-EFGH-1234",
"smdp_address": "rsp.example.com",
"matching_id": "ABCD-EFGH-1234",
"qrcode_url": "https://cdn.seyyahmobile.com/qrcodes/reseller_5432.png"
}
}
}
eSIM Object
| Field | Type | Description |
|---|---|---|
iccid | string | Unique eSIM identifier. Use for top-up orders. |
lpa | string | Full LPA string for manual eSIM installation |
smdp_address | string | SM-DP+ server address |
matching_id | string | Activation matching code |
qrcode_url | string | QR code image URL for eSIM installation |
Webhooks
When an order is completed or fails, Seyyah sends a POST request to your webhook_url with the order details.
Webhook Events
| Event | Description |
|---|---|
order.completed |
eSIM provisioned successfully. The esim object contains installation data. |
order.failed |
Provisioning failed. failure_reason explains why. Balance is automatically refunded. |
Webhook Payload
{
"event": "order.completed",
"status": "completed",
"data": {
"id": 5432,
"uuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"customer_name": "John Doe",
"customer_email": "[email protected]",
"type": "purchase",
"plan_name": "Turkey 5GB - 30 Days",
"data_gb": 5,
"validity_days": 30,
"amount": 8.50,
"currency": "USD",
"created_at": "2026-02-26T10:30:00+00:00",
"completed_at": "2026-02-26T10:30:45+00:00",
"status": "completed",
"esim": {
"iccid": "8901234567890123456",
"lpa": "LPA:1$rsp.example.com$ABCD-EFGH-1234",
"smdp_address": "rsp.example.com",
"matching_id": "ABCD-EFGH-1234",
"qrcode_url": "https://cdn.seyyahmobile.com/qrcodes/reseller_5432.png"
}
}
}
Retry Policy
Your webhook endpoint must respond with a 2xx status code. Non-2xx responses trigger retries with exponential backoff:
| Attempt | Delay After Failure |
|---|---|
| 1st retry | 2 minutes |
| 2nd retry | 4 minutes |
| 3rd retry | 8 minutes |
| 4th retry | 16 minutes |
| 5th retry (final) | 32 minutes |
Order Lifecycle
Wallet deducted
Webhook sent
Webhook sent
| Status | Description | Wallet |
|---|---|---|
| processing | eSIM is being provisioned from the carrier | Balance deducted, held in escrow |
| completed | eSIM ready — installation details in esim object |
Escrow settled |
| failed | Provisioning failed — check failure_reason |
Balance automatically refunded |
Idempotency
Every order creation request requires a unique idempotency_key. If you accidentally send the same request twice (e.g., due to a network timeout), the API returns the existing order instead of creating a duplicate.
{
"success": true,
"message": "Duplicate request, returning existing order.",
"data": { ... }
}
purchase-{customer_id}-{plan_id}-{timestamp} so retries naturally reuse the same key.
Error Codes
| HTTP Code | Meaning | Description |
|---|---|---|
200 | OK | Request successful |
201 | Created | Order created successfully |
400 | Bad Request | Invalid request (e.g., top-up not supported) |
402 | Payment Required | Insufficient wallet balance |
403 | Forbidden | Invalid API key or IP not whitelisted |
404 | Not Found | Plan or order not found |
422 | Validation Error | Missing or invalid request fields |
503 | Service Unavailable | API not enabled for your account |
Error Response Format
{
"success": false,
"error": "Insufficient wallet balance."
}
Validation Error Format
{
"success": false,
"error": "Validation failed",
"messages": {
"plan_id": ["The plan_id field is required."],
"webhook_url": ["The webhook_url must be a valid URL."]
}
}
Data Types
| Type | Format | Example |
|---|---|---|
| Currency | All prices in USD | 8.50 |
| Timestamps | ISO 8601 | 2026-02-26T10:30:00+00:00 |
| ICCID | Numeric string (18-22 chars) | 8901234567890123456 |
| UUID | RFC 4122 | a1b2c3d4-e5f6-7890-abcd-ef1234567890 |
Test Mode
If your account is in test mode, only plans enabled for sandbox testing are available. Test mode uses sandbox provisioning: test orders simulate the provisioning flow without creating real eSIMs.
© 2024–2026 Seyyah Mobile. For API key requests, wallet top-ups, or technical support, contact your account manager.