esimba.ai API Documentation (3.1.0)

Download OpenAPI specification:

E-mail: sales@esimba.ai License: Apache 2.0

Introduction

Dig into our API reference documentation and quickstarts. esimba.ai API documentation provides instructions on where to find API keys to access esimba.ai API. You’re covered with everything from the query structure and API requests with detailed explanations on receiving lists of lines and bundles that belong to your Partner Account.

esimba.ai API is a primary way to get data in and out of the esimba.ai Console. You can use esimba.ai API to control your account, view balance reports, receive a list of lines that belong to your Partner Account, change line status, receive usage data, refill lines, etc.

Overview

We have designed the esimba.ai API in a RESTful way to ensure smooth communication between the client (frontend) and the server (backend). Anytime you request a server using a REST API, you receive responses via HTTP functions described in this documentation.

What is REST API?

API stands for “Application Programming Interface.” It’s a set of rules enabling programs to talk to each other, exposing data and functionality across the Internet in a consistent format.

REST stands for “Representational State Transfer.” This architectural pattern describes how distributed systems can expose a consistent interface. When people use the term ‘REST API,’ they generally refer to an API accessed using the HTTPS protocol at a predefined set of URLs.

These URLs represent various resources — any information or content accessed at that location. Often resources have one or more methods that can be performed over HTTPS. At esimba.ai, we use GET, POST, and PUT methods.

  • GET is used to retrieve resources,
  • POST - to create resources,
  • PUT - to update resources.

Connection

esimba.ai REST API is a server over HTTPS. To ensure data privacy, unencrypted HTTP is not supported.

HTTPS uses TLS (SSL) to encrypt normal HTTP requests and responses and digitally sign those requests and responses.

HTTPS is far more secure than HTTP.

Timestamps

The server time zone is UTC.

There must be consistency across all date-related data. All requests to a server must be aligned to UTC hour boundaries.

Countries

All country entries are in ISO 3166-1 alpha-2 format.

The purpose of ISO 3166 is to define internationally recognized codes of letters and/or numbers that we can use when we refer to countries and their subdivisions.

Currency

USD is the default and the only allowed currency.

Media types

All data is sent upon a user submitting GET/POST/PUT requests with parameters through the requested URL.

Authentication

esimba.ai authenticates your API requests using your account’s API keys representing the required credentials.

Each request has to include API Credentials

Example:

curl -X GET "https://{your_link}/api/v2/lines?per_page=3&page=2" -H "apiKey: Your_apiKey" -H "accessToken: Your_accessToken"

You can find the API Keys under “API Credentials” in your account (see the image below).

API Credentials

If you cannot find your API Keys, please contact your Personal Manager.

Implement the following security measures to ensure the privacy and security of your users’ eSIM data when using esimba.ai API.

Each API request has to include API credentials, such as apiKey and accessToken, that you can find in your account. Don’t share this information with anyone. We don’t save any payment information from users. All API requests should use HTTPS URLs only.

Use standard security measures: Keep passwords/keys safe and only request API via HTTPS.

API Commands Usage

Consider the following example demonstrating API Commands usage for eSIM purchase.

  • A user selects a country within the partner’s app or platform and receives a list of bundles through the /bundles command.
  • They browse the eSIM bundles, select the desired bundles, and proceed to payment.
  • After a successful payment, the line is created using the /line/create command. The partner receives the payment, and funds are deducted from the account balance.
  • For eSIM installation, the user receives the LPA code (via the same API command), which can be transformed into a QR code.
Api Commands Usage

*The visuals presented in the document are just one example of the development of API commands. The actual implementation may vary depending on the partner’s specific requirements.

eSIM Device Compatibility Check

You can offer users the option of checking that their device supports eSIM technology before purchasing an eSIM line to avoid installation issues. This is not mandatory but rather advised. /esim_enabled_devices API command offers an up-to-date list of eSIM-enabled devices that partners can display on their platform.

