eSIMGuide - Compare Travel eSIM Plans

Put your eSIM plans in front of travellers who are ready to buy

eSIM Guide compares travel eSIMs straight from each provider's own catalogue. Listed plans appear on every destination they cover, next to the brands travellers already know, updated automatically from the provider's feed.

providers listed
51
providers listed
live plans
252,512
live plans
destinations
228
destinations

Listed alongside

  • Telcomia
  • HiRoaming
  • Globie
  • MoodSIM
  • SimSmash
  • NXTL eSIM
  • Wanderly eSIM
  • Viasimo
  • Maya Mobile
  • YonoSIM
  • Bloomy eSIM
  • Skyalo
  • MyTravel eSIM
  • RedEx eSIM
  • Nomad
  • Connect Me Guru
  • PikaSIM
  • ZenSim
  • MicroESIM
  • ASIMGO
  • iroamly
  • RedteaGo
  • Airalo
  • HorizonESIM
  • Esimatic
  • Global YO
  • GlobalPass
  • AirHub
  • Roamless
  • GigSky
  • YeSIM
  • UBIGI
  • eSimHero
  • Always Mobile
  • Orbit Mobile
  • VoyeGlobal
  • Saily
  • Roamix
  • Rufly
  • Roaming4You
  • eSimCard
  • Simify
  • PuraSIM
  • Stellar eSIM
  • JamboSIM
  • Simsima
  • LightSIM
  • AirPlans
  • esimagora
  • MyEsimGlobal
  • eSIMDesti
See every provider

What we need from you

Two things are not optional. Without both, we cannot list your plans.

  • An affiliate programme

    Your own, or through a network such as Impact, CJ or Awin. Commission on the sales we send is how eSIM Guide pays for itself. If yours is not live yet, tell us when it will be.

  • A plan feed or API

    Something we can fetch automatically to keep your prices and plans current. It does not have to match our format below, but it has to be machine-readable: a spreadsheet sent by email or a pricing page on your website is not a feed.

How it works

  1. 1

    Tell us about you

    Fill in the form with your brand, your website and your affiliate programme.

  2. 2

    Send us your feed details

    A link to your plan feed or API, in the format below or in whatever format you already publish. We cannot consider an enquiry without it.

  3. 3

    We come back with terms

    We review your feed and your programme, then get in touch with our terms. If we go ahead, we write the integration and re-sync your catalogue automatically from then on.

Every field you send is another way to be found

Travellers cut thousands of plans down with filters, and a plan only appears under a filter when its feed says it qualifies. Leave a field out and you are not ruled out, you are just missing from that search.

  • networks[].nameNetworks
  • types: ["5G"]5G
  • tethering: trueTethering
  • telephony.voice: trueCalls or SMS
  • canTopUp: trueTop-up
  • internetBreakoutsLow latency
  • dataCapPer: "day"Daily cap
  • dataCap: 0Unlimited
  • promoEnabled: trueApply discounts

Ask to be listed

Required. Any format, as long as we can fetch it automatically. If your API needs a key, link to its documentation.

Do you run an affiliate programme?

We only list providers with an affiliate programme. If yours is not live yet, tell us when it will be below.

We only use your details to reply. See our privacy policy.

The plan feed format

Many of the providers we list already publish their plans in this shape, so if you have it, integration is quick. If you do not, there is no need to build it: any feed or API you already have will do.

Delivery

  • One HTTPS URL that returns your whole catalogue as a JSON array, one object per plan. Paging is fine if your catalogue is large.

  • Public, or protected by a key in a header or query string. We keep keys server-side and never publish them.

  • We fetch at most once an hour, so a price change reaches the site within that window.

  • Put your affiliate attribution on every link, or tell us which parameter to add and we will append it.

The minimum

Seven fields are enough to list a plan. Everything else is optional.

JSON
[
  {
    "planName": "Spain 3GB 30 Days",
    "link": "https://example.com/esim/spain?ref=esimguide",
    "prices": {
      "USD": 4.5
    },
    "validity": 30,
    "dataCap": 3,
    "dataUnit": "GB",
    "coverages": [
      {
        "code": "ES"
      }
    ]
  }
]

A full example

Two plans: a fixed allowance in one country, and a daily plan across several.

