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.status.changed Occurs when the Line’s status is changed.

    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,
        "remaining_voice_seconds": null,
        "remaining_sms_count": null,
        "status": "Registered",
        "data_bundles": [
          {
              "id": 14,
              "status": "Non-active",
              "allowed_usage_kb": 1048576,
              "active_kb": 0,
              "remaining_usage_kb": 1048576,
              "allowed_voice_seconds": 3600,
              "active_voice_seconds": 0,
              "remaining_voice_seconds": 3600,
              "allowed_sms_count": 50,
              "active_sms_count": 0,
              "remaining_sms_count": 50,
              "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,
                    "voice_minutes": null,
                    "sms_count": null,
                    "price_usd": 28
                },
                ...,
                {
                    "title": "50 GB",
                    "amount_mb": 51200,
                    "voice_minutes": null,
                    "sms_count": null,
                    "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"
                }
            ],
            "kyc_required": false
        }
      }
    }
    

    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,
                    "voice_minutes": null,
                    "sms_count": null,
                    "price_usd": 28
                },
                ...,
                {
                    "title": "50 GB",
                    "amount_mb": 51200,
                    "voice_minutes": null,
                    "sms_count": null,
                    "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"
                }
            ],
            "kyc_required": false
        }
      }
    }
    

    simcard.status.changed webhook example:

    {
        "event": "simcard.status.changed",
        "timestamp": "2025-10-06T08:55:19.329856Z",
        "data": {
          "iccid": "12345678902116678",
          "oldStatus": "Registered",
          "currentStatus": "Activated"
        }
      }
    
  • 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.

Sandbox

The sandbox is a separate environment for building and testing your integration without real money, real lines or real mobile operators. It runs the same API as production, so the code you write against the sandbox works in production unchanged — only the address and the API credentials differ.

Getting started

Register a partner account at https://myaccount.sandbox.keepgo.com/partner/register and take the API Key and Access Token from “API Credentials” in the sandbox console. Production credentials do not work in the sandbox, and sandbox credentials do not work in production.

A new sandbox account comes with a test balance, so you can buy lines and refills right away.

How the sandbox differs from production

  • Lines are not real. ICCIDs, activation codes and QR codes are generated by the sandbox. A sandbox eSIM profile cannot be installed on a device.
  • The catalogue is a copy of production. Bundles, countries and regions are the same as in production. Line stock is replenished every hour, so an “out of stock” answer can still happen and is worth handling.
  • Operator answers come with a delay. The mobile operator is simulated and answers a few seconds (about 5) after a line is created or refilled, so a new package is first reported as “Configuring” and becomes available after that.
  • Traffic is not spent on its own. Nobody uses sandbox lines, so data usage appears only when you simulate it with the request described below.
  • Webhooks are delivered. Set a webhook URL in the sandbox console to receive events exactly as in production.
  • Nothing else leaves the sandbox. Emails and push notifications are not sent. SMS and other commands addressed to the operator are accepted but have no effect.

Simulating data usage

This request exists only in the sandbox. In production the same path returns 404.

POST /api/v2/sandbox/line/{iccid}/simulate_usage

Spends data on one of your sandbox lines as if the line had been used. The line changes the way it would after real traffic — the package becomes active and its remaining data goes down — and the same usage webhooks as for real traffic are sent (for example, simcard.usage.changed).

Authentication: the same apiKey and accessToken headers as every other request.

Path parameter:

  • iccid (string, required) — ICCID of a line that belongs to your account.

Request body (JSON):

  • used_mb (integer, required) — how much data to spend, in megabytes, from 1 to 1048576.

Example:

curl -L -X POST "https://myaccount.sandbox.keepgo.com/api/v2/sandbox/line/8910300000000000001/simulate_usage" \
  -H "apiKey: Your_apiKey" \
  -H "accessToken: Your_accessToken" \
  -H "Content-Type: application/json" \
  -d '{"used_mb": 500}'

Responses:

200 — the data was spent. used_mb is how much was actually taken off the line:

{
  "ack": "success",
  "used_mb": 500
}

On a travel line packages are used up one after another, and no more can be spent than the line has left, so used_mb can be smaller than requested. On a Lifetime line the whole requested amount is spent.

