Plan feed
Version 2026-10-28, effective 28 October 2026
For price-comparison sites listing Simvito travel eSIMs: every plan we sell, with its price in each checkout currency, in the eSIMDB Provider API DataPlan format.
1. Quick start
- In your partner dashboard, open API keys and create a key. It is shown once; keep it on your server.
- Pull the feed. Replace
YOUR_KEYwith your key:
curl --compressed -H "x-api-key: YOUR_KEY" https://api.simvito.com/feeds/v1/plans -o plans.json
- Show each record with its
linkas it is. The link opens checkout on simvito.com with that plan selected and carries your code (via=yourcode); an order from it is credited to you. - Optional: add
&subid=with your own ID for the page or placement (letters, digits,._-, up to 64; nothing about the visitor). It comes back on the order assub_id, next tovariant_id(the link’sv=).
2. Authentication
- Send your key in the
x-api-keyheader, as in the eSIMDB Provider API.Authorization: Bearer svp_…is accepted too. - Each site has its own keys. The dashboard shows when each key was last used, and a key can be revoked on its own. A revoked key stops working within 5 minutes.
- If our key service is briefly unreachable, keys keep working on their last check for up to 24 hours, so the feed stays up; a key revoked during such an outage can work until it ends.
- The same key reads your orders through the orders API.
GET https://api.simvito.com/feeds/v1/plans x-api-key: svp_your_key
3. Response
- A JSON array, one record per plan and validity period, in the eSIMDB Provider API DataPlan format plus two extension fields. A reader built for that format needs no new parser.
- About 33,500 records: about 55 MB with every currency, about 46 MB with USD only, under 5 MB with
Accept-Encoding: gzip. - The response has no customer data: only the catalog, prices and your own purchase links.
- Every response, errors included, carries
x-request-id. Quote it when you write to us about a request.
A real record (a daily plan with the full fair-use fields), with your code in the link:
{
"planName": "Japan 3GB/day for 7 Days (5G, 128 Kbps after cap)",
"validity": 7,
"dataCap": 3,
"dataUnit": "GB",
"prices": {
"USD": 7.95,
"EUR": 7.27,
"GBP": 6.08,
"HKD": 62.38,
"CNY": 54.07,
"SGD": 10.39,
"JPY": 1280,
"AUD": 11.53,
"NZD": 14.22,
"CAD": 11.37,
"BRL": 43.36,
"IDR": 147086,
"MYR": 33.16,
"PHP": 518.93,
"THB": 273.84,
"KRW": 10767,
"PLN": 32.01,
"CHF": 6.72,
"SEK": 80.58,
"TWD": 264
},
"coverages": [
{
"code": "JP",
"networks": [
{
"name": "KDDI",
"types": ["4G", "5G"]
},
{
"name": "SoftBank",
"types": ["4G", "5G"]
}
]
}
],
"subscription": false,
"promoEnabled": false,
"telephony": null,
"hasAds": false,
"payAsYouGo": false,
"newUserOnly": false,
"link": "https://simvito.com/checkout/?s=japan&v=variant_01M2S8RTA4JXWNBMT0CNKZVS7G&d=7&via=yourcode&utm_source=yourcode&utm_medium=referral",
"dataCapPer": "day",
"reducedSpeed": 128,
"capacityInfo": "Unlimited data at 128 Kbps after 3GB of high-speed data per day is used up.\nThe daily high-speed allowance resets at 00:00 (UTC+8).",
"validityInfo": "Each day of validity is a full 24-hour period from the start of plan validity.\nActivate within 90 days of purchase.",
"additionalInfo": "Validity starts when the eSIM first connects to a network at the destination.\nOn Android phones, TikTok doesn't work on this plan.",
"canTopUp": false,
"internetBreakouts": [
{ "country": "HK" },
{ "country": "SG" }
],
"dailyReset": {
"type": "calendar",
"time": "00:00",
"timezone": "UTC+8"
}
}4. Fields
A field that doesn’t apply is omitted, as in the eSIMDB format. Unknown values are never filled with a guess.
| Field | Type and unit | Meaning | Omitted or null |
|---|---|---|---|
planName | string, ≤ 100 | Destination, allowance and validity, e.g. Japan 1GB/day for 7 Days. Unique in the feed; when two plans would read the same, a short qualifier is added ((5G), (512 Kbps after cap), (stops at cap), (app-restricted)). An unlimited plan capped from the start always carries the cap (Thailand Unlimited for 7 Days (max 10 Mbps)). A multi-country plan names its region with the number of destinations (Europe (35 destinations)) or lists the countries, shortened when they don’t fit (China mainland and 2 more destinations); coverages always lists every country. | Always present. |
validity | integer, days | Each validity period is its own record with its own price. | Always present. |
dataCap, dataUnit | integer; MB or GB | High-speed allowance. Whole gigabytes in GB, anything else in MB (1.5 GB = 1536 MB). 0 = unlimited with no high-speed cap (see maxSpeed). | Always present. |
dataCapPer | "day" | The allowance renews every day (see dailyReset). | Omitted: the allowance is for the whole validity. |
reducedSpeed | integer, kbps | Speed after the allowance is used up; data continues at this speed. | Omitted, with no exhaustionBehavior: data stops when the allowance is used up. |
exhaustionBehavior | "unknown" | Extension. The supplier hasn’t said whether data stops or continues slowly after the allowance. Don’t read the missing reducedSpeed as “stops”. | Omitted: the after-cap behaviour is known (see reducedSpeed). |
maxSpeed | integer, kbps | Speed cap from the start, e.g. unlimited at 10 Mbps. | Omitted: no cap from the start. |
capacityInfo | string | The fair-use policy in words, with the reset rule where known, e.g. Unlimited data at up to 10 Mbps. | Omitted: nothing known to say. |
validityInfo | string | How days are counted (calendar days in a stated time zone, or 24-hour periods) and the activation deadline. | Omitted: not stated. |
additionalInfo | string | When validity starts and apps that don't work on the plan, one item per line. | Omitted: nothing to add. |
prices | object, currency → number | The final card price in each currency. See Prices. | Always present; USD always included. |
coverages | array of { code, networks? } | Countries (ISO 3166-1 alpha-2). networks lists the operators we can confirm there, with their network types (2G–5G, LTE). | networks omitted: we haven’t confirmed the operator, not that there is none. |
internetBreakouts | array of { country } | Where the data exits to the internet (ISO2): the IP country websites see. | Omitted: the supplier doesn't give it. |
dailyReset | object or null | Extension, daily plans only. See Extension fields. | null: the supplier hasn’t said how the daily allowance renews. Omitted on plans that aren’t daily. |
canTopUp | boolean | true: more data or days can be bought for the same eSIM on simvito.com. | Omitted: not stated. |
eKYC | boolean | Identity verification is required. | Omitted: not stated. |
tethering | boolean | true: hotspot / tethering allowed. | Omitted: the supplier hasn't said. |
telephony | null | Data-only eSIMs: no phone number, no calls. | Always null. |
subscription, payAsYouGo, newUserOnly, hasAds | boolean | One-off purchases, open to everyone, no ads. | Always false. |
promoEnabled | boolean | Always false: comparison sites have no discount code, and a link never changes the price. | Always present. |
link | URL | Purchase link for this exact plan and validity, with your referral. Use it as it is; you may add &subid=<your id>. | Always present. |
5. Extension fields
Two fields are additions to the eSIMDB DataPlan format; everything else keeps that format’s names, types and omission rules. A reader that ignores the two still reads every record; it only loses the difference between “stops at cap” and “not stated”, and the reset time, which capacityInfo also gives in words.
exhaustionBehavior:"unknown"when it isn’t confirmed yet what happens after the allowance.capacityInfosays the same in words.dailyReset: when a daily allowance renews. Present on every daily plan (dataCapPer: "day").
| dailyReset | Meaning |
|---|---|
{ "type": "calendar", "time": "00:00", "timezone": "UTC+8" } | Renews at a fixed time of day in that time zone. time can be a window such as "23:00-24:00". |
{ "type": "calendar", "time": null, "timezone": "UTC+8" } | Renews on calendar days in that time zone; the exact time isn't given. Either member can be null when not given. |
{ "type": "rolling", "time": null, "timezone": null } | Renews every 24 hours from when the plan's validity started. |
null | The supplier hasn't said how the daily allowance renews. |
The rest of the fair-use policy uses the standard fields: daily high-speed data is dataCap + dataUnit with dataCapPer: "day", the speed after the daily cap is reducedSpeed, and a speed cap from the start is maxSpeed.
6. Prices
priceshas one entry per currency a buyer can pay in by card at checkout (currently 20: USD, EUR, GBP, HKD, CNY, SGD, JPY, AUD, NZD, CAD, BRL, IDR, MYR, PHP, THB, KRW, PLN, CHF, SEK, TWD), unless your account receives USD only.- Each amount is the final amount charged for a card payment in that currency, after rounding, with no fees added later. It matches the checkout page. Other payment methods cost the same or less.
- Prices are the same for every partner and for visitors who come to simvito.com directly.
- JPY, KRW, IDR and TWD are whole numbers.
7. Caching and exchange rates
- Every
200carries anETag. Send it back asIf-None-Match(the weak formW/"…"works too) and you get304 Not Modifiedwith no body until the catalog, a price or an exchange rate changes. - Right after a change, two requests a few seconds apart can for up to a minute alternate between the new and the previous version, each with its own
ETag; the newer one wins on your next pull. - Non-USD prices use our checkout exchange rates, which update once a day, so they can change while the USD price doesn’t.
X-Rates-As-Ofsays which day’s rates the prices use;X-Currencieslists the currencies inprices.
ETAG=$(grep -i '^etag:' headers.txt | cut -d' ' -f2- | tr -d '\r') curl -sS --compressed -H "x-api-key: YOUR_KEY" -H "If-None-Match: $ETAG" -D headers.txt -o plans.json https://api.simvito.com/feeds/v1/plans
8. Rate limits
- Once an hour is right, with
If-None-Match: you pick up new rates the same day. Don’t pull more than once a minute. - Each IP address can make about 30 requests a minute; above that you get
429withRetry-Afterin seconds.
9. Errors
Errors are JSON: { "error": { "code": "…", "message": "…" } }. Your dashboard’s Integration status page lists your recent errors with their request IDs.
| HTTP | code | Meaning | What to do |
|---|---|---|---|
| 401 | missing_key | No key in the request. | Send x-api-key. |
| 401 | invalid_key | The key isn't one of ours. | Copy it again, or create a new key. |
| 401 | revoked | The key was revoked. | Create a new key. |
| 403 | no_scope | The key can't read the feed. | Create a new key under API keys. |
| 403 | forbidden | Your partner account isn't active. | Write to partners@simvito.com. |
| 429 | rate_limited | Too many requests from your IP address. | Wait Retry-After seconds. |
| 503 | catalog_unavailable | We refused to publish an incomplete catalog (we never serve a partial list), usually while it updates. | Retry after Retry-After seconds; keep your last copy. |
| 503 | auth_unavailable | We can't check your key right now. | Retry after Retry-After seconds. |
| 503 | format_unavailable | The feed format set for your account isn't available yet. | Write to partners@simvito.com. |
| 503 | terms_conflict | Your account's settings need a check on our side. | Write to partners@simvito.com. |
| 500 | internal_error | Something went wrong on our side. | Retry later; if it keeps happening, send us the x-request-id. |
10. Destination links (optional)
Buttons to our destination pages, such as “Japan eSIM plans”, in the eSIMDB Provider API DestinationLink format, if you’d like to show them on your own destination pages. The plans themselves are in the plan feed; this list has no prices.
GET https://api.simvito.com/feeds/v1/destination-links x-api-key: YOUR_KEY
- The same key, errors,
x-request-id,ETag/304and rate limit as the plan feed (the per-address limit is shared between the two). - One record per destination page and language, about 900 in all. It changes only when we add or retire a destination: once a day with
If-None-Matchis plenty. name(≤ 30 characters) is in the page’s language.linkalready carries your referral, like the plan links.targetLanguages: our English pages are listed foren,frandes(we have no French or Spanish pages), Japanese pages forja, Italian pages forit.targetsare ISO 3166-1 alpha-2 codes: the country of a single-country page, every covered country of a multi-country one; no region slugs.
[
{
"name": "Japan eSIM plans",
"link": "https://simvito.com/esim/japan/?via=yourcode&utm_source=yourcode&utm_medium=referral",
"type": "web",
"targetLanguages": ["en", "fr", "es"],
"targets": ["JP"]
},
{
"name": "日本のeSIMプラン",
"link": "https://simvito.com/ja/esim/japan/?via=yourcode&utm_source=yourcode&utm_medium=referral",
"type": "web",
"targetLanguages": ["ja"],
"targets": ["JP"]
}
]11. Orders from your links
- A visit through a record’s
linkis recorded on our server; an order within 30 days is credited to the latest valid referral. The full rules: Attribution rules. - Your orders and commission are in the dashboard under Orders, and in the orders API.
12. Versioning and changes
The version is in the path (/feeds/v1). Changes are listed here with their date.
| Date | Change |
|---|---|
| 2026-10-28 | First version: a key per site in x-api-key, every checkout currency in prices, X-Rates-As-Of and X-Currencies, the exhaustionBehavior and dailyReset extensions. |
| 2026-10-28 | Wording: an unlimited plan capped from the start carries the cap in planName and gets a capacityInfo; multi-country names read (N destinations) or list the countries; the app-restriction and unconfirmed after-cap sentences were rewritten. New, optional: /feeds/v1/destination-links. Every ETag changed with it. |
13. Questions
Email partners@simvito.com with your partner account’s email address and, for a request, its x-request-id. Never send your API key.