eSIM Device Compatibility
  • Users can refill their line with additional data amounts when they exhaust their available data. The available refills can be seen through the command /line/{ICCID}/available_refills. Although in most cases, they are standardized.
  • Users can activate the Auto-refill feature to ensure they never run out of balance. It automatically adds data to their line when it falls below 100 MB or when the data validity expires. /line/{ICCID}/turn_on_auto_refill. command operates similarly to line creation or refilling: the chosen refill is automatically added to the specific line (via ICCID).
eSIM Device Compatibility explanation

Integration Process

For a streamlined integration of the esimba.ai API, it is recommended to develop an integration module incorporating key API commands:

This list encompasses essential commands to begin implementation. Additional API commands, though optional, can provide users with supplementary information.

Detailed descriptions of each command and comprehensive information can be found in the API documentation below.

It is advised to have an independent backend to handle requests to the esimba.ai API. Direct client application requests are discouraged to prevent exposure of the partner key.

The recommended scheme involves routing requests: mobile application >> partner API >> esimba.ai API.

If you use our Payment Gateway, you must integrate Stripe into your application and use the /get_pay_intend request for each API call.

Organizations employing payment chains must confirm payment completion before submitting /line/create and /line/{iccid}/refill requests to us.

Activation following purchase or refill is automatic; no further activation steps are required.

Making requests

Please use HTTPS requests because it’s more secure than HTTP.

HTTP Methods

Permitted HTTP methods are:

HTTP Method Description
GET The GET method requests a representation of the specified resource. Requests using GET should only retrieve data.
POST The POST method submits an entity to the specified resource, often causing a change in state or side effects on the server.
PUT The PUT method replaces all current representations of the target resource with the request payload.

Rate limit

All calls within the esimba.ai API are allotted a specific number of requests per refresh period. Each API request returns the following header information regarding rate limits and the number of requests left.

Rate limit

Depending on the endpoint you are trying to reach, it will have a specific number of allowed requests per refresh period.

Currently, we have a default API limit of 60 requests per minute. The number of remaining requests can be found in the response header named X-RateLimit-Remaining (see image above).

Status and error codes

Sometimes, your API call may generate an error. Here you will find additional information about what to expect if you don’t format your request correctly or if we fail to process your request properly.

  • 200 OK: The request was successful.
  • 401 UNAUTHORIZED: The supplied credentials are insufficient to access the resource.
  • 403 FORBIDDEN: The response status code indicates that the server understands the request but refuses to authorize it.
  • 404 NOT FOUND: Resource was not found.
  • 405 METHOD NOT ALLOWED: Resource can not be accessed with this method (GET, POST, etc.)
  • 500 SERVER ERROR: Representation could not be returned due to an internal server error
  • 503 SERVICE UNAVAILABLE: Representation can not be returned due to a temporary service outage.

Formatting Your Request

Accept Header

The API provides JSON responses and requires the accept header. The API uses application/json.

curl -X GET "https://{your_link}/api/v2/lines?page=1&per_page=25" -H "accept: application/json" -H "apiKey: Your_apiKey" -H "accessToken: Your_accessToken"
Request Body

When submitting data to a resource via POST or PUT, you must submit your payload in JSON.

Examples:

GET

curl -L -X GET "https://{your_link}/api/v2/lines" -H "apiKey: Your_apiKey" -H "accessToken: Your_accessToken" -H "Content-Type: application/json" --data-raw "{
  "per_page": 3,
  "page": 2
}"

POST

curl -L -X POST "https://{your_link}/api/v2/line/create"
-H "apiKey: Your_apiKey"
-H "accessToken: Your_accessToken"
-H "Content-Type: application/json"
--data-raw "{
  "refill_mb": 1024,
  "refill_days": 7,
  "bundle_id": 13
}"

PUT

curl -L -X PUT "https://{your_link}/api/v2/line/8934071179000613677/update_notes"
-H "apiKey: Your_apiKey"
-H "accessToken: Your_accessToken"
-H "Content-Type: application/json"
--data-raw "{
  "notes": "updated notes"
}"

Pagination

You can get paginated results (e.g., you can get the first 25 elements, the second 25 elements, etc.). All details can be found in the request section.

Below is a basic example of sending a request to get paginated results.

curl -X GET "https://{your_link}/api/v2/lines?page=1&per_page=25" -H "apiKey: Your_apiKey" -H "accessToken: Your_accessToken" -H "accept: application/json"

