Hubby API (2.1.0)

Welcome to the Hubby API documentation. This API enables partners to seamlessly integrate eSIM booking and management capabilities into their applications.

Key Features:

  • Create and manage eSIM bookings for your customers
  • Access our global package catalog with country-specific offerings
  • Track booking statuses and package activations
  • Support for multiple package types (starter, data-limited, unlimited, time-limited)

Package Types

The API supports four types of packages:

  • Starter packages: Hybrid packages that are both data and time limited. They provide a small data allowance within a short time period (default: 2 days). Perfect for first-time users and trials.

  • Data-limited packages: Traditional packages with a specific data allowance that expires after a certain period (default: 365 days). This is the primary package type and the default for most use cases.

  • Unlimited packages: Packages that provide unrestricted data usage for a specified duration. Subject to fair use policy. Ideal for heavy data users and digital nomads.

  • Time-limited packages: Packages that provide a fixed data allowance for a specific duration with full-speed access. These packages expire when either the data limit or time limit is reached.

Note: Top-ups are always data-limited packages, regardless of the original package type.

Authentication: All API requests must include the following headers:

  • x-api-key: Your public API key
  • x-timestamp: Current Unix timestamp in milliseconds
  • x-signature: HMAC-SHA256 signature

The HMAC signature must be generated for each request using:

  1. Concatenate: timestamp + HTTP method + request path Example: "1678901234GET/bookings"
  2. Generate HMAC-SHA256 using your secret key
  3. Convert to hex string

Note: Swagger UI cannot be used to test the API directly as each request requires a unique HMAC signature. Please implement the authentication in your client application.

Example Node.js Implementation:

const cryptoJs = require('crypto-js');

// Configuration values that would normally come from environment
const secretKey = "YOUR_API_SECRET";
const publicKey = "YOUR_API_KEY";
const baseUrl = "YOUR_BASE_URL";

// Function to generate headers for API request
function generateApiHeaders(method, path) {
    //Timestamp is in milliseconds e.g. 1715558400000
    const timestamp = Math.floor(Date.now()).toString();

    // Ensure url is a string
    let path = String(url);

    // Remove baseUrl from the url if present
    path = processedUrl.replace(baseUrl, '');

    // Create query string if needed
    const queryString = new URL(url).search;
    if (queryString) {
        processedUrl += queryString;
    }

    // Validate public key
    if (!publicKey) {
        throw new Error("Public key is required");
    }

    // Create the payload
    // Sample payload: 1715558400000GET/bookings?bookingId=1234567890
    const payload = timestamp + method + path;

    // Generate the HMAC signature
    const signature = cryptoJs.HmacSHA256(payload, secretKey).toString(cryptoJs.enc.Hex);

    // Return headers object
    return {
        'x-timestamp': timestamp,
        'x-signature': signature,
        'x-api-key': publicKey,
        'Accept': 'application/json'
    };
}

Need Help?

  • Technical Support: support@hubbyesim.com
Download OpenAPI description
Languages
Servers
Mock server
https://docs.hubbyesim.com/_mock/apis/openapi/
Production server
https://europe-west4-hubby-esim.cloudfunctions.net/api_v2/

Booking

Operations

Destination

Operations

PromoCode

Operations

eSIM

Operations

WebView

Operations

Native eSIM Integration

Operations

Get user dashboard

Request

Returns everything needed to render any screen in a native eSIM integration: user info, package queues, current eSIM state, active packages, and partner details.

This is the central endpoint for the Native eSIM Integration. One call gives you the traveler's full state.

When to call:

  • Every time the traveler opens the eSIM section
  • After a top-up purchase (to confirm the new package appeared)
  • After redeeming a package queue
  • Periodically for data meter refresh (or rely on webhooks)

Authentication: HMAC-SHA256 (same as all partner endpoints).

Query
external_user_idstringrequired

The partner's own user identifier

Example: external_user_id=user_abc123
curl -i -X GET \
  'https://docs.hubbyesim.com/_mock/apis/openapi/native/user-dashboard?external_user_id=user_abc123'

Responses

User dashboard retrieved successfully

Bodyapplication/json
successboolean
Example: true
dataobject
Response
application/json
{ "success": true, "data": { "user": {}, "package_queues": [], "current_esim": {}, "current_esim_packages": [], "partner": {} } }

Get installation instructions

Request