JSON
[
  {
    "id": "es-3gb-30d",
    "planName": "Spain 3GB 30 Days",
    "link": "https://example.com/esim/spain?plan=es-3gb-30d&ref=esimguide",
    "prices": {
      "USD": 4.5,
      "EUR": 4.2,
      "GBP": 3.6
    },
    "validity": 30,
    "dataCap": 3,
    "dataUnit": "GB",
    "dataCapPer": null,
    "maxSpeed": null,
    "reducedSpeed": null,
    "coverages": [
      {
        "code": "ES",
        "networks": [
          {
            "name": "Movistar",
            "types": [
              "4G",
              "5G"
            ]
          },
          {
            "name": "Orange",
            "types": [
              "4G",
              "5G"
            ]
          }
        ]
      }
    ],
    "internetBreakouts": [
      {
        "country": "ES"
      }
    ],
    "tethering": true,
    "canTopUp": true,
    "eKYC": false,
    "telephony": null,
    "phoneNumber": false,
    "subscription": false,
    "subscriptionPeriod": null,
    "payAsYouGo": false,
    "hasAds": false,
    "newUserOnly": false,
    "promoEnabled": true,
    "capacityInfo": null,
    "validityInfo": "Install within 180 days of purchase.",
    "activationInfo": "Validity starts when the eSIM first connects to a supported network.",
    "additionalInfo": null,
    "apn": "internet"
  },
  {
    "id": "eu-1gb-day-7d",
    "planName": "Europe 1GB/day 7 Days",
    "link": "https://example.com/esim/europe?plan=eu-1gb-day-7d&ref=esimguide",
    "prices": {
      "USD": 9.9,
      "EUR": 9.2
    },
    "validity": 7,
    "dataCap": 1,
    "dataUnit": "GB",
    "dataCapPer": "day",
    "maxSpeed": null,
    "reducedSpeed": 512,
    "coverages": [
      {
        "code": "FR",
        "networks": [
          {
            "name": "Orange",
            "types": [
              "5G"
            ]
          }
        ]
      },
      {
        "code": "IT",
        "networks": [
          {
            "name": "TIM",
            "types": [
              "4G",
              "5G"
            ]
          }
        ]
      },
      {
        "code": "DE",
        "networks": [
          {
            "name": "Vodafone",
            "types": [
              "4G"
            ]
          }
        ]
      }
    ],
    "internetBreakouts": [
      {
        "country": "NL"
      }
    ],
    "tethering": true,
    "canTopUp": false,
    "eKYC": false,
    "telephony": {
      "voice": false,
      "sms": true,
      "dialingCode": null
    },
    "phoneNumber": false,
    "subscription": false,
    "subscriptionPeriod": null,
    "payAsYouGo": false,
    "hasAds": false,
    "newUserOnly": false,
    "promoEnabled": true,
    "capacityInfo": "1GB a day at full speed, then unlimited at 512 kbps.",
    "validityInfo": null,
    "activationInfo": null,
    "additionalInfo": null,
    "apn": null
  }
]

Field reference

The plan

idstring
Your stable identifier for the plan. Strongly recommended.
planNamestringrequired
The plan's name as customers see it on your site.
linkstring (URL)required
Where the buy button goes: ideally the plan's own checkout page, carrying your attribution for us.
prices{ [currency]: number }required
Price in each currency you sell in, in major units. For example USD, EUR and GBP.
validitynumberrequired
How many days the plan lasts once it starts.

Data and speed

dataCapnumberrequired
The data allowance. 0 means unlimited.
dataUnit"MB" | "GB"required
The unit of dataCap.
dataCapPer"day" | null
"day" when dataCap is a daily allowance that resets every day. null or absent when it is the total for the plan.
maxSpeednumber | null
Top speed in kbps, if the plan is speed-capped.
reducedSpeednumber | null
Speed in kbps once the allowance is used up, if data carries on at a reduced speed.

Where it works

coveragesarrayrequired
One entry per country the plan works in.
coverages[].codestringrequired
ISO 3166-1 alpha-2 country code, such as ES or JP.
coverages[].networksarray
The mobile networks the eSIM connects to in that country.
coverages[].networks[].namestring
Network name, such as Vodafone or Orange.
coverages[].networks[].typesstring[]
Technologies on that network: "3G", "4G", "5G".
internetBreakouts{ country: string }[]
The country or countries where traffic reaches the internet, which decides the IP address and latency users see.

Features

tetheringboolean | null
Whether the plan can be shared as a hotspot.
canTopUpboolean | null
Whether more data can be added to the same eSIM.
eKYCboolean | null
Whether buyers must verify their identity before the eSIM works.
telephony{ voice, sms, dialingCode } | null
Voice and SMS: { voice: boolean, sms: boolean, dialingCode: string }. null if the plan is data only.
phoneNumberboolean | null
Whether the plan comes with its own phone number.
subscriptionboolean | null
Whether the plan renews automatically.
subscriptionPeriodnumber | null
Days between renewals, for subscriptions.
payAsYouGoboolean | null
Whether data is billed by usage rather than as a bundle.
hasAdsboolean | null
Whether the plan is funded by ads, as some free plans are.
newUserOnlyboolean | null
Whether only first-time customers can buy the plan.
promoEnabledboolean | null
Whether discount codes can be used on the plan.

Free text

capacityInfostring | null
Anything about the allowance, such as fair use terms or speed after a daily cap.
validityInfostring | null
Anything about validity, such as how long the customer has to install the eSIM.
activationInfostring | null
When validity starts: on purchase, on install or on first connection.
additionalInfostring | null
Anything else a traveller should know.
apnstring | null
The APN, if customers need to set one.

What makes a feed easy to work with

  1. 1

    Send null, or leave a field out, when you do not know the answer. false means the plan definitely does not do something. We show unknown as unknown, never as a no.

  2. 2

    Give every plan an id that survives renames and price changes. Without one, a renamed plan looks like one plan removed and another added.

  3. 3

    One row per plan you can buy. If a plan is sold in several durations, send one row per duration, each with its own price.

  4. 4

    Prices in major units (4.50, not 450) at the amount the customer pays. Send every currency you sell in: your own local prices are better than our conversion.

  5. 5

    Networks belong to the country they serve. On a multi-country plan, list each country's networks under that country, not one list for the whole plan.

Different format? Send it anyway.

Around half the providers we list send something else entirely: their own APIs, XML, CSV, affiliate network product feeds. As long as we can fetch it automatically, tell us where yours lives and we will take it from there.

Get in touch