Successful Requests

Below is a general overview of what resource objects return with successful API requests.

HTTP Verb Resource object returned
GET Returns a single resource object or array of resource objects
PUT Returns the updated resource object
POST Returns the newly created resource object

Webhooks

Webhooks are a convenient way to keep track of line usage and changes in the status of your esimba.ai lines.

You can subscribe to events for your products and payments by activating webhooks that will push notifications to a given URL.

We use HTTPS to send notifications about selected events.

Here is how esimba.ai webhooks work:

  • The partner can choose events about which webhooks will be sent;
  • When certain events occur, webhooks are sent to the partner;
  • Data in webhooks of different events is different;
  • The partner can specify the URL to which webhooks will be sent to respond to changes;
  • The partner can change the URL to which webhooks will be sent;
  • The partner can remove the URL to which webhooks were sent to stop receiving them;
  • The partner can view the entire list of webhooks sent to them and their responses;
  • A webhook is considered delivered if it receives status 200 in response;
  • The undelivered webhook is not resubmitted.

Webhook Signature Verification

To ensure the authenticity of incoming webhook requests, each payload includes a cryptographic signature in the X-Keepgo-Signature header. You can validate this signature to confirm the request originates from Keepgo.

Set Secret Key

At myaccount, in the User Profile menu, choose Webhooks > Create a Secret Key.

Webhooks Secret Key

Signature Header

The server sends the signature in the X-Keepgo-Signature header.

Example (Http):

X-Keepgo-Signature: "abc123...xyz456" 

Signature Generation

The signature is computed as (PHP):

$signature = base64_encode(hash_hmac("sha256", $rawPayload, $secretKey, true));