Returns AI-generated, device-specific eSIM installation instructions tailored to the traveler's exact device model, OS version, locale, and current eSIM state.

The service resolves the user's eSIM status, activation string, and partner visual identity automatically from the external_user_id, then generates branded, device-aware instructions.

You do not need to hard-code or maintain installation content in your app — Hubby keeps instructions current for every device and OS version.

Authentication: HMAC-SHA256 (same as all partner endpoints).

Bodyapplication/jsonrequired
formatstring

Response format for the instructions

Example: "html"
external_user_idstringrequired

The partner's own user identifier

Example: "user_abc123"
deviceNamestringrequired

Full device name

Example: "Google Pixel 10"
deviceTypestring

Device type (phone, tablet, etc.)

Example: "phone"
osstringrequired

Operating system

Example: "android"
osVersionstringrequired

OS version

Example: "15"
localestring

Locale for the instructions (e.g., "en", "es", "mk-MK")

Example: "mk-MK"
curl -i -X POST \
  https://docs.hubbyesim.com/_mock/apis/openapi/native/instructions \
  -H 'Content-Type: application/json' \
  -d '{
    "format": "html",
    "external_user_id": "user_abc123",
    "deviceName": "Google Pixel 10",
    "deviceType": "phone",
    "os": "android",
    "osVersion": "15",
    "locale": "mk-MK"
  }'

Responses

Installation instructions generated successfully. The response shape is dynamic and depends on the requested format.

Bodyapplication/json
successboolean
Example: true
dataobject

AI-generated installation instructions. Shape varies by format.

Response
application/json
{ "success": true, "data": {} }

Check device eSIM compatibility

Request

Checks whether a specific device supports eSIM. Pass the device brand, model, OS, and OS version to get a compatibility result.

Authentication: HMAC-SHA256 (same as all partner endpoints).

Bodyapplication/jsonrequired
phone_brandstringrequired

Device manufacturer

Example: "Google"
phone_modelstringrequired

Device model name

Example: "Pixel 10"
phone_osstringrequired

Operating system

Example: "android"
os_versionstringrequired

OS version

Example: "15"
curl -i -X POST \
  https://docs.hubbyesim.com/_mock/apis/openapi/native/device-compatibility \
  -H 'Content-Type: application/json' \
  -d '{
    "phone_brand": "Google",
    "phone_model": "Pixel 10",
    "phone_os": "android",
    "os_version": "15"
  }'

Responses

Compatibility check result

Bodyapplication/json
successboolean
Example: true
dataobject
Response
application/json
{ "success": true, "data": { "phone_brand": "Google", "phone_model": "Pixel 10", "phone_os": "android", "os_version": "15", "is_compatible": true } }

List device compatibility

Request

Returns a list of all known devices and their eSIM compatibility status. Use this to build a device compatibility page or to pre-filter device selection in your app.

Authentication: HMAC-SHA256 (same as all partner endpoints).

curl -i -X GET \
  https://docs.hubbyesim.com/_mock/apis/openapi/native/device-compatibility

Responses

Device compatibility list

Bodyapplication/json
successboolean
Example: true
dataobject
Response
application/json
{ "success": true, "data": { "devices": [] } }

Redeem a package queue

Request

Redeems a package queue entry, provisioning the package onto the traveler's universal eSIM. The package queue entry is consumed and the eSIM is updated with the new package.

Use the package_queue_id from the user dashboard response (GET /native/user-dashboard) to identify which package queue to redeem.

Authentication: HMAC-SHA256 (same as all partner endpoints).

Bodyapplication/jsonrequired
external_user_idstringrequired

The partner's own user identifier

Example: "user_abc123"
package_queue_idstringrequired

The package queue ID to redeem (from the id field in the package_queues array of the user dashboard response)

Example: "pq_xyz789"
curl -i -X POST \
  https://docs.hubbyesim.com/_mock/apis/openapi/native/redeem-package \
  -H 'Content-Type: application/json' \
  -d '{
    "external_user_id": "user_abc123",
    "package_queue_id": "pq_xyz789"
  }'

Responses

Package queue redeemed successfully

Bodyapplication/json
successboolean
Example: true
messagestring
Example: "Package queue redeemed successfully"
dataobject
Response
application/json
{ "success": true, "message": "Package queue redeemed successfully", "data": { "packageQueue": {}, "current_esim": {}, "current_esim_packages": [] } }

Webhooks

Webhooks