400 — used_mb is missing or out of range, or the line is not found or does not belong to your account. reason says which:

{
  "ack": "fail",
  "reason": "SIM card not found"
}

401 — the API credentials are missing or wrong.

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.
  • voice_minutes: Optional. Voice minutes to select a matching refill that includes voice allowance. Must match one of the available refills for the bundle. Omit or pass null for data-only lines.
  • sms_count: Optional. SMS count to select a matching refill that includes SMS allowance. Must match one of the available refills for the bundle. Omit or pass null for data-only lines.

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, currently max: 1)
  • voice_minutes – optional, for voice-enabled refills
  • sms_count – optional, for SMS-enabled refills


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.

6. When should I use /line/create vs /line/create_async?
Use /line/create for most bundle types - it creates lines synchronously and returns the result immediately. Use /line/create_async for bundles that require additional processing time (like unlimited plans). This endpoint returns a `request_id` immediately, which you can use to poll for results via /request/{requestId}. If you try to create an async-only bundle using /line/create, you'll receive an error message directing you to use /line/create_async instead.
Authorizations:
(ApiKeyAccessToken)
query Parameters
refill_mb
required
integer

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

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

bundle_id
integer

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

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

voice_minutes
integer or null <int64>

Optional. Voice minutes to select a matching refill that includes voice allowance. Must match one of the available refills for the bundle. Omit or pass null for data-only lines. If this plan has unlimited voice/SMS, this parameter is optional and ignored — the plan is always treated as unlimited regardless of the value passed (including null or -1). For finite plans, pass a non-negative integer matching an available refill.

sms_count
integer or null <int64>

Optional. SMS count to select a matching refill that includes SMS allowance. Must match one of the available refills for the bundle. Omit or pass null for data-only lines. If this plan has unlimited voice/SMS, this parameter is optional and ignored — the plan is always treated as unlimited regardless of the value passed (including null or -1). For finite plans, pass a non-negative integer matching an available refill.

Request Body schema: application/json
required
One of
refill_mb
required
integer <int64>

Required. Size of the refill in megabytes. Must match an available refill in a bundle.

refill_days
integer <int64>

Only required for Travel bundles.

bundle_id
required
integer <int64>

Directly identify the bundle to be used. If provided, filters are ignored.

object

Alternative to bundle_id. Defines criteria to find a bundle.

count
integer [ 1 .. 1000 ]
Default: 1

Number of lines to create. Default is 1, max is 1000.

voice_minutes
integer or null <int64>

Optional. Voice minutes to select a matching refill that includes voice allowance. Must match one of the available refills for the bundle. Omit or pass null for data-only lines. If this plan has unlimited voice/SMS, this parameter is optional and ignored — the plan is always treated as unlimited regardless of the value passed (including null or -1). For finite plans, pass a non-negative integer matching an available refill.

sms_count
integer or null <int64>

Optional. SMS count to select a matching refill that includes SMS allowance. Must match one of the available refills for the bundle. Omit or pass null for data-only lines. If this plan has unlimited voice/SMS, this parameter is optional and ignored — the plan is always treated as unlimited regardless of the value passed (including null or -1). For finite plans, pass a non-negative integer matching an available refill.

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
}

Create a line (asynchronous)

Use this endpoint to create a new line asynchronously. This endpoint is designed for bundles that require additional processing time, such as unlimited plans or other special bundle types.

How it works

  1. Submit a line creation request with the same parameters as /line/create
  2. Receive a request_id in the response immediately
  3. Use the request_id with the GET /request/{requestId} endpoint to check the status and retrieve results


When to use this endpoint

  • For unlimited plans and bundles requiring asynchronous processing
  • When /line/create returns an error suggesting to use `/line/create_async`
  • For bundles marked with async processing in the /bundles list (use `with_async=true` parameter)


Parameters

