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.

    ParameterTypeDescription
    v1 catalog feedJSON / CSVGeneral-purpose feed with our native field names. Best for custom integrations and spreadsheets.
    Endpoints
    # v1 catalog feed — JSON
    https://getwanderly.com/api/catalog.json
    
    # v1 catalog feed — CSV
    https://getwanderly.com/api/catalog.csv

    Authentication & 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_at for change detection
    • CORS: *

    Catalog feed (v1)

    GET https://getwanderly.com/api/catalog.json
    GET https://getwanderly.com/api/catalog.csv

    Returns 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.

    Response (truncated)
    {
      "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)

    ParameterTypeDescription
    product_id / skustringStable unique plan identifiers. Use product_id as your primary key.
    data_gbnumberIncluded data in GB (per day when plan_kind is daily).
    validity_daysintegerPlan validity in days from activation.
    plan_kinddaily | totaltotal = fixed bucket of data; daily = allowance per day.
    coverage / coverage_typestringISO codes covered, and Single / Regional / Global.
    unlimitedbooleanTrue for unlimited plans (fair-usage may apply).
    pricenumberLive retail price in currency (USD), tax exclusive.
    price_per_gbnumberDerived price efficiency metric for ranking.
    network_speedstringMax network generation, e.g. 3G, 4G, 4G/5G.
    hotspot / kyc_requiredbooleanTethering allowed; whether ID verification is required.
    topup_supported / topup_typeboolean / stringWhether and how the eSIM can be topped up.
    url / buy_urlstringDestination page and direct plan deep link on getwanderly.com.
    last_updatedISO datetimeLast time this plan's data or price changed.

    Examples

    curl
    curl "https://getwanderly.com/api/catalog.json"
    Filter to one country (Node)
    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");
    Cheapest plan per country (Node)
    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);
    CSV into a spreadsheet
    =IMPORTDATA("https://getwanderly.com/api/catalog.csv")
    Only sync what changed (conditional request)
    curl -H 'If-None-Match: "<previous-etag>"' -i "https://getwanderly.com/api/catalog.json"
    # 304 Not Modified means nothing changed since your last sync

    Changelog & 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.