Overview
The reseller API is exposed under /api/v1 and uses header-based token authentication. The main commercial flow is login → list bundles → complete sale or top up (v2) → monitor consumption and order history. The API is fully described by an OpenAPI 3.0 (Swagger) specification — every endpoint, request body, and response shown here matches the published Swagger schema.
Scope: this document includes only the main reseller-facing endpoints shown in the integration flow. Internal/admin endpoints (reseller setup, roles, branches, pricing customization) are intentionally not covered here.
Note: if your deployment exposes a different host or prefix, keep the same endpoint paths and replace only the base URL.
Base URL & Authentication
| Item | Value |
|---|---|
Base URL | https://resellerapi.comium.gm/api/v0 |
Primary auth header | Access-Token: <access_token> |
Internal platform header | Internal-Token (used only for internal/admin flows when applicable) |
Login endpoint | POST /Agent/login |
Refresh endpoint | POST /Token/Refresh |
Server path in spec | /api/v1 |
Login request
{
"username": "your_reseller_username",
"password": "YourStrongPassword1!"
}The login response returns an access_token, refresh_token, token type, expiry values, role information, reseller_id, and feature flags such as show_global_esim_bundles.
Sample request headers
Content-Type: application/json
Access-Token: <access_token>Recommended Commercial Flow
- Authenticate with
POST /Agent/loginand store bothaccess_tokenandrefresh_token. - List available bundles with
GET /Bundlesusing filters such ascountry_code,bundle_category,region_code, andprofile_type. - Assign a bundle in a single call using
POST /Bundlewith the selectedbundle_codeand yourorder_reference. Checks the reseller wallet balance, verifies the bundle is available, and assigns it to the end user. - Use
GET /OrdersorGET /Profile/Consumptionto track status and usage.
Core Endpoints
/Agent/login/Token/Refresh/Bundles/Bundles/Networks/Bundle/Orders/Profile/ConsumptionField Reference (to double-check)
swagger.json before going live./Agent/loginRequest body
| Field | Type | Required |
|---|---|---|
username | string | Yes |
password | string | Yes |
Response
| Field | Type | Notes |
|---|---|---|
access_token | string | Bearer token for Access-Token header |
refresh_token | string | Used with /Token/Refresh |
token_type | string | Typically 'Bearer' |
expires_in | integer (seconds) | Access token lifetime |
refresh_expires_in | integer (seconds) | Refresh token lifetime |
reseller_id | string / integer | Authenticated reseller identifier |
role | string | Reseller role |
show_global_esim_bundles | boolean | Feature flag |
/Token/RefreshRequest body
| Field | Type | Required |
|---|---|---|
refresh_token | string | Yes |
Response
| Field | Type | Notes |
|---|---|---|
access_token | string | New bearer token |
refresh_token | string | Rotated refresh token |
expires_in | integer (seconds) | Lifetime |
/BundlesQuery parameters
| Field | Type | Required |
|---|---|---|
country_code | string (ISO-3) | Optional |
region_code | string | Optional |
bundle_category | enum: global | region | country | cruise | Optional |
profile_type | enum: STANDARD | GLOBAL_ESIM | Optional |
page_size | integer | Optional |
page_number | integer | Optional |
Response (per bundle item)
| Field | Type | Notes |
|---|---|---|
bundle_code | string | Unique identifier used in /Order |
bundle_name | string | Internal name |
bundle_marketing_name | string | Display name |
country_name | string | |
region_name | string | |
validity | integer (days) | |
data_quota | string / integer | Volume in MB or unlimited flag |
bundle_price_final | decimal | Final reseller price |
subscriber_price | decimal | Suggested retail price |
reseller_retail_price | decimal | Custom retail price |
support_topup | boolean | Eligible for top-up |
supports_calls_sms | boolean | |
profile_type | enum: STANDARD | GLOBAL_ESIM |
/Bundles/NetworksQuery parameters
| Field | Type | Required |
|---|---|---|
bundle_code | string | Yes |
Response (per network item)
| Field | Type | Notes |
|---|---|---|
country_code | string | |
country_name | string | |
network_name | string | Operator name |
network_speed | string | e.g. 4G, 5G |
/BundleAssign a bundle. Checks the reseller wallet balance, verifies the bundle is available, and assigns it to the end user.
Query parameters
| Field | Type | Required |
|---|---|---|
reseller_id | string (hex) | Super admin only |
branch_id | string (hex) | Super admin only |
currency_code | string | Optional — preview currency (e.g. SAR) |
Request body
| Field | Type | Required |
|---|---|---|
bundle_code | string | Yes |
email | string | Yes |
name | string | Yes |
order_reference | string | Your unique reference |
whatsapp_number | string | Optional |
Response (200)
| Field | Type | Notes |
|---|---|---|
title | string | e.g. Success |
message | string | e.g. Bundle Assigned Successfully |
developer_message | string | Operation Successful |
response_code | string | e.g. "1" |
order_id | string (hex) | Created order identifier |
iccid | string | |
reseller_id | string (hex) | |
remaining_wallet_balance | decimal | Updated wallet balance |
remaining_wallet_balance_in_additional_currency | decimal | |
additional_currency_code | string | e.g. SAR |
Other responses: 204 No Content, 403 Forbidden.
/OrdersQuery parameters
| Field | Type | Required |
|---|---|---|
order_reference | string | Optional |
from_date | date (YYYY-MM-DD) | Optional |
to_date | date (YYYY-MM-DD) | Optional |
search | string | Optional free-text |
page_size | integer | Optional |
page_number | integer | Optional |
Response (per order item)
| Field | Type | Notes |
|---|---|---|
order_id | string | |
order_reference | string | |
bundle_code | string | |
bundle_marketing_name | string | |
iccid | string | |
status | string | success | failed | pending |
created_at | datetime (ISO-8601) | |
expiry_date | datetime (ISO-8601) | |
amount_charged | decimal |
/Profile/ConsumptionQuery parameters
| Field | Type | Required |
|---|---|---|
iccid | string | Either iccid or order_id |
order_id | string | Either iccid or order_id |
Response
| Field | Type | Notes |
|---|---|---|
iccid | string | |
profile_status | string | |
profile_expiry_date | datetime (ISO-8601) | |
orders_balances | array<object> | Per-bundle remaining balance |
orders_balances[].order_id | string | |
orders_balances[].bundle_code | string | |
orders_balances[].remaining_data | integer (MB) | |
orders_balances[].total_data | integer (MB) | |
orders_balances[].remaining_calls | integer (minutes) | If applicable |
orders_balances[].remaining_sms | integer | If applicable |
orders_balances[].expiry_date | datetime (ISO-8601) | |
orders_balances[].status | string | active | expired | depleted |
Assign a Bundle
Step 1 — Get bundles
GET /Bundles?country_code=FRA&bundle_category=country&page_size=25
Access-Token: <access_token>Relevant bundle response fields include bundle_code, bundle_name, bundle_marketing_name, country_name, region_name, validity, bundle_price_final, subscriber_price, reseller_retail_price, support_topup, supports_calls_sms, and profile_type.
Step 2 — Assign the bundle
Call POST /Bundle with the selected bundle_code and the end user's details. Optional query parameters: reseller_id, branch_id (super admin only), and currency_code to preview the wallet balance in another currency.
{
"bundle_code": "USA3GB_3102938429",
"email": "client@hotmail.com",
"name": "John Wick",
"order_reference": "ORDER-10001",
"whatsapp_number": "+33600000000"
}{
"title": "Success",
"message": "Bundle Assigned Successfully",
"developer_message": "Operation Succcessful",
"response_code": "1",
"order_id": "507f191e810c19729de860ea",
"iccid": "iccid",
"reseller_id": "507f191e810c19729de860ea",
"remaining_wallet_balance": 30,
"remaining_wallet_balance_in_additional_currency": 30,
"additional_currency_code": "SAR"
}Consumption & Order Tracking
| Endpoint | Identifier | Returns |
|---|---|---|
GET /Orders | order_reference, dates, search | Order history across successful and failed orders. |
GET /Profile/Consumption | iccid or order_id | Profile-level orders_balances, profile_status, expiry, units, call/SMS flags. |
Overview & Terminology
Global eSIM allows multiple coverage areas to coexist on a single eSIM profile. End-users can add new regions or countries on the same QR/eSIM profile without installing a new profile. Additional bundles are applied as top-ups on the same ICCID, and active bundles can coexist simultaneously.
| Term | Definition |
|---|---|
Global eSIM | Bundles supporting simultaneous provisioning. Multiple Global eSIM bundles, even with different roaming areas, can be assigned to the same ICCID as top-ups. |
Standard eSIM | Traditional bundles tied to a single coverage area. A Standard profile cannot be combined with Global eSIM bundles, and vice versa. |
Profile Type | Bundle/profile classification. Allowed values: GLOBAL_ESIM and STANDARD. Determined at initial provisioning and cannot be changed. |
Changelog Summary
| Endpoint | Change | Summary |
|---|---|---|
GET /Profile/Consumption | New | Aggregates consumption across all active orders on a profile; replaces deprecated per-order endpoint. |
GET /Bundles | Updated | Adds profile_type and iccid query parameters. Response includes profile_type. |
GET /Countries | Updated | Adds profile_type and iccid query parameters for coverage filtering. |
GET /Regions | Updated | Adds profile_type and iccid query parameters for coverage filtering. |
GET /Orders | Updated | Adds global_esim query parameter. Response includes global_esim. |
GET /v2/Bundles/Topup | Updated | Filters top-up bundles to match the original order profile type. |
GET /Orders/Consumption | Deprecated | Replaced by GET /Profile/Consumption. |
Compatibility & Migration
Reseller configuration
show_global_esim_bundles: false(default): fully backward compatible. Bundle, country, and region endpoints return Standard eSIM products only. Queries withprofile_type=GLOBAL_ESIMreturn HTTP 400.show_global_esim_bundles: true: enables querying and purchasing Global eSIM bundles and allows filtering withprofile_type=GLOBAL_ESIM.
Adoption options
- No changes: existing API calls continue to work and return Standard eSIM products by default.
- Gradual adoption: read
profile_typeandglobal_esimin responses, migrate consumption to/Profile/Consumption, then enable Global eSIM. - Full integration: enable Global eSIM, update bundle listing filters, switch to
/Profile/Consumption, optionally filter order history withglobal_esim=true.
Recommended migration examples
GET /Bundles?profile_type=GLOBAL_ESIM
GET /Bundles?profile_type=STANDARD
GET /Profile/Consumption?iccid={iccid}
GET /Orders?global_esim=trueDeprecation notice
| Endpoint | Replacement | Sunset Date |
|---|---|---|
GET /Orders/Consumption | GET /Profile/Consumption | TBD — at least 6 months advance notice |
Enums & Error Catalog
Common enums
| Field | Allowed values | Description |
|---|---|---|
profile_type | GLOBAL_ESIM / STANDARD | Bundle and profile classification. |
order status | active / pending / depleted / expired | Current plan or order status. |
profile_status | active / released / downloaded / deleted | Current state of the eSIM profile. |
Error catalog
| Scenario | HTTP Status | Detail |
|---|---|---|
Request GLOBAL_ESIM while feature is disabled | 400 | Feature not supported |
Neither iccid nor order_id provided | 400 | At least order_id or iccid is required |
Both iccid and order_id provided together | 400 | ICCID and order_id cannot be provided together |
ICCID or order not found | 404 | Profile not found |
FAQ
Key Fields Returned After Completion
| Field | Meaning |
|---|---|
activation_code | Activation code used for eSIM installation. |
smdp_address | SM-DP+ address used together with activation_code. |
iccid | Unique eSIM profile identifier. |
matching_id | Matching ID used during profile provisioning. |
plan_uid | Internal plan unique identifier. |
expiry_date | Order or bundle expiry date returned by the platform. |
profile_expiry_date | Profile-level expiry information for the eSIM. |
plan_status | Current plan status on the profile. |
remaining_wallet_balance | Reseller wallet balance after transaction completion. |
Notes & Recommendations
- Authentication failures or permission issues are commonly returned as
401or403depending on the flow. - Several endpoints also define
204 No Contentand400 Bad Requestresponses. - For production integration, always send and store your own
order_referenceso you can reconcile reservation, completion, top-up, cancelation, and reporting flows. - The OpenAPI specification also exposes internal/admin endpoints (reseller setup, roles, branches, pricing customization) that are intentionally not the focus of this reseller-facing document.