All parameters are identical to /line/create:

  • refill_mb: Required only for Travel and Lifetime bundles. Specifies the size of the refill in megabytes. Must match one of the available refills for a bundle.
  • refill_days: Required only for Travel or Unlimited bundles. Ignored for Lifetime bundles.
  • bundle_id: Directly identifies the bundle. If provided, `filters` will be ignored.
  • filters: Used when `bundle_id` is not provided. Includes `country_code`, `type`, and optional `preference`.
  • count: Optional. Number of lines to create. Default is 1, maximum is 20.
  • add_in_inventory: Optional. If true, lines are added to inventory instead of being assigned to the account.
  • voice_minutes: Optional. Voice minutes to select a matching refill that includes voice allowance. Must match one of the available refills for the bundle. Omit or pass null for data-only lines.
  • sms_count: Optional. SMS count to select a matching refill that includes SMS allowance. Must match one of the available refills for the bundle. Omit or pass null for data-only lines.


Response

Returns a `request_id` that can be used to poll the request status via GET /request/{requestId}.

Authorizations:
(ApiKeyAccessToken)
query Parameters
refill_mb
integer

Only required for Travel or Lifetime bundles. Specifies the size of the refill in megabytes. Must match one of the available refills for a bundle.

refill_days
integer

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

bundle_id
integer

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, type, and preference.

count
integer [ 1 .. 20 ]
Default: 1

Number of lines to create. Default is 1, maximum is 20.

add_in_inventory
boolean
Default: false

If true, created lines will be added to inventory instead of being assigned to the account.

voice_minutes
integer or null <int64>

Optional. Voice minutes to select a matching refill that includes voice allowance. Must match one of the available refills for the bundle. Omit or pass null for data-only lines. If this plan has unlimited voice/SMS, this parameter is optional and ignored — the plan is always treated as unlimited regardless of the value passed (including null or -1). For finite plans, pass a non-negative integer matching an available refill.

sms_count
integer or null <int64>

Optional. SMS count to select a matching refill that includes SMS allowance. Must match one of the available refills for the bundle. Omit or pass null for data-only lines. If this plan has unlimited voice/SMS, this parameter is optional and ignored — the plan is always treated as unlimited regardless of the value passed (including null or -1). For finite plans, pass a non-negative integer matching an available refill.

Request Body schema: application/json
required
One of
refill_mb
required
integer <int64>

Required. Size of the refill in megabytes.

refill_days
integer <int64>

Only required for Travel bundles.

bundle_id
required
integer <int64>

Directly identify the bundle. If provided, filters are ignored.

object

Alternative to bundle_id.

count
integer [ 1 .. 1 ]
Default: 1

Number of lines to create.

add_in_inventory
boolean
Default: false

Add lines to inventory instead of assigning to account.

voice_minutes
integer or null <int64>

Optional. Voice minutes to select a matching refill that includes voice allowance. Must match one of the available refills for the bundle. Omit or pass null for data-only lines. If this plan has unlimited voice/SMS, this parameter is optional and ignored — the plan is always treated as unlimited regardless of the value passed (including null or -1). For finite plans, pass a non-negative integer matching an available refill.

sms_count
integer or null <int64>

Optional. SMS count to select a matching refill that includes SMS allowance. Must match one of the available refills for the bundle. Omit or pass null for data-only lines. If this plan has unlimited voice/SMS, this parameter is optional and ignored — the plan is always treated as unlimited regardless of the value passed (including null or -1). For finite plans, pass a non-negative integer matching an available refill.

Responses

Request samples

Content type
application/json
Example
{
  • "refill_days": 30,
  • "bundle_id": 352,
  • "count": 1
}

Response samples

Content type
application/json
{
  • "ack": "success",
  • "request_id": "550e8400-e29b-41d4-a716-446655440000"
}

Get async request result

Use this endpoint to check the status and retrieve results of an asynchronous line creation request initiated via /line/create_async.

Request Status Values

  • processing: The request is being processed. Result is not yet available.
  • completed: The request has been completed. Result contains a typed result envelope with created SIM cards.


Usage Pattern

  1. Create a line using POST /line/create_async and receive a `request_id`
  2. Poll this endpoint with the `request_id` to check status
  3. When status is `completed`, the `result` field will contain a typed envelope with `type`, `sim_cards` array, and `transaction_id`


Important Notes

  • There is no time limit for requesting results - `request_id` does not expire
  • The `result.sim_cards` field is always an array, even for single eSIM orders
  • If the line creation failed, the result will contain error details
