Developer docs
Wanderly API
A public, read-only feed of the full Wanderly eSIM catalog — built for comparison sites, affiliates and aggregators such as esimDB and esims.io. No API key required.
Overview
The catalog feed is read-only, CORS-enabled, served over HTTPS from getwanderly.com and refreshed on every catalog sync. Prices are live retail prices — the same ones a customer sees at checkout.
| Parameter | Type | Description |
|---|---|---|
| v1 catalog feed | JSON / CSV | General-purpose feed with our native field names. Best for custom integrations and spreadsheets. |
# v1 catalog feed — JSON
https://getwanderly.com/api/catalog.json
# v1 catalog feed — CSV
https://getwanderly.com/api/catalog.csvAuthentication & limits
No authentication, no API key, no signup. Send a plain GET request. Responses include an ETag and Last-Modified; send If-None-Match to get a cheap 304 Not Modified and skip re-downloading an unchanged feed.
- Machine-readable OpenAPI 3.1 spec — import it into Postman, Insomnia, or an AI agent
- Each endpoint returns the complete catalog in one response
- Refreshed daily — please poll no more than once per hour
- Use
generated_at/updated_atfor change detection - CORS:
*
Catalog feed (v1)
GET https://getwanderly.com/api/catalog.json
GET https://getwanderly.com/api/catalog.csvReturns every active plan in our native schema under products. The CSV variant carries the same columns with a header row — drop it straight into a spreadsheet or a bulk importer. Filter client-side on country_code, coverage_type or plan_kind.
{
"provider": "Wanderly",
"website": "https://getwanderly.com",
"currency": "USD",
"generated_at": "2026-08-06T20:00:00.000Z",
"count": 2231,
"products": [
{
"product_id": "PC2G2GAZG",
"sku": "AF_1_7",
"name": "Afghanistan 1GB 7Days",
"country_code": "AF",
"country_name": "Afghanistan",
"coverage": "AF",
"coverage_type": "Single",
"plan_kind": "total",
"data_type": "Data in Total",
"data_gb": 1,
"validity_days": 7,
"unlimited": false,
"network_speed": "3G",
"hotspot": true,
"kyc_required": false,
"topup_supported": true,
"topup_type": "Data Reloadable for same area within validitity",
"currency": "USD",
"price": 8.99,
"price_per_gb": 8.99,
"url": "https://getwanderly.com/destinations/afghanistan",
"buy_url": "https://getwanderly.com/destinations/afghanistan?plan=PC2G2GAZG",
"last_updated": "2026-08-06T05:00:08.213+00:00"
}
]
}Field reference (v1)
| Parameter | Type | Description |
|---|---|---|
| product_id / sku | string | Stable unique plan identifiers. Use product_id as your primary key. |
| data_gb | number | Included data in GB (per day when plan_kind is daily). |
| validity_days | integer | Plan validity in days from activation. |
| plan_kind | daily | total | total = fixed bucket of data; daily = allowance per day. |
| coverage / coverage_type | string | ISO codes covered, and Single / Regional / Global. |
| unlimited | boolean | True for unlimited plans (fair-usage may apply). |
| price | number | Live retail price in currency (USD), tax exclusive. |
| price_per_gb | number | Derived price efficiency metric for ranking. |
| network_speed | string | Max network generation, e.g. 3G, 4G, 4G/5G. |
| hotspot / kyc_required | boolean | Tethering allowed; whether ID verification is required. |
| topup_supported / topup_type | boolean / string | Whether and how the eSIM can be topped up. |
| url / buy_url | string | Destination page and direct plan deep link on getwanderly.com. |
| last_updated | ISO datetime | Last time this plan's data or price changed. |
Examples
curl "https://getwanderly.com/api/catalog.json"const res = await fetch("https://getwanderly.com/api/catalog.json");
const { products } = await res.json();
const japan = products.filter((p) => p.country_code === "JP");
console.log(japan.length, "Japan plans");const { products } = await (await fetch("https://getwanderly.com/api/catalog.json")).json();
const best = {};
for (const p of products) {
const cur = best[p.country_code];
if (!cur || p.price_per_gb < cur.price_per_gb) best[p.country_code] = p;
}
console.log(best.TH);=IMPORTDATA("https://getwanderly.com/api/catalog.csv")curl -H 'If-None-Match: "<previous-etag>"' -i "https://getwanderly.com/api/catalog.json"
# 304 Not Modified means nothing changed since your last syncChangelog & support
- v1 — Catalog feed in Wanderly's native schema, JSON and CSV.
Integration questions, higher rate limits or a custom schema? Email support@getwanderly.com and we will get you set up.