Where:
$rawPayload = Raw request body (JSON string).
$secretKey = Your webhook`s secret key (provided during setup).

Verification Steps

  1. Extract the X-Keepgo-Signature from the request headers.
  2. Recompute the signature using the received payload and your secret key.
  3. Compare the computed signature with the header value. If they match, the request is valid.

Example (PHP):

$receivedSignature = $_SERVER["HTTP_X_KEEPGO_SIGNATURE"];
$rawPayload = file_get_contents("php://input"); // Raw JSON body
$secretKey = "xxxxxxxxxxx"; // Your secret key here, should be kept secure
$signature = base64_encode(hash_hmac("sha256", $rawPayload, $secretKey, true));
if (hash_equals($receivedSignature, $signature)) {
  // Valid request
}
    

Steps to receive webhooks

You can start receiving event notifications using the steps described below.

  • 1. Specify the URL to which webhooks will be sent.

    You can enable/disable and change URL for webhooks in your Partner Account.

    Please contact your Personal Manager if you need help with the webhooks setup.
  • 2. Select the events you want to be notified about.

    The webhook events we currently support are listed in the table below.

    Name Description
    simcard.usage.changed Occurs when the Line’s usage changes.
    stripe.paymentIntent.succeeded Partners who’ve integrated esimba.ai Payment Gateway can use this webhook event to receive notifications when the status of PaymentIntent changes.
    simcard.usage.low_data Occurs when the Line’s usage equals or falls below 100 MB.
    bundle.added Occurs when a bundle is added to the platform.
    bundle.removed Occurs when a bundle is removed from the platform.

    simcard.usage.changed webhook example:

    {
      "event": "simcard.usage.changed",
      "timestamp": "2025-06-09T07:36:09.618973Z",
      "data": 
      {
        "iccid": "12345678902116678",
        "deactivation_date": "",
        "allowed_usage_kb": 1048576,
        "remaining_usage_kb": 1048576,
        "remaining_days": null,
        "status": "Registered",
        "data_bundles": [ 
          {
              "id": 14,
              "status": "Non-active",
              "allowed_usage_kb": 1048576,
              "active_kb": 0,
              "remaining_usage_kb": 1048576,
              "validity": 7,
              "assigned_at": "2022-09-22 23:17:27",
              "activated_at": null,
              "terminated_at": null,
              "expire_at": null
          }
        ] 
      }
    }
    

    simcard.usage.low_data webhook example:

    {
      "event": "simcard.usage.low_data",
      "timestamp": "2025-06-09T07:36:09.618973Z",
      "data":
      {
        "iccid": "12345678902116678",
        "user_email": "some-email@example.com",
        "remaining_data_mb": 90.23,
        "remaining_mb_threshold": 100
      }
    }
    

    Notes:

    • The user_email field is optional and may not be present.
    • It appears only if the SIM line is assigned to an end user.
    • This is the end user’s email address, not the partner’s.

    bundle.added webhook example:

    {
      "event": "bundle.added",
      "timestamp": "2025-06-09T06:55:15.069936Z",
      "data": { 
        "bundle": {
            "id": 352,
            "name": "Octans",
            "description": "LATAM eSIM: 17 countries, Claro coverage in most places",
            "bundle_type": "regional",
            "coverage": [
                "Argentina",
                ...,
                "Uruguay"
            ],
            "refills": [
                {
                    "title": "1 GB",
                    "amount_mb": 1024,
                    "price_usd": 28
                },
                ...,
                {
                    "title": "50 GB",
                    "amount_mb": 51200,
                    "price_usd": 725
                },
            ],
            "privacy_ip": "Netherlands",
            "networks": [
                {
                    "title": "Argentina",
                    "local_networks": [
                        "Claro"
                    ],
                    "flag": "https://{your_link}/img/flags/3x2/ar.svg"
                },
                ...,
                {
                    "title": "Uruguay",
                    "local_networks": [
                        "Claro"
                    ],
                    "flag": "https://{your_link}/img/flags/3x2/uy.svg"
                }
            ]
        }
      }
    }
    

    bundle.removed webhook example:

    {
      "event": "bundle.removed",
      "timestamp": "2025-06-09T06:55:15.069936Z",
      "data": { 
        "bundle": {
            "id": 352,
            "name": "Octans",
            "description": "LATAM eSIM: 17 countries, Claro coverage in most places",
            "bundle_type": "regional",
            "coverage": [
                "Argentina",
                ...,
                "Uruguay"
            ],
            "refills": [
                {
                    "title": "1 GB",
                    "amount_mb": 1024,
                    "price_usd": 28
                },
                ...,
                {
                    "title": "50 GB",
                    "amount_mb": 51200,
                    "price_usd": 725
                },
            ],
            "privacy_ip": "Netherlands",
            "networks": [
                {
                    "title": "Argentina",
                    "local_networks": [
                        "Claro"
                    ],
                    "flag": "https://{your_link}/img/flags/3x2/ar.svg"
                },
                ...,
                {
                    "title": "Uruguay",
                    "local_networks": [
                        "Claro"
                    ],
                    "flag": "https://{your_link}/img/flags/3x2/uy.svg"
                }
            ]
        }
      }  
    }
    
  • 3. Receive a response object.

    Your Webhook URL should return a response with HTTP status code 200. Any other HTTP response code will be treated as a failure.

Lines

Get a list of Lines

A line is an eSIM profile with an activation code. Each line has a bundle. Every Partner’s account may have lines of any bundle type.

A line can belong only to one account at a given time. Each line has a unique ICCID of 19 to 20 characters, Privacy IP location, Countries & Networks coverage, APN settings, line status, and special notes.

Lifetime and Travel line statuses:
  1. Registered - the line is ready for operation but has never been used (without usage)
  2. Activated - the line’s usage has started (the first usage has been recorded)
  3. Deactivated - the line is turned off (either by force, upon reaching expired at, or when the balance is over)

Please note that the line status isn’t the same as the bundle status, but it can be a function of the bundle statuses.

Mind that the line status isn’t the same thing as the bundle status. But the line status can be a function of the bundle statuses.

Use: This request returns a list of lines belonging to the account, their configuration, and running parameters, including data usage, rate plan, billing cycle, count of data, and any notes they may have.

Note:

The API command /lines with pagination or /lines/filter_data with specific filters can list all lines with details.

The command /line/{iccid}/get_details can be used for information regarding a specific line.

Usage statistics are not directly provided through the API; only the current value of remaining usage is available. Additional usage information and billing details can be obtained through the /line/{iccid}/transactions command upon request.

Authorizations:
(ApiKeyAccessToken)
query Parameters
page
integer
Default: 1
per_page
integer
Default: 25

Responses

Response samples

Content type
application/json
{
  • "ack": "success",
  • "sim_cards": {
    }
}

Get a list of filters

Use: This request receives a list of possible Line statuses (Registered, Activated, Deactivated) and auto refill status IDs for filtering purposes in other API requests.

Authorizations:
(ApiKeyAccessToken)

Responses

Response samples

Content type
application/json
{
  • "ack": "success",
  • "filters": {
    }
}

Get line details

Use: This request receives details for the specific Line, including Line’s usage, remaining data/days, auto refill info, currency, etc.

FAQ

1. What is a "deactivation_date"?

The "deactivation_date" is a date when the line will be automatically deactivated in the future. There is also an option to set the past date. In this case, the line will be immediately deactivated.

Authorizations:
(ApiKeyAccessToken)
path Parameters
iccid
required
string

iccid

Responses

Response samples

Content type
application/json
{
  • "ack": "success",
  • "sim_card": {
    }
}

Get available refills

Use: This request receives a list of available refills for a Line. It displays such values as the amount of data, price (in USD and EUR), and the number of days for all available refills for the chosen iccid.

FAQ

1. Is it better to display available refills based on /line/{iccid}/available_refills or /bundles/{id} refills[*]?

It's better to display refills to the user based on available refills for a specific line. The request is faster completed using the /line/{iccid}/available_refills command.

Both /line/{iccid}/available_refills and /bundles/{id} have the same refills. It is better and faster to find the available top-ups for a specific line using /line/{iccid}/available_refills.

Authorizations:
(ApiKeyAccessToken)
path Parameters
iccid
required
string

iccid

Responses

Response samples

Content type
application/json
{
  • "ack": "success",
  • "available_refills": [
    ]
}

Get transactions

Use: This request receives a list of cash transactions by iccid, including the date of the transaction, refill amount, payment method (balance or card), transaction ID, status, and the reason for the transaction.

Authorizations:
(ApiKeyAccessToken)
path Parameters
iccid
required
string

iccid

Responses

Response samples

Content type
application/json
{
  • "ack": "success",
  • "transactions": {
    }
}

Get audit logs

Use: This request receives an audit log and system actions for the specific Line, including action performed, prior value, current value, and username of a person or entity acting.

Authorizations:
(ApiKeyAccessToken)
path Parameters
iccid
required
integer <int64>

iccid

Responses

Response samples

Content type
application/json
{
  • "ack": "success",
  • "audit_logs": {
    }
}

Create a line

Use this endpoint to create a new line. The request requires parameters such as refill_mb, bundle_id or filters, and optionally refill_days and count.

Parameters

  • refill_mb (required):
    Specifies the size of the refill in megabytes. Must match one of the available refills for a bundle, as defined in the /bundles or /bundles/{id} endpoints.

  • refill_days:
    Required only for Travel bundles. If provided with a Lifetime bundle, it will be ignored.

  • bundle_id:
    Directly identifies the bundle. If provided, filters will be ignored.

  • filters:
    Used when bundle_id is not provided. Filters include:

    • country_code (e.g., "US", "FR")
    • type ("travel" or "lifetime")
    • preference (optional: "fastest", "cheapest", "default")

    If no preference is specified:

    • The default bundle will be used if available.
    • If not, the fastest bundle will be selected.
  • count:
    Optional. Number of lines to create. Default is 1. Max is 1000.

Use: This request is used to create a Line. The request body must include: - refill_mb – required - Either bundle_id or filters – at least one is required - refill_days – required only for Travel bundles - count – optional (default: 1, max: 1000)

FAQ

1. Is the "refill_mb" a required parameter?
Yes, refill_mb is required. It defines the data amount of the selected refill and must match one of the available refill options in the selected bundle.

1.1. Where can the "refill_mb" parameter be found?
You can find valid refill_mb values by using the GET /bundles or GET /bundles/{id} endpoints. Each bundle includes a list of available refills.

1.2. Is the "count" a required parameter?
No, count is optional. It specifies how many lines to create. If omitted, the default value is 1. The maximum allowed value is 1000.

2. What is "refill_mb" needed for?
The refill_mb parameter is required to determine which lpa_code (eSIM profile) to issue. When creating a line, you must include:

  • refill_mb: the desired data amount and either:
  • bundle_id: to select a bundle directly, or
  • filters: to find a suitable bundle based on country/type/preference
Without specifying refill_mb, it is not possible to issue a line.

3. What are the maximum lengths of "qr_code" and "lpa_code"?
Both qr_code and lpa_code can be up to 191 characters in length. Typically, the actual codes are shorter, but this is the maximum supported limit.

4. How to connect the products/bundles I have in my account to the client management system we are building?
Our API is designed to help you activate and refill eSIMs and integrate available bundles from your account into your client management system. To achieve this, use: These endpoints support full integration with external systems or CMS platforms.

5. As a developer integrating purchased bundles and a payment gateway into a website, how can the API help?
Our API supports integration with both standard and custom workflows, allowing purchased bundles to be activated via POST /line/create. Integration steps typically include: Even if your CMS does not support direct API requests, you can use middleware platforms (like Zapier) to bridge the connection. Crypto payment gateways can also be integrated, just trigger the API after confirming the payment on-chain or via webhook.
Authorizations:
(ApiKeyAccessToken)
Request Body schema: application/json
required
One of
refill_mb
required
integer <int64>

Specifies the size of the refill in megabytes. Required. Must match one of the available refills for a bundle, as defined in the /bundles or /bundles/{id} endpoints.

refill_days
integer <int64>

Only required for Travel bundles. If provided with a Lifetime bundle, this value will be ignored.

bundle_id
required
integer <int64>

If provided, this ID will be used to locate the bundle directly. In this case, any provided filters will be ignored.

object

Alternative to bundle_id. Used to identify the appropriate bundle based on:

  • country_code: 2-letter ISO country code (e.g., "US", "FR")
  • type: "travel" or "lifetime"
  • preference (optional): "fastest", "cheapest", or "default" (default behavior is used if omitted) If preference is omitted:
  • The system will use a default bundle if available for the specified country.
  • If no default is set, the fastest bundle will be selected.
count
integer [ 1 .. 1000 ]
Default: 1

Specifies how many lines to create. Default is 1, maximum is 1000.

Responses

Request samples

Content type
application/json
Example
{
  • "refill_mb": 1024,
  • "refill_days": 7,
  • "bundle_id": 2,
  • "count": 3
}

Response samples

Content type
application/json
{
  • "ack": "success",
  • "sim_card": {
    },
  • "data_bundle_id": 356
}

Refill line

Use: This request is used to refill the Line with a certain amount of data for a specific period (number of days).

FAQ

1. Do the ’amount_mb’ and ’amount_days’ parameters in the >/line/{iccid}/refill command need to match values retrieved from the /bundles command?

Yes, the ’amount_mb’ and ’amount_days’ parameters in the >/line/{iccid}/refill command must match the corresponding values obtained from the /bundles command. Ensuring consistency between these parameters is crucial for accurate and effective eSIM refills.

Authorizations:
(ApiKeyAccessToken)
path Parameters
iccid
required
string

iccid

Request Body schema: application/json
required

Amount in MB

amount_mb
integer
amount_days
integer or null

Responses

Request samples

Content type
application/json
{
  • "amount_mb": 0,
  • "amount_days": 0
}

Response samples

Content type
application/json
{
  • "ack": "success",
  • "data_bundle_id": 367,
  • "transaction_id": "AB_32321_42"
}

Update notes

Use: This request is used to update the notes of the Line. The request body is the required parameter. Using notes, you can bring more order to how lines are displayed on your platform and easily find the required line based on the notes attached.

Authorizations:
(ApiKeyAccessToken)
path Parameters
iccid
required
string

iccid

Request Body schema: application/json
required

Notes

notes
string

Responses

Request samples

Content type
application/json
{
  • "notes": "My ESIM #1"
}

Response samples

Content type
application/json
{
  • "ack": "success"
}

Update deactivation date

Use: This request is used to update the deactivation date of the Line. The deactivation_date is the date when the line will be automatically deactivated in the future. If deactivation_date is set as a past date, the line will be deactivated.

Authorizations:
(ApiKeyAccessToken)
path Parameters
iccid
required
string

iccid

Request Body schema: application/json
required

format Y-m-d

deactivation_date
string

Responses

Request samples

Content type
application/json
{
  • "deactivation_date": "2022-12-25"
}

Response samples

Content type
application/json
{
  • "ack": "success"
}

Turn ON auto refill

Use: This request is used to turn on Auto-Refill for the Line.

For Travel lines, the 'amount_mb' and 'amount_days' parameters must correspond to the number of megabytes and days from the available refills for your line (use /line/{iccid}/available_refills to select the appropriate refill option for Auto-Refill). There is no need to transfer the number of days for Lifetime lines.

The 'bill_protect_amount' parameter - contains the maximum amount that will be spent using the Auto-Refill. The maximum spending limit will not be set if this parameter is not passed or the value is 0.

To set a new billing protection amount - send a request to enable the Auto-Refill with 'amount_mb', 'amount_days' and a new billing protection amount.

To reset the amount spent as part of the billing protection - send a command to turn off the Auto-Refill, and then a command to turn it on.

Authorizations:
(ApiKeyAccessToken)
path Parameters
iccid
required
string

iccid

Request Body schema: application/json
required

Amount in MB. Bill protection in USD

amount_mb
integer
amount_days
integer or null
bill_protect_amount
number or null

Responses

Request samples

Content type
application/json
{
  • "amount_mb": 0,
  • "amount_days": 0,
  • "bill_protect_amount": 0
}

Response samples

Content type
application/json
{
  • "ack": "success",
  • "message": "Auto-refill was turned ON"
}

Turn OFF auto refill

Use: This request is used to turn off the Auto-Refill for the Line.

Authorizations:
(ApiKeyAccessToken)
path Parameters
iccid
required
string

iccid

Responses

Response samples

Content type
application/json
{
  • "ack": "success",
  • "message": "Auto-refill was turned OFF"
}

Add plan to pSIM line

Use: Configures an unconfigured physical SIM line (already assigned to a partner) with a selected plan (bundle_id).

If amount_mb is provided, the line is immediately topped up using the partner’s balance.

This command is applicable only to physical SIM lines (pSIM).

Important:

  • Use GET /bundles with product_type: pSIM to retrieve valid bundle options.

Authorizations:
(ApiKeyAccessToken)
path Parameters
iccid
required
string

iccid

query Parameters
bundle_id
required
integer

The ID of the plan to be assigned. Retrieved via GET /bundles using product_type: pSIM.

amount_mb
integer

Optional data top-up amount (in MB) from refill list. If present, the SIM is refilled immediately after configuration.

Responses

Response samples

Content type
application/json
{
  • "ack": "success",
  • "message": "Action has been successfully completed. Changes will appear in a few seconds"
}

Product Types

Get a list of product types

Product type is a property of a bundle. We currently provides two product types - Lifetime and Travel - with different operation logics. You can add lines on both Lifetime and Travel product types to one account. Each product type comes with a set of bundles. One Line can belong to one product type.

  • Lifetime The Lifetime product offers data bundles with no expiration. When you check the remaining data validity, it will always display "365", but the data itself has no expiration.
  • Travel product type offers short-term and long-term bundles, mostly used in the travel industry. These bundles have a limited number of megabytes and a validity period. They are activated on the first usage.

Use: This request receives a list of all product types from the Console. Currently, it includes Lifetime and Travel product types.

Authorizations:
(ApiKeyAccessToken)

Responses

Response samples

Content type
application/json
{
  • "ack": "success",
  • "product_types": [
    ]
}

Account Balance

Get current account balance

Use: This request returns the financial sum available within a partner’s account in the platform. It represents the current amount of funds that a partner has at their disposal for conducting transactions.

Authorizations:
(ApiKeyAccessToken)

Responses

Response samples

Content type
application/json
{
  • "ack": "success",
  • "account_balance": "8.63"
}

Bundles

Get a list of bundles

Use: This request reveals a list of Global/Regional/Country data bundles from the Console that you can use in your account. It reveals the bundle’s names, descriptions, coverage, and available refills.

Each bundle is defined by the locations where the line can be used, the data allowance, the period this data is valid, APN settings, data breakout, etc. You can have different bundles in one account

The bundles list is provided in response to the /line/{iccid}/get_details request. Only those bundles that belong to a specific line may have the following statuses:

  • Non-active - the bundle is not active until the customer makes the first usage of the bundle’s data;
  • Active - when the customer is using the bundle’s data;
  • Finished — if customer used all data of the bundle (before expiration)
  • Expired - if days were expired (before used all data);
  • Configuring - if the purchased data bundle is in the configuring process.
Authorizations:
(ApiKeyAccessToken)

Responses

Response samples

Content type
application/json
{
  • "ack": "success",
  • "bundles": [
    ]
}

Get bundle

Use: This request reveals a specific bundle from Console that you can use in your Partner Account. It reveals the bundle’s name, type (Global/Regional/Country), description, coverage, and available refills.

FAQ

1. Can a bundle change after it’s already created?

Once a bundle is created, coverage may change (countries and operators may be added or removed, the notification will be sent in advance) or refill prices. In this case, the existing bundle will be changed.

Authorizations:
(ApiKeyAccessToken)
path Parameters
id
required
integer <int64>

Bundle ID

Responses

Response samples

Content type
application/json
{
  • "ack": "success",
  • "bundle": [
    ]
}

Transactions

Get a list of transactions

Every line that belongs to the Partner Account comes with a list of cash transactions, offering the entire history of refills, including the refill amount, date and time, payment method, transaction ID, and status.

Use: This request reveals a list of transactions referred to a specific Line belonging to your account and integrates them into your platform.

The required parameters include:

Authorizations:
(ApiKeyAccessToken)
query Parameters
sort_field
string
Example: sort_field=/transactions?sort_field=refill_amount_mb

Choose field from transaction structure

sort_order
string
Example: sort_order=desc

asc or desc (default: desc)

common_filter
string
Example: common_filter=/transactions?common_filter=00614433

Filter transactions by common filter

Responses

Response samples

Content type
application/json
{
  • "ack": "success",
  • "transactions": {
    }
}

Network Providers

Get a list of network providers

Every bundle works on one or several network providers in the countries/regions where it provides coverage. The list of network providers is an attribute of a bundle.

/network_providers is generally all the operators that we have in some bundles

Contact your Personal Manager if you require a specific network that is not provided by default.

Use: The /network_providers request reveals a list of all operators we have in bundles.

Authorizations:
(ApiKeyAccessToken)

Responses

Response samples

Content type
application/json
{
  • "ack": "success",
  • "network_providers": {
    }
}

Countries / Regions

Get a list of countries

The list of countries is an attribute of a bundle. Every bundle provides coverage services that are only available in certain countries.

Using the /countries command, you get all countries issued in general, without reference to bundles.

Use: The request returns a list of country names exactly as they appear on the Console.

Authorizations:
(ApiKeyAccessToken)

Responses

Response samples

Content type
application/json
{
  • "ack": "success",
  • "countries": {
    }
}

Get a list of regions

The list of regions is an attribute of a bundle. Every bundle provides coverage services that are only available in certain regions.

Use: The request reveals a list of all regions where products have coverage.

Authorizations:
(ApiKeyAccessToken)

Responses

Response samples

Content type
application/json
{
  • "ack": "success",
  • "regions": {
    }
}

eSIM devices

Get a list of eSIM enabled devices

eSIMs don’t work on devices that do not support the technology. To make it easier for your customers to determine if the eSIM is compatible with their devices, we provide a regularly updated list of eSIM devices where eSIM bundles can be installed.

Use: This request receives a list of eSIM-enabled devices compatible with eSIM bundles.

Authorizations:
(ApiKeyAccessToken)

Responses

Response samples

Content type
application/json
{
  • "ack": "success",
  • "data": [
    ]
}