Authorizations:
(ApiKeyAccessToken)
path Parameters
requestId
required
string
Example: 550e8400-e29b-41d4-a716-446655440000

The unique request identifier returned by /line/create_async

Responses

Response samples

Content type
application/json
Example
{
  • "ack": "success",
  • "request_id": "550e8400-e29b-41d4-a716-446655440000",
  • "status": "processing",
  • "result": null
}

Refill line

Use: This request is used to refill the Line with a certain amount of data for a specific period (number of days), optionally including voice minutes and SMS allowance for travel bundles that support them.

FAQ

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

Yes — every refill parameter must match a single available refill on the line’s bundle. The ’amount_mb’ and ’amount_days’ identify the data plan, while ’voice_minutes’ and ’sms_count’ pick a refill variant that includes the corresponding voice/SMS allowance. The set of available refills (with their ’amount_mb’, ’amount_days’, ’voice_minutes’ and ’sms_count’ combinations) can be retrieved from the /bundles command. Ensuring consistency between these parameters is crucial for accurate and effective eSIM refills.

2. What if I don’t need voice or SMS?

Omit ’voice_minutes’ and ’sms_count’ (or pass null) for data-only refills. The platform will match an available refill with the given ’amount_mb’/’amount_days’ that does not include voice or SMS allowance.

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
voice_minutes
integer or null <int64>

Optional. Voice minutes to select a matching refill that includes voice allowance. Must match one of the available refills for the line's bundle. Omit or pass null for data-only refills. If this plan has unlimited voice/SMS, this parameter is optional and ignored — the plan is always treated as unlimited regardless of the value passed (including null or -1). For finite plans, pass a non-negative integer matching an available refill.

sms_count
integer or null <int64>

Optional. SMS count to select a matching refill that includes SMS allowance. Must match one of the available refills for the line's bundle. Omit or pass null for data-only refills. If this plan has unlimited voice/SMS, this parameter is optional and ignored — the plan is always treated as unlimited regardless of the value passed (including null or -1). For finite plans, pass a non-negative integer matching an available refill.

Responses

Request samples

Content type
application/json
{
  • "amount_mb": 0,
  • "amount_days": 0,
  • "voice_minutes": 0,
  • "sms_count": 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. Once activated, Auto-Refill will automatically top up the Line when the remaining data balance drops below 500 MB.

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). The minimum refill amount is 500 MB. Requests with a smaller amount will be rejected. 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
voice_minutes
integer or null <int64>

Optional. Voice minutes to select a matching refill that includes voice allowance for auto-refill. Omit or pass null for data-only auto-refills. If this plan has unlimited voice/SMS, this parameter is optional and ignored — the plan is always treated as unlimited regardless of the value passed (including null or -1). For finite plans, pass a non-negative integer matching an available refill.

sms_count
integer or null <int64>

Optional. SMS count to select a matching refill that includes SMS allowance for auto-refill. Omit or pass null for data-only auto-refills. If this plan has unlimited voice/SMS, this parameter is optional and ignored — the plan is always treated as unlimited regardless of the value passed (including null or -1). For finite plans, pass a non-negative integer matching an available refill.

Responses

Request samples

Content type
application/json
{
  • "amount_mb": 0,
  • "amount_days": 0,
  • "bill_protect_amount": 0,
  • "voice_minutes": 0,
  • "sms_count": 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"
}

Block line

Use: This request suspends an eSIM line, travel or Lifetime. The data package and its remainder stay on the line, but the line cannot be used until it is restored.

FAQ

1. Can every line be blocked?

No. Travel and Lifetime eSIM lines are supported, and only some of them. Check "block_tier" in the line details: "block_and_restore" means both commands are available, "block_only" and "none" mean they are not — for those, contact support.

2. What happens to auto-refill?

Auto-refill is switched off when the line is blocked. Restoring the line does not switch it back on — turn it on again with the "turn_on_auto_refill" request if you need it.

Authorizations:
(ApiKeyAccessToken)
path Parameters
iccid
required
string

iccid

Request Body schema: application/json
required

Reason for blocking the line. Stored in the line audit log.

reason
required
string [ 4 .. 191 ] characters

Responses

Request samples

Content type
application/json
{
  • "reason": "Customer requested a temporary suspension"
}

