Comium logo
Comium Reseller API
Get Started
Version 1.0 · April 2026

Reseller API Documentation

Main integration endpoints for resellerapi.comium.gm. Authenticate, list bundles, assign eSIM plans, top up, and track consumption.

Header-based auth
Access-Token
REST + JSON
Predictable endpoints
Global eSIM
Multi-region profiles
Introduction

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.

Setup

Base URL & Authentication

ItemValue
Base URLhttps://resellerapi.comium.gm/api/v0
Primary auth headerAccess-Token: <access_token>
Internal platform headerInternal-Token (used only for internal/admin flows when applicable)
Login endpointPOST /Agent/login
Refresh endpointPOST /Token/Refresh
Server path in spec/api/v1

Login request

POST /Agent/login
{
  "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

Headers
Content-Type: application/json
Access-Token: <access_token>
Workflow

Recommended Commercial Flow

  1. Authenticate with POST /Agent/login and store both access_token and refresh_token.
  2. List available bundles with GET /Bundles using filters such as country_code, bundle_category, region_code, and profile_type.
  3. Assign a bundle in a single call using POST /Bundle with the selected bundle_code and your order_reference. Checks the reseller wallet balance, verifies the bundle is available, and assigns it to the end user.
  4. Use GET /Orders or GET /Profile/Consumption to track status and usage.
Reference

Core Endpoints

POST/Agent/login
Authenticate and return tokens
POST/Token/Refresh
Refresh access token
GET/Bundles
List available bundles
GET/Bundles/Networks
Supported network list
POST/Bundle
Assign a bundle to a user
GET/Orders
Order history with filters
GET/Profile/Consumption
Profile-level consumption
Reference

Field Reference (to double-check)

⚠ To be verified against the live Swagger: the tables below list the exact request and response fields expected for each endpoint. Please confirm field names, types, and required/optional flags against the latest swagger.json before going live.
POST/Agent/login

Request body

FieldTypeRequired
usernamestringYes
passwordstringYes

Response

FieldTypeNotes
access_tokenstringBearer token for Access-Token header
refresh_tokenstringUsed with /Token/Refresh
token_typestringTypically 'Bearer'
expires_ininteger (seconds)Access token lifetime
refresh_expires_ininteger (seconds)Refresh token lifetime
reseller_idstring / integerAuthenticated reseller identifier
rolestringReseller role
show_global_esim_bundlesbooleanFeature flag
POST/Token/Refresh

Request body

FieldTypeRequired
refresh_tokenstringYes

Response

FieldTypeNotes
access_tokenstringNew bearer token
refresh_tokenstringRotated refresh token
expires_ininteger (seconds)Lifetime
GET/Bundles

Query parameters

FieldTypeRequired
country_codestring (ISO-3)Optional
region_codestringOptional
bundle_categoryenum: global | region | country | cruiseOptional
profile_typeenum: STANDARD | GLOBAL_ESIMOptional
page_sizeintegerOptional
page_numberintegerOptional

Response (per bundle item)

FieldTypeNotes
bundle_codestringUnique identifier used in /Order
bundle_namestringInternal name
bundle_marketing_namestringDisplay name
country_namestring
region_namestring
validityinteger (days)
data_quotastring / integerVolume in MB or unlimited flag
bundle_price_finaldecimalFinal reseller price
subscriber_pricedecimalSuggested retail price
reseller_retail_pricedecimalCustom retail price
support_topupbooleanEligible for top-up
supports_calls_smsboolean
profile_typeenum: STANDARD | GLOBAL_ESIM
GET/Bundles/Networks

Query parameters

FieldTypeRequired
bundle_codestringYes

Response (per network item)

FieldTypeNotes
country_codestring
country_namestring
network_namestringOperator name
network_speedstringe.g. 4G, 5G
POST/Bundle

Assign a bundle. Checks the reseller wallet balance, verifies the bundle is available, and assigns it to the end user.

Query parameters

FieldTypeRequired
reseller_idstring (hex)Super admin only
branch_idstring (hex)Super admin only
currency_codestringOptional — preview currency (e.g. SAR)

Request body

FieldTypeRequired
bundle_codestringYes
emailstringYes
namestringYes
order_referencestringYour unique reference
whatsapp_numberstringOptional

Response (200)

FieldTypeNotes
titlestringe.g. Success
messagestringe.g. Bundle Assigned Successfully
developer_messagestringOperation Successful
response_codestringe.g. "1"
order_idstring (hex)Created order identifier
iccidstring
reseller_idstring (hex)
remaining_wallet_balancedecimalUpdated wallet balance
remaining_wallet_balance_in_additional_currencydecimal
additional_currency_codestringe.g. SAR

Other responses: 204 No Content, 403 Forbidden.

GET/Orders

Query parameters

FieldTypeRequired
order_referencestringOptional
from_datedate (YYYY-MM-DD)Optional
to_datedate (YYYY-MM-DD)Optional
searchstringOptional free-text
page_sizeintegerOptional
page_numberintegerOptional

Response (per order item)

FieldTypeNotes
order_idstring
order_referencestring
bundle_codestring
bundle_marketing_namestring
iccidstring
statusstringsuccess | failed | pending
created_atdatetime (ISO-8601)
expiry_datedatetime (ISO-8601)
amount_chargeddecimal
GET/Profile/Consumption

Query parameters

FieldTypeRequired
iccidstringEither iccid or order_id
order_idstringEither iccid or order_id

Response

FieldTypeNotes
iccidstring
profile_statusstring
profile_expiry_datedatetime (ISO-8601)
orders_balancesarray<object>Per-bundle remaining balance
orders_balances[].order_idstring
orders_balances[].bundle_codestring
orders_balances[].remaining_datainteger (MB)
orders_balances[].total_datainteger (MB)
orders_balances[].remaining_callsinteger (minutes)If applicable
orders_balances[].remaining_smsintegerIf applicable
orders_balances[].expiry_datedatetime (ISO-8601)
orders_balances[].statusstringactive | expired | depleted
Example

Assign a Bundle

Step 1 — Get bundles

Request
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.

POST /Bundle
{
  "bundle_code": "USA3GB_3102938429",
  "email": "client@hotmail.com",
  "name": "John Wick",
  "order_reference": "ORDER-10001",
  "whatsapp_number": "+33600000000"
}
200 OK
{
  "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"
}
Reference

Consumption & Order Tracking

EndpointIdentifierReturns
GET/Orders
order_reference, dates, searchOrder history across successful and failed orders.
GET/Profile/Consumption
iccid or order_idProfile-level orders_balances, profile_status, expiry, units, call/SMS flags.
Global eSIM

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.

TermDefinition
Global eSIMBundles supporting simultaneous provisioning. Multiple Global eSIM bundles, even with different roaming areas, can be assigned to the same ICCID as top-ups.
Standard eSIMTraditional bundles tied to a single coverage area. A Standard profile cannot be combined with Global eSIM bundles, and vice versa.
Profile TypeBundle/profile classification. Allowed values: GLOBAL_ESIM and STANDARD. Determined at initial provisioning and cannot be changed.
Global eSIM

Changelog Summary

EndpointChangeSummary
GET /Profile/ConsumptionNewAggregates consumption across all active orders on a profile; replaces deprecated per-order endpoint.
GET /BundlesUpdatedAdds profile_type and iccid query parameters. Response includes profile_type.
GET /CountriesUpdatedAdds profile_type and iccid query parameters for coverage filtering.
GET /RegionsUpdatedAdds profile_type and iccid query parameters for coverage filtering.
GET /OrdersUpdatedAdds global_esim query parameter. Response includes global_esim.
GET /v2/Bundles/TopupUpdatedFilters top-up bundles to match the original order profile type.
GET /Orders/ConsumptionDeprecatedReplaced by GET /Profile/Consumption.
Global eSIM

Compatibility & Migration

Reseller configuration

  • show_global_esim_bundles: false (default): fully backward compatible. Bundle, country, and region endpoints return Standard eSIM products only. Queries with profile_type=GLOBAL_ESIM return HTTP 400.
  • show_global_esim_bundles: true: enables querying and purchasing Global eSIM bundles and allows filtering with profile_type=GLOBAL_ESIM.

Adoption options

  • No changes: existing API calls continue to work and return Standard eSIM products by default.
  • Gradual adoption: read profile_type and global_esim in 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 with global_esim=true.

Recommended migration examples

Examples
GET /Bundles?profile_type=GLOBAL_ESIM
GET /Bundles?profile_type=STANDARD
GET /Profile/Consumption?iccid={iccid}
GET /Orders?global_esim=true

Deprecation notice

EndpointReplacementSunset Date
GET /Orders/ConsumptionGET /Profile/ConsumptionTBD — at least 6 months advance notice
Reference

Enums & Error Catalog

Common enums

FieldAllowed valuesDescription
profile_typeGLOBAL_ESIM / STANDARDBundle and profile classification.
order statusactive / pending / depleted / expiredCurrent plan or order status.
profile_statusactive / released / downloaded / deletedCurrent state of the eSIM profile.

Error catalog

ScenarioHTTP StatusDetail
Request GLOBAL_ESIM while feature is disabled400Feature not supported
Neither iccid nor order_id provided400At least order_id or iccid is required
Both iccid and order_id provided together400ICCID and order_id cannot be provided together
ICCID or order not found404Profile not found
Global eSIM

FAQ

Q: Do I need to change my current integration?
A: No. All changes are backward compatible. Existing API calls continue to work without modification. New features are opt-in.
Q: What is the practical difference between Global eSIM and Standard?
A: Global eSIM allows compatible bundles with same or different roaming areas to coexist on the same eSIM profile. Standard bundles remain tied to a single profile type and cannot mix with Global eSIM on the same ICCID.
Q: Can a customer combine Global eSIM and Standard bundles on one profile?
A: No. A profile is strictly categorized as either Global eSIM or Standard upon initial provisioning. Assigning a mismatched bundle returns HTTP 400.
Q: Should I migrate to /Profile/Consumption?
A: Yes — /Orders/Consumption is deprecated and will be sunset with at least 6 months notice. /Profile/Consumption is the recommended replacement.
Appendix

Key Fields Returned After Completion

FieldMeaning
activation_codeActivation code used for eSIM installation.
smdp_addressSM-DP+ address used together with activation_code.
iccidUnique eSIM profile identifier.
matching_idMatching ID used during profile provisioning.
plan_uidInternal plan unique identifier.
expiry_dateOrder or bundle expiry date returned by the platform.
profile_expiry_dateProfile-level expiry information for the eSIM.
plan_statusCurrent plan status on the profile.
remaining_wallet_balanceReseller wallet balance after transaction completion.
General

Notes & Recommendations

  • Authentication failures or permission issues are commonly returned as 401 or 403 depending on the flow.
  • Several endpoints also define 204 No Content and 400 Bad Request responses.
  • For production integration, always send and store your own order_reference so 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.