# eSIMDB Scraper (`solidcode/esimdb-scraper`) Actor

\[💰 $2.00 / 1K] Extract eSIM data plans from esimdb.com — prices, data allowance, validity, coverage, 5G, tethering, and promo codes. Filter by 24 named brands across 37 destinations, or leave providers empty to pull every brand eSIMDB lists (160+).

- **URL**: https://apify.com/solidcode/esimdb-scraper.md
- **Developed by:** [SolidCode](https://apify.com/solidcode) (community)
- **Categories:** Automation, Developer tools, E-commerce
- **Stats:** 2 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## eSIMDB Scraper

Pull live travel eSIM data plans from eSIMDB at scale — provider, data allowance, validity, headline and per-GB pricing, multi-currency rates, promo codes, 5G support, the full country list behind every regional and worldwide plan, and the underlying carrier network wherever the provider names one. Compare 24 named providers across 37 destinations in a single run, with every plan returned exactly once. Built for travel-tech and comparison sites, affiliate teams, and pricing analysts who need fresh eSIM plan data without manually checking dozens of provider sites one tab at a time.

### Why This Scraper?

- **24 named providers, 37 destinations, one run** — pick from Airalo, Nomad, Saily, Ubigi, GigSky, aloSIM, Yesim, Truphone and 16 more brands across 37 country catalogs, or pull every brand at once.
- **Whole-catalog pulls under an exact billable ceiling** — a single destination can return over 10,000 plans; one run captures the entire catalog, and `maxResults` fixes precisely how many plans come back and how many you pay for.
- **Published prices only, never an estimated conversion** — every plan carries the provider's own price map (US dollars on all of them, plus EUR, GBP, JPY, AUD and CAD wherever the provider publishes one) and a calculated `pricePerGB`, so cost comparisons rest on prices travellers are actually charged.
- **Promo codes and discounted prices captured automatically** — active promo codes (e.g. "ESIMDB15") and the discounted price surface on each plan, so you never miss a deal worth surfacing to your audience.
- **Real regional footprints, not a restatement of your search** — every plan eSIMDB publishes a country list for carries that whole list, up to 224 countries on a worldwide plan, so you can tell a Japan-only SIM from an Asia-wide one at a glance.
- **Carrier-level network detail on ~8 in 10 plans** — named underlying carriers (e.g. "KDDI (5G), Softbank (5G)") wherever the provider discloses them, plus a `has5G` flag and 4G/5G network types on all 100% — detail most comparison feeds drop entirely.
- **Four scoped filters** — minimum data (GB), maximum price (USD), minimum validity (days), and 5G-only, applied before you're billed so you only pay for the plans you actually want.
- **Parsed numbers, not just strings** — `dataGB`, `totalDataGB`, `validityDays`, `usdPrice`, and `pricePerGB` come ready to sort and chart, with the raw display strings kept too for plans like "3GB/day + unlimited at 1Mbps".
- **Per-day and never-expiring plans compared on equal terms** — a 1 GB/day plan valid 30 days is scored as 30 GB, so a "minimum 20 GB" search ranks it against a flat 20 GB plan instead of guessing; truly unlimited plans have no ceiling and always qualify; and the roughly 1 in 140 plans with no end date are marked as never expiring rather than zero days, so a "90+ days" search returns them instead of hiding them.
- **One row per plan, never one per destination** — a regional eSIM sold across 18 countries comes back once, with all 18 countries named, instead of once for each destination you picked. Pick three destinations and you pay for distinct plans, not for the same plan three times.

### Use Cases

**Travel-Tech & Comparison Sites**

- Power an eSIM comparison table for any of 37 destinations
- Surface the cheapest plan per GB for each country
- Show 5G-capable plans with their underlying carrier networks
- Keep destination pages fresh with current plan catalogs

**Affiliate & Lead Generation**

- Build affiliate feeds with live promo codes and discounted prices
- Highlight limited-time provider deals across brands
- Generate "best eSIM for \[country]" listicle data on demand
- Track which providers run the most aggressive promotions

**Market & Pricing Research**

- Benchmark price per GB across 24 providers in a destination
- Monitor how plan pricing shifts week over week
- Compare validity-versus-price curves for budget vs. premium plans
- Map multi-currency pricing for regional market analysis

**Product & Competitive Intelligence**

- Watch a competitor brand's full catalog across destinations
- Spot gaps where no provider offers long-validity or high-data plans
- Track 5G rollout by counting 5G plans per country over time
- Audit tethering, voice/SMS, and top-up support across the market

### Getting Started

#### Compare a Destination

The simplest run — every plan for one country:

```json
{
    "countries": ["usa"],
    "maxResults": 100
}
```

#### One Brand, Two Destinations

```json
{
    "countries": ["japan", "south-korea"],
    "providers": ["airalo"],
    "maxResults": 200
}
```

#### One Brand's Entire Global Catalog

Leave `countries` empty and pick a provider to sweep every destination for that brand:

```json
{
    "providers": ["airalo"],
    "maxResults": 200
}
```

#### Filtered, Multi-Currency Search

5G-only plans with at least 5 GB, capped at $30, with euro prices wherever the provider publishes one:

```json
{
    "countries": ["france", "spain", "italy"],
    "providers": ["airalo", "nomad", "saily"],
    "minData": 5,
    "maxPrice": 30,
    "minValidityDays": 7,
    "only5G": true,
    "currency": "EUR",
    "maxResults": 500
}
```

### Input Reference

#### What to Scrape

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `countries` | select\[] | `["United States"]` | One or more destinations to compare plans for. Choose from 37 countries (United States, United Kingdom, Japan, France, and more). Leave empty and pick a provider below to pull that brand's full catalog across every destination; leave both empty and it defaults to the United States. |
| `providers` | select\[] | `[]` | Limit results to specific brands — Airalo, Nomad, Saily, Ubigi, aloSIM, and 19 others. Leave empty to include every provider. Combine with countries to get one brand's plans for a destination, or use providers alone (no countries) to pull a brand's entire global catalog across all 37 destinations. |

#### Filters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `minData` | integer | `0` | Only include plans that give you at least this much data in total, in GB. Per-day plans count across their whole validity (1 GB/day for 30 days = 30 GB). Truly unlimited plans always qualify. 0 means no minimum. |
| `maxPrice` | integer | `0` | Only include plans priced at or below this amount in US dollars. 0 means no price cap. |
| `minValidityDays` | integer | `0` | Only include plans valid for at least this many days. Plans that never expire have no end date, so they always qualify. 0 means no minimum. |
| `only5G` | boolean | `false` | When on, return only plans that support 5G networks. |

#### Output Options

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `currency` | select | `US Dollar` | Preferred currency for the headline price: US Dollar, Euro, British Pound, Japanese Yen, Australian Dollar, or Canadian Dollar. A plan uses it when the provider publishes a price in that currency, and stays in US dollars otherwise. Read the `currency` field on each result to see which one it used. |

#### Limits

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `maxResults` | integer | `100` | Hard cap on the total number of plans returned — also the maximum you can be billed for, since each plan is one result. A narrow selection can run out of distinct plans before reaching the cap, and you are billed only for what came back. Set to 0 for no limit. A single destination can hold over 10,000 plans, so start small to test before scaling up. |

### Output

Each plan is one result, and a plan appears once no matter how many of your destinations it covers. Here's a representative item — a single-destination plan, so eSIMDB publishes no country list for it:

```json
{
    "provider": "Airalo",
    "name": "Change - 3 GB",
    "country": "United States",
    "countrySlug": "usa",
    "coverage": null,
    "data": "3GB",
    "dataGB": 3,
    "totalDataGB": 3,
    "validity": "30 days",
    "validityDays": 30,
    "price": 11,
    "currency": "USD",
    "usdPrice": 11,
    "prices": { "USD": 11, "EUR": 10.2, "GBP": 8.7, "JPY": 1650, "AUD": 16.8, "CAD": 15 },
    "pricePerGB": 3.6667,
    "promoPrice": 9.35,
    "promoCode": "ESIMDB15",
    "network": "T-Mobile (5G), AT&T (5G)",
    "networkTypes": ["5G"],
    "has5G": true,
    "tethering": true,
    "voiceSms": false,
    "maxSpeed": "5G",
    "reducedSpeed": null,
    "canTopUp": true,
    "providerSlug": "airalo",
    "url": "https://esimdb.com/usa/airalo",
    "planId": "5f3a1c9e2b"
}
```

A regional or worldwide plan fills `coverage` with every country it is sold for, for example `["Japan", "South Korea", "Thailand", "Vietnam", ...]` on an Asia-wide SIM, and still arrives as a single row.

#### Core Fields

| Field | Type | Description |
|-------|------|-------------|
| `provider` | string | eSIM provider/brand name (e.g. "Airalo") |
| `name` | string | Plan name (e.g. "Change - 3 GB") |
| `country` | string | The destination, from the ones you selected, this plan was matched under (display name). A plan sold for several of your destinations is listed under the first one and names the rest in `coverage` |
| `countrySlug` | string | eSIMDB slug for that destination (e.g. "usa", "japan") |
| `url` | string | Source page URL on eSIMDB |
| `providerSlug` | string | eSIMDB provider slug |
| `planId` | string | eSIMDB plan identifier. Unique within a run — the same plan is never returned, or billed, twice |

#### Data & Validity

| Field | Type | Description |
|-------|------|-------------|
| `data` | string | Raw data allowance as shown ("3GB", "Unlimited", "3GB/day + unlimited at 1Mbps") |
| `dataGB` | number | Flat data allowance in GB; null for unlimited, per-day, or unparseable plans |
| `totalDataGB` | number | Total data across the plan's full validity in GB — the number `minData` filters on; null for truly unlimited plans |
| `validity` | string | Raw validity as shown ("30 days", or "Unlimited" on plans that never expire) |
| `validityDays` | integer | Parsed validity in whole days; blank on plans that never expire, which have no end date to count to |
| `canTopUp` | boolean | Whether the plan can be topped up |

#### Pricing

| Field | Type | Description |
|-------|------|-------------|
| `price` | number | Headline price, in the currency named by `currency` |
| `currency` | string | Currency the headline `price` is really in: your preferred currency where the provider publishes one, otherwise USD |
| `usdPrice` | number | Canonical USD price for sorting and comparison |
| `prices` | object | The provider's full published price map (USD plus EUR, GBP, JPY, AUD, CAD and others where listed) |
| `pricePerGB` | number | USD price divided by `totalDataGB`, so a 1 GB/day plan and a flat 30 GB plan are priced on the same scale; blank on truly unlimited plans, which have no data total to divide by |

#### Promo

| Field | Type | Description |
|-------|------|-------------|
| `promoPrice` | number | Discounted USD price when a promo applies |
| `promoCode` | string | Active promo/discount code (e.g. "ESIMDB15") |

#### Coverage & Network

| Field | Type | Description |
|-------|------|-------------|
| `coverage` | string\[] | Every country the plan is sold for, straight from eSIMDB's own regional listings — 2 to 224 countries, median 15. Normally `null` when eSIMDB publishes no country list for that plan, which is most single-destination SIMs; expect roughly 1 in 8 plans filled on a single popular destination and 4 in 5 on a European one. On the rare run where eSIMDB will not hand over its country lists, the run says so in its log and summary, and `coverage` is blank throughout — that blank means "we could not look it up", not "no countries listed" |
| `network` | string | Underlying carrier network(s), e.g. "KDDI (5G), Softbank (5G)". Published for ~80% of plans; `null` when the provider does not name its carriers |
| `networkTypes` | string\[] | Network generations (e.g. "5G", "4G/LTE") |
| `has5G` | boolean | Whether the plan supports 5G |
| `tethering` | boolean | Whether hotspot/tethering is allowed |
| `voiceSms` | boolean / string | Voice and SMS support |
| `maxSpeed` | string | Peak speed cap. Rarely disclosed — stated on only ~3% of plans, `null` otherwise |
| `reducedSpeed` | string | Throttled speed after the data cap (e.g. "1000 kbps"). Stated on ~1 in 5 plans |

### Tips for Best Results

- **Start small, and treat `maxResults: 0` with respect** — set `maxResults` to 100 on your first run to confirm the data fits your needs, then scale up; a single destination can hold over 10,000 plans. Leaving the cap at 0 returns every matching plan and bills for each one, which runs into many thousands of results on a broad country selection or a providers-only sweep of all 37 destinations.
- **Pull a brand's whole global catalog** — leave `countries` empty and pick one or more providers to sweep every destination for those brands; `maxResults` still caps the run, so start at a few hundred.
- **Leave providers empty to pull a whole catalog** — select only destinations and skip the providers field to capture every brand's plans, then filter locally however you like.
- **Combine country and provider for the cheapest run** — pairing a destination with a brand (e.g. Japan + Airalo) returns a tight, precise set instead of a full catalog.
- **Compare per-day plans on `totalDataGB`** — a 0.5 GB/day plan for 3 days and a flat 20 GB plan look nothing alike in the `data` column; `totalDataGB` puts both on the same scale, and it is the field `minData` measures against.
- **Sort on `pricePerGB`, not headline price** — the cheapest sticker price is rarely the best value; `pricePerGB` divides the USD price by `totalDataGB`, so per-day and flat plans rank against each other honestly. Truly unlimited plans leave it blank on purpose, since there is no data total to divide by; rank those on `usdPrice` per day instead.
- **Filter on `currency`, do the maths on `usdPrice`** — a plan's headline `price` uses your preferred currency only where the provider publishes one (euro prices cover roughly a fifth of the catalogue), so read `currency` to see which one each row is in; `usdPrice` is filled on every plan and is the reliable key for sorting and ranking.
- **Use `coverage` to separate regional SIMs from local ones** — a filled `coverage` list is eSIMDB's own country list for that plan, so a row naming 40 countries is a regional SIM you can sell to a multi-country trip, while a `null` normally means eSIMDB lists no countries beyond the destination itself. Check the run summary first: if it reports that eSIMDB would not serve its country lists that run, read the blanks as unknown rather than empty.
- **Watch `promoCode` for affiliate value** — plans with a live promo code and `promoPrice` are the ones worth featuring to a deal-seeking audience.

### Pricing

**From $2.00 per 1,000 results** — among the most competitive rates for structured eSIM plan data. Bronze, Silver, and Gold subscribers pay progressively less; the table below shows total cost at each discount tier.

| Results | No discount | Bronze | Silver | Gold |
|---------|-------------|--------|--------|------|
| 100 | $0.24 | $0.225 | $0.21 | $0.20 |
| 1,000 | $2.40 | $2.25 | $2.10 | $2.00 |
| 10,000 | $24.00 | $22.50 | $21.00 | $20.00 |
| 100,000 | $240.00 | $225.00 | $210.00 | $200.00 |

A "result" is one eSIM plan row in the output dataset. No compute or time-based charges — you pay per result, plus a small fixed per-run start fee.

### Integrations

Export data in JSON, CSV, Excel, XML, or RSS. Connect to 1,500+ apps via:

- **Zapier** / **Make** / **n8n** — Workflow automation
- **Google Sheets** — Direct spreadsheet export
- **Slack** / **Email** — Notifications on new results
- **Webhooks** — Trigger custom APIs on run completion
- **Apify API** — Full programmatic access

### Legal & Ethical Use

This actor is designed for legitimate travel-tech research, price comparison, and market analysis. Users are responsible for complying with applicable laws and eSIMDB's Terms of Service. The data collected is publicly listed plan and pricing information — use it responsibly and do not use extracted data for spam or any unlawful purpose.

# Actor input Schema

## `countries` (type: `array`):

Pick one or more destinations to compare eSIM plans for. Leave empty and select one or more Providers below to pull that brand's entire catalog across every destination. Leave both empty and the scraper defaults to the United States. Example: choose 'United States' and 'Japan' to get every eSIM plan available for those destinations.

## `providers` (type: `array`):

Limit results to specific eSIM brands (e.g. Airalo, Nomad, Saily, Ubigi). Leave empty to include every provider. Combine with Countries to get a single brand's plans for a destination — or use providers alone to pull a brand's entire global catalog (can be several thousand plans).

## `minData` (type: `integer`):

Only include plans that give you at least this much data in total, in GB. Per-day plans are measured across their whole validity, so a 1 GB/day plan valid for 30 days counts as 30 GB and a 0.5 GB/day plan valid for 3 days (1.5 GB) is excluded. Truly unlimited plans have no ceiling, so they always qualify. Leave at 0 for no minimum.

## `maxPrice` (type: `integer`):

Only include plans priced at or below this amount in US dollars. Leave at 0 for no price cap.

## `minValidityDays` (type: `integer`):

Only include plans valid for at least this many days. Plans that never expire have no end date, so they always qualify. Leave at 0 for no minimum.

## `only5G` (type: `boolean`):

When enabled, only include plans that support 5G networks.

## `currency` (type: `string`):

Preferred currency for the headline price. A plan uses it when the provider publishes a price in that currency, and stays in US dollars otherwise — prices are always the provider's own, never an estimated conversion. The 'currency' field on each result names the one actually used, and 'usdPrice' is filled on every plan. Outside US dollars, coverage is partial: euro prices appear on roughly a fifth of the catalogue, less for the others.

## `maxResults` (type: `integer`):

Hard cap on the total number of plans returned across everything you selected — this is also the maximum you can be billed for, since each plan is one result. It is a ceiling, not a promise: each plan is returned once even when it covers several of the destinations you picked, so a narrow selection can run out of distinct plans and finish under the cap — you are billed only for what came back. Pick several destinations and the cap is split evenly between them, so every destination you chose is represented. Set to 0 for no limit (returns every matching plan). Note: 0 = unlimited can return many thousands of billable plans and take much longer, especially with broad country or provider selections (a single destination can hold over 10,000 plans, and a providers-only run scans all 37 destinations). Start small (e.g. 100) to test before scaling up.

## Actor input object example

```json
{
  "countries": [
    "usa"
  ],
  "providers": [],
  "minData": 0,
  "maxPrice": 0,
  "minValidityDays": 0,
  "only5G": false,
  "currency": "USD",
  "maxResults": 100
}
```

# Actor output Schema

## `overview` (type: `string`):

Table of eSIM plans with provider, the destination each was matched under, the countries the plan covers, data, validity, price, and 5G support. Each plan appears once even when it covers several of your destinations.

## `pricing` (type: `string`):

Per-plan pricing breakdown: USD price, total data over the plan's full validity, price per GB of that total data (blank on uncapped plans), promo price, and promo code.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "countries": [
        "usa"
    ],
    "providers": [],
    "minData": 0,
    "maxPrice": 0,
    "minValidityDays": 0,
    "only5G": false,
    "currency": "USD",
    "maxResults": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("solidcode/esimdb-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "countries": ["usa"],
    "providers": [],
    "minData": 0,
    "maxPrice": 0,
    "minValidityDays": 0,
    "only5G": False,
    "currency": "USD",
    "maxResults": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("solidcode/esimdb-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "countries": [
    "usa"
  ],
  "providers": [],
  "minData": 0,
  "maxPrice": 0,
  "minValidityDays": 0,
  "only5G": false,
  "currency": "USD",
  "maxResults": 100
}' |
apify call solidcode/esimdb-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,solidcode/esimdb-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/rbu4TzR2uHFShNNcB/builds/4zeQxBXIHdx2aaiLg/openapi.json