Response samples

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

Restore line

Use: This request puts a blocked eSIM line back into service, travel or Lifetime. The data package and its remainder are unchanged by blocking, so the line resumes with whatever it had left — a Lifetime line comes back with the same balance, and no amount is named anywhere in this request.

FAQ

1. Which lines can be restored?

Travel and Lifetime eSIM lines whose "block_tier" is "block_and_restore" in the line details. A line that is not currently blocked is refused, and so is a line that was suspended by support: support restores those too.

2. Is auto-refill restored too?

No. Blocking switches auto-refill off and restoring does not switch it back on. Use "turn_on_auto_refill" if you need it.

Authorizations:
(ApiKeyAccessToken)
path Parameters
iccid
required
string

iccid

Responses

Response samples

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

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

Prices: the price_usd of each refill is your purchase price, the price you are charged, with your account discount already applied. The same holds for /bundles/{id}. Your retail prices, the ones your own customers pay, are returned by /bundles/{type}.

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.

Query Parameters:

  • with_async (boolean, optional, default: false): When set to true, includes bundles that require asynchronous processing (such as unlimited plans) in the response. These bundles must be ordered using /line/create_async instead of the standard /line/create endpoint.

Response Fields:

  • product_type: Indicates the physical product type - either "eSIM" for electronic SIM cards or "pSIM" for physical SIM cards.
Authorizations:
(ApiKeyAccessToken)
query Parameters
with_async
boolean
Default: false

Include bundles that require asynchronous processing. Default is false. When true, bundles requiring /line/create_async will be included in the response.

Responses

Response samples

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

Get bundles by type

Use: Returns all bundles of a specific type available in the partner account. Each bundle includes its name, description, image, coverage, IP breakout location, and available refill options.

Prices are retail prices. The price_usd of each refill comes from your retail price list in the Console: it is the price your own customers pay, that is your purchase price (with your account discount applied) plus your markup, 30% by default and adjustable per bundle in the Console, unless you have set the price manually. It is not the price you are charged. For purchase prices use /bundles or /bundles/{id}.

Supported types:

  • country — country-specific eSIM bundles (Plan product type);
  • regional — regional eSIM bundles covering multiple countries;
  • global — global eSIM bundles with worldwide coverage;
  • lifetime — lifetime (ELP) eSIM bundles with no expiry date;
  • physical — physical SIM card bundles (pSIM);
  • unlimited — unlimited data eSIM bundles.

Results are cached for 1 week per white-label, language, and currency combination.

Authorizations:
(ApiKeyAccessToken)
path Parameters
type
required
string
Enum: "country" "regional" "global" "lifetime" "physical" "unlimited"

Bundle type. Must be one of: country, regional, global, lifetime, physical, unlimited.

Responses

Response samples

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

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": [
    ]
}

Refund eSIM lines

Refund eSIM lines

The Line Refund API allows partners to submit refund requests for eSIM lines directly to the support team.

The request triggers a verification process in which the support team evaluates the refund eligibility of each line based on its installation status and ownership.

Partners can include up to 100 ICCIDs per request. Each line is validated individually during the review process.

Refunds are issued only if the line belongs to the requesting partner and meets the required conditions, including the correct installed flag.

Rules & Limitations:

  • Refund is possible only for lines belonging to the requesting partner.
  • Without installed: false, the refund will be rejected.
  • A request may contain multiple ICCIDs, but each line is processed individually.
  • Maximum of 100 ICCIDs per request.
  • Cancelling a submitted refund request is only possible manually via the customer support team.
  • Duplicate refund requests for the same line will be rejected.

Authorizations:
(ApiKeyAccessToken)
Request Body schema: application/json
required
iccids
required
Array of strings

array of ICCIDs (maximum 100 per request)

reason
required
string

string with refund reason (e.g., “Purchased in error”)

installed
required
boolean

required boolean (true/false) indicating whether the eSIM was installed

Responses

Request samples

Content type
application/json
{
  • "iccids": [
    ],
  • "reason": "Purchased in error",
  • "installed": false
}

Response samples

Content type
application/json
{
  • "status": "Request accepted",
  • "refund_id": "ref_mlwffw0idckj"
}