For providers
Provider feed guide
Everything on this page is optional. We already list providers from plain JSON feeds, REST APIs and, when nothing else exists, their storefront. But the more of the fields below your feed carries, the more of eSIMKart's surfaces show your plans โ the fair-use columns, the hotspot and calls filters, the local-number lane, the networks line on every destination page. This is what "send it this way" looks like.
Guide version 1.3 ยท published Oct 4, 2026
- 130+
- providers compared
- 220+
- destinations covered
- 449,000+
- live plans, re-verified daily
- 0%
- markup
Building the feed with an AI assistant? Hand it the single-file Markdown version of this guide โ every field, rule and example in one document.
Three things to know first
-
1
Nothing here changes rankings. Plans are ordered by price and data only, and a richer feed never buys a better position โ it only fills in facts travellers can filter and read. See how we rank. How we rank โ
-
2
If you already publish a standard DataPlan feed for other comparison sites, you are done with the required and recommended fields. The eSIMKart extras sit under one extra key and never collide with what you emit today.
-
3
Unknown is never shown as "none". A fact your feed does not state is rendered as "Not stated", not as "not supported" โ so leaving a field out is always safe.
The three tiers
Without these a plan cannot be listed at all.
Fills the plan-details dialog, the filters and the fair-use columns. Standard DataPlan fields.
eSIMKart extensions under the "esimkart" key. Optional; each one fills a surface the standard format cannot.
Plan feed โ field by field
One JSON array, one object per plan. The "You get" column is the exact place on eSIMKart the field fills.
| Field | Tier | What to send | You get |
|---|---|---|---|
coverages
array
|
Required | Array of {code, networks} โ ISO 3166-1 alpha-2 country codes the plan works in. One code = a single-country plan; two or more = a regional or global bundle (one row for us, every member country on the destination pages). | Listing on each destination page; regional bundles on the region and global lanes. |
dataCap
number
|
Required | Data amount as a number. 0 means unlimited; the daily cap then shows as "Not stated" until you add fairUsage (or {uncapped: true} when there is genuinely no cap). With dataCapPer "day" it is the daily high-speed allowance. | Data column, data filters, price-per-GB ranking. |
dataUnit
string ยท MB | GB
|
Required | "GB" or "MB". | Data column. |
validity
integer
|
Required | Validity in days (integer, at least 1). | Duration column, duration filters, the /7-day and /30-day lanes. |
prices
object
|
Required | Object of currency code โ amount, e.g. {"USD": 5.8, "EUR": 5.3}. Steady-state price after any promo has ended. USD is used as-is; other currencies are converted with our daily rate. | Price column and every "from $X" price. EUR/GBP shown without conversion rounding for visitors who switch currency. |
link
string
|
Required | Deep link to this plan's buy page. Include our referral parameter if your tracking needs it; we append ours otherwise. | The Buy button on every row. Per-plan links convert better than a homepage link. |
id
string
|
Required | A stable identifier for this plan that does not change between refreshes (SKU, UUID or your database id). | Unbroken price history and the price-drop badge; two tiers with the same data and days stay separate rows. |
planName
string
|
Recommended | Human-readable name, e.g. "Spain 5 GB / 15 days". | Helps our audit when two rows look alike; never shown as-is. |
dataCapPer
string ยท "" | day
|
Recommended | "day" when dataCap resets daily (an unlimited plan with a daily high-speed allowance); empty or absent for a fixed total. | Marks the plan Unlimited and fills the Daily cap column and cap filter. |
reducedSpeed
integer
|
Recommended | Speed in Kbps after the high-speed allowance is used, e.g. 512 or 1000. | The "After cap" column and the speed filter on unlimited plans. |
capacityInfo
string
|
Recommended | A plain sentence describing the fair-use rule, e.g. "1GB of high-speed data per day, then reduced to 512 Kbps". See the unlimited section below for the shapes we parse. | Fair usage line in the plan details; parsed into the Daily cap / After cap columns. |
tethering
boolean
|
Recommended | true or false โ whether hotspot / tethering is allowed. | Hotspot line in the plan details and the "Hotspot" filter on destination pages. |
canTopUp
boolean
|
Recommended | true or false โ whether the plan can be topped up. | Top-ups line in the plan details. |
coverages[].networks
array
|
Recommended | Inside each coverage: [{name: "Movistar", types: ["4G", "5G"]}]. Only read for single-country plans. | The "Networks" line on the destination page and in the plan details. |
telephony
object
|
Recommended | {voice: {inbound, outbound}, sms: {inbound, outbound}} booleans. All false = data-only (shown as such); null = unknown (nothing shown). | Calls & SMS line in the plan details. For included minutes use the voiceMinutes extension. |
eKYC
boolean
|
Recommended | true when the traveller must upload ID before activation, false when not. Omit if unknown. | ID verification line in the plan details. |
activationInfo
string
|
Recommended | A sentence on when validity starts ("on first connection", "at install", "on the date chosen at checkout"). | Activation line in the plan details. |
additionalInfo
string
|
Recommended | A short sentence on how long the traveller has to install, e.g. "Install within 365 days of purchase." | Validity line in the plan details. |
maxSpeed
integer
|
Recommended | Maximum speed in Kbps for plans that are capped, e.g. 10000 for 10 Mbps. | Speed line in the plan details (unlimited plans). |
apn
string
|
Recommended | APN string if the traveller must set it by hand. | APN line in the plan details. |
internetBreakouts
array
|
Recommended | [{country: "Germany"}] โ where traffic exits to the internet. | "Data routes via" line in the plan details. |
subscription
boolean
|
Recommended | true for recurring subscriptions. We skip those (the site compares one-off plans). | Nothing โ the plan is left out, cleanly. |
payAsYouGo
boolean
|
Recommended | true for metered pay-as-you-go products. | We list PAYG side by side with bundles; tell us once and we set it up by hand. |
esimkart.voiceMinutes
integer
|
Best result | Included call minutes as a number. -1 = unlimited, 0 = data-only. | The calls & SMS filter and the minutes shown on the row. |
esimkart.smsCount
integer
|
Best result | Included SMS as a number. -1 = unlimited, 0 = none. | The calls & SMS filter and the SMS count shown on the row. |
esimkart.phoneNumber
object | array | false
|
Best result | {country: "GB", type: "local" | "virtual"} when the plan includes a phone number โ country is the number's, not the destination's. Several numbers: a list of those objects (all included), or add choose: true to each when the buyer picks one at checkout. false = no number. | A place in the local-number lane (/local-number-esim-plans), marked "Local number" where the number belongs to the destination, and the phone-number line in the plan details. |
esimkart.fairUsage
object
|
Best result | Structured fair-use: {dailyCapMb: 1024, throttleKbps: 512}, or {uncapped: true} when there is genuinely no daily cap. Beats free text โ nothing to parse. | Daily cap and After cap columns, cap and speed filters, and the fair-usage line โ exactly as you state it. |
esimkart.activation
string ยท install | first_use | scheduled
|
Best result | One of "install", "first_use", "scheduled". Optional activationNote for detail. | Activation line in the plan details, in our standard wording. |
esimkart.installWithinDays
integer
|
Best result | Days the traveller has to install after purchase, as an integer. | Validity line in the plan details. |
esimkart.kyc
object
|
Best result | {required: true | false, note: "โฆ"} per plan โ useful where only some destinations need ID. | ID verification line in the plan details. |
esimkart.maxSpeedKbps
integer
|
Best result | Maximum speed in Kbps for any plan, not only unlimited ones. | Speed line in the plan details. |
Fields we read but deliberately ignore
Promo flags (newUserOnly, firstPurchasePromo, promoEnabled, priceInfo) never change the listed price โ we show the steady-state price a returning customer pays. Put a code that is exclusive to eSIMKart readers in the provider profile instead; we show it on every row with a one-click copy. webUrl is read only when link is missing; sku only when id is missing.
Example plan feed
[
{
"id": "es-5gb-15d",
"planName": "Spain 5 GB / 15 days",
"coverages": [
{
"code": "ES",
"networks": [
{
"name": "Movistar",
"types": [
"4G",
"5G"
]
},
{
"name": "Orange",
"types": [
"4G"
]
}
]
}
],
"dataCap": 5,
"dataUnit": "GB",
"dataCapPer": "",
"validity": 15,
"prices": {
"USD": 9.9,
"EUR": 9.2,
"GBP": 7.9
},
"link": "https://example-esim.com/plans/spain-5gb-15d?ref=esimkart",
"tethering": true,
"canTopUp": true,
"telephony": null,
"eKYC": false,
"activationInfo": "Validity starts on first network connection.",
"additionalInfo": "Install within 365 days of purchase.",
"subscription": false,
"payAsYouGo": false,
"esimkart": {
"activation": "first_use",
"installWithinDays": 365,
"voiceMinutes": 0,
"smsCount": 0
}
},
{
"id": "es-unl-7d-1gb",
"planName": "Spain Unlimited / 7 days (1 GB/day high-speed)",
"coverages": [
{
"code": "ES",
"networks": [
{
"name": "Movistar",
"types": [
"4G",
"5G"
]
}
]
}
],
"dataCap": 1,
"dataUnit": "GB",
"dataCapPer": "day",
"reducedSpeed": 512,
"capacityInfo": "1GB of high-speed data per day, then reduced to 512 Kbps",
"validity": 7,
"prices": {
"USD": 14.5
},
"link": "https://example-esim.com/plans/spain-unlimited-7d?ref=esimkart",
"tethering": true,
"canTopUp": false,
"eKYC": false,
"esimkart": {
"fairUsage": {
"dailyCapMb": 1024,
"throttleKbps": 512
},
"activation": "first_use",
"installWithinDays": 180,
"maxSpeedKbps": 100000
}
}
]
Example plan feed โ
Unlimited plans, done right
This is the section most feeds get wrong, and the one travellers filter on most. Three encodings are accepted, in order of preference:
- 1.The fairUsage extension: {"dailyCapMb": 1024, "throttleKbps": 512} or {"uncapped": true}. Nothing to parse; what you send is what shows.
- 2.dataCap + dataCapPer "day" + reducedSpeed: {"dataCap": 1, "dataUnit": "GB", "dataCapPer": "day", "reducedSpeed": 512}.
- 3.A capacityInfo sentence. We parse the shapes below; anything else shows as "Not stated" rather than a guess.
Sentences we parse from capacityInfo
1GB of high-speed data per day, then reduced to 512 KbpsLower speed rate of 1 Mbps after 3 GB usage per day.Includes 5GB/day at full speed, then throttled to 1MbpsFull speed up to 1 GB per day, then up to 1 MbpsSpeed reduced to 1024 kbps after your daily high-speed allowanceTruly unlimited high-speed data โ no daily cap.
Sentences we deliberately do not read as a daily cap
- Speed capped at Up to 10 Mbps for the full validity period. โ a maximum speed is not a throttle after a cap.
- Hotspot usage capped at 2GB per day. โ a hotspot allowance is not a data cap.
- 384kbps โ a bare speed with no cap or cue.
"Not stated" and "No daily cap" are different things on eSIMKart. We only write "No daily cap" when the feed says so explicitly (fairUsage {uncapped: true}, or a sentence like "no daily cap"). dataCap 0 on its own means unlimited with the limits unknown โ it shows as Unlimited with the daily cap "Not stated". A known daily allowance with an unknown speed after it: dataCap + dataCapPer "day" without reducedSpeed โ the cap shows, After cap stays "Not stated". Silence stays "Not stated".
Regional and global bundles
- A plan whose coverages array lists two or more countries becomes one bundle row with every member country attached; it appears on each member's destination page and on the region and global lanes.
- A stable id matters even more here โ bundle rows are keyed by it. Without one we hash the name, days, cap and country list, and a renamed bundle looks like a new plan.
- Bundles covering 50 or more countries are treated as global.
- Network lists are only read for single-country plans; a bundle's networks cannot be attributed to the right country.
Prices and promotions
- Send the steady-state price. Launch offers and first-purchase discounts are ignored so that the site never shows a price a returning customer cannot get.
- A discount code that is exclusive to eSIMKart readers goes in the provider profile (discountCodes) โ we show it on every plan row with one-click copy and on the coupons page. A public campaign anyone can find is a Deal: we list it, it never affects the price shown.
- USD is used as sent. Other currencies are converted with our daily rate; if you can, send USD alongside so the listed price is exactly yours.
Provider profile
One JSON object per provider for the facts the plan feed cannot carry: the 12-fact trust card, networks per country, contact addresses, logos and any code exclusive to eSIMKart. We verify every trust fact against your public pages before it goes live and never ingest this file automatically โ it simply makes that verification a day instead of a week.
| Field | Trust card fact | What to send |
|---|---|---|
legalEntityNamestring ยท max 150 |
Legal entity | Registered company name, e.g. "Example Mobile Ltd". |
headquartersstring ยท max 120 |
Headquarters | City and country of the operating company. |
foundedYearinteger |
Founded | Four-digit year the brand launched. |
refundPolicyobject ยท max 300 |
Refund policy | {text, url} โ when a refund is possible (e.g. "before installation, within 30 days") and the page that says so. |
validityPolicystring ยท max 300 |
Validity starts | When validity starts: at install, on first connection, or on a chosen date. |
fairUsePolicystring ยท max 300 |
Fair-use limit | The general fair-use rule for unlimited plans (per-plan figures go in the plan feed). |
topUpPolicystring ยท max 300 |
Top-ups & rollover | Whether and how plans can be topped up. |
reissuePolicystring ยท max 300 |
Lost device / reinstalling | What happens if the eSIM is deleted or the phone is lost: re-issue, re-install, or new purchase. |
billingCurrencyNotestring ยท max 300 |
Billing currency | Currency you charge in and whether other currencies are converted at checkout. |
supportChannelsarray |
Support | Array of: live_chat, email, whatsapp, phone, help_center |
supportHoursstring ยท max 100 |
Support | Support availability, e.g. "24/7" or "MonโFri 09:00โ18:00 CET". |
paymentMethodsarray |
Payment | Array of: card, paypal, apple_pay, google_pay, samsung_pay, link, crypto, bank_transfer, alipay, wechat_pay, kakao_pay, naver_pay, payco, ideal, bancontact, eps, przelewy24, mb_way |
kycRequiredboolean |
ID verification | true if ID verification is ever required, false if never. Omit when it depends on the destination โ use the per-plan kyc field instead. |
multiDevicePolicystring ยท max 300 |
Trust card fact soon | Whether one purchase can be installed on more than one device, or several eSIMs bought under one account. |
dataExpiryPolicystring ยท max 300 |
Trust card fact soon | What happens to unused data when the plan expires: lost, or kept while a top-up is active. |
networksarray |
Not a trust card fact | [{country: "ES", networks: [{name, types}]}] โ a fallback when the plan feed carries no networks. |
contactEmailsarray |
Not a trust card fact | Addresses for partner mail (catalogue updates, portal sign-in). |
logosobject |
Not a trust card fact | {logo, icon, favicon} โ a wide wordmark, a square mark, and a favicon, as URLs. We need all three. |
discountCodesarray |
Not a trust card fact | [{code, percent, type, endsAt, exclusiveToEsimkart}] โ type is one of first_payment, one_per_customer, all_payments, cashback, gift_data. Only codes exclusive to eSIMKart readers are shown as codes. |
dealsarray |
Not a trust card fact | [{title, url, startsAt, endsAt}] โ public campaigns anyone can find (a seasonal sale, a bundle offer). Listed as Deals on your provider page and the coupons page; never changes the listed price or the ranking. |
Example provider profile
{
"name": "Example eSIM",
"website": "https://example-esim.com",
"legalEntityName": "Example Mobile Ltd",
"headquarters": "London, United Kingdom",
"foundedYear": 2021,
"refundPolicy": {
"text": "Full refund within 30 days if the eSIM has not been installed; technical failures we confirm are refunded at any time.",
"url": "https://example-esim.com/refund-policy"
},
"validityPolicy": "Validity starts on first network connection, not at purchase.",
"fairUsePolicy": "Unlimited plans include a daily high-speed allowance stated on each plan; speed is reduced, never cut off, until the next day.",
"topUpPolicy": "Every plan can be topped up from the account page while it is still valid.",
"reissuePolicy": "A deleted eSIM can be re-issued once by support if it has not been activated; after activation a new plan is needed.",
"billingCurrencyNote": "Charged in USD; EUR and GBP prices are shown at checkout and charged in that currency, no conversion fee.",
"supportChannels": [
"live_chat",
"email",
"whatsapp"
],
"supportHours": "24/7 in English and Spanish",
"paymentMethods": [
"card",
"paypal",
"apple_pay",
"google_pay"
],
"kycRequired": false,
"multiDevicePolicy": "One eSIM per purchase, installable on one device; buy several plans under one account.",
"dataExpiryPolicy": "Unused data is lost when the plan expires; a top-up before expiry keeps it.",
"networks": [
{
"country": "ES",
"networks": [
{
"name": "Movistar",
"types": [
"4G",
"5G"
]
}
]
}
],
"contactEmails": [
"[email protected]"
],
"logos": {
"logo": "https://example-esim.com/brand/logo-wide.png",
"icon": "https://example-esim.com/brand/icon-square.png",
"favicon": "https://example-esim.com/favicon.png"
},
"discountCodes": [
{
"code": "ESIMKART10",
"percent": 10,
"type": "first_payment",
"endsAt": null,
"exclusiveToEsimkart": true
}
],
"deals": [
{
"title": "Summer sale: 20% off every Europe bundle",
"url": "https://example-esim.com/summer",
"startsAt": "2026-06-01",
"endsAt": "2026-08-31"
}
]
}
Recommended URL
Any URL works. If you are creating a new endpoint for us, this naming keeps the ref parameter and the extensions in one obvious place, next to the feeds you may already publish for other sites:
- Plan feed
https://{your-domain}/api/esimkart/data-plans?ref=esimkart- Provider profile
https://{your-domain}/api/esimkart/provider.json
Optional query parameters we understand: ccy=USD,EUR (which currencies to include) and ref= (we pass through whatever tracking value you put on link).
Delivery
- A public URL is ideal (a static JSON file refreshed at least daily is fine). Authentication we support: none, a static header or query key, or OAuth client credentials.
- We fetch nightly โ one request for the plan feed. ETag or Last-Modified headers are welcome, not required.
- If your edge challenges bots, allow our fetch addresses at the edge (for Cloudflare: a WAF rule that skips managed challenges for those IPs). An allowlist inside your application is not enough โ a challenge page is returned before the request reaches it. We send our fetch addresses when you reply; they are not published here.
- Send the URL and, if any, the credentials to [email protected] or through the partner form. Existing partners can also open a support ticket from the portal.
Done-for-you
No developer? We build the feed for you.
Send us what you have โ a CSV export, your storefront URL, an existing API โ and we build and host the mapping to this guide, fill the provider profile from your public pages, and send you the validation report before anything goes live.
- Listing on eSIMKart is always free and never depends on this โ every provider is listed from whatever data exists, and nothing here changes rankings.
- What you pay for is the structured work: every field in the tiers above mapped from your data, hosted and refreshed nightly by us, and a report of what fills which surface.
- Delivered within one week of receiving your data; changes to your catalogue afterwards flow through automatically.
See your own gaps
Partners with a Partner Insights seat get a Catalogue quality page: which of these facts your feed already fills, the site average, and a link back to the field that closes each gap.
Changelog
- 2026-09-11 ยท First version: standard DataPlan fields, eSIMKart extensions (voiceMinutes, smsCount, phoneNumber, fairUsage, activation, installWithinDays, kyc, maxSpeedKbps), provider profile.
- 2026-09-11 ยท Done-for-you feed setup added: one-time fee, free with a Partner Insights seat.
- 2026-10-04 ยท phoneNumber accepts a list (several numbers, or choose: true when the buyer picks one) and false for "no number"; the number's country now decides "Local number" in the local-number lane.