Plans API and partnerships for travel businesses
Comparison sites, publishers, resellers and travel agencies can list or sell our travel eSIMs. The plans API gives you every plan we sell online, with final prices, coverage and product links — in one JSON document.
This page is available in English and Polish.
Pick the model that fits you. If none does, apply anyway and tell us what you have in mind.
List our plans with live prices through the API. One key per site, deep links with your own tracking parameters.
Your own promo code and commission on every purchase — through our existing affiliate programme.
Selling eSIMs to your own customers or equipping a team? Tell us your markets and volume and we come back with a proposal.
Send travellers a destination-specific eSIM link with your partner code. We handle the sale, delivery and installation support.
A read-only REST endpoint that returns one JSON document: every plan that can be bought online on esimpark.com, with the same prices the product page shows and the checkout charges.
https://uj684erdvk.execute-api.eu-central-1.amazonaws.com/v1x-api-key header, one key per partnerEvery request needs your API key in the x-api-key header. Keys are issued per partner after we review your application — apply below or write to partner@esimpark.com.
403.Two GET endpoints. There are no query parameters: one response contains every plan in every currency.
GET/v1/plans | All destinations and plans (the document described below). |
GET/v1/schema | JSON Schema (2020-12) of the /plans response. |
Example request
curl --compressed \
-H "x-api-key: $ESIMPARK_API_KEY" \
-H 'If-None-Match: "<last ETag>"' \
https://uj684erdvk.execute-api.eu-central-1.amazonaws.com/v1/plansExample response (shortened: one destination, two of its plans)
{
"apiVersion": 1,
"updatedAt": "2026-10-27T10:50:12Z",
"dataVersion": "92291e58d693d2be",
"schema": "/v1/schema",
"provider": {
"name": "eSIM Park",
"website": "https://www.esimpark.com/",
"contact": "partner@esimpark.com"
},
"currencies": [
"USD",
"EUR",
"GBP",
"PLN",
"RON",
"HUF"
],
"pricesIncludeVat": true,
"esimFee": {
"amount": {
"USD": 1.63,
"EUR": 1.36,
"GBP": 1.23,
"PLN": 6.19,
"RON": 7.42,
"HUF": 490
},
"appliesTo": "Purchases that need a new eSIM profile (normally the first purchase). Top-ups onto an eSIM Park eSIM the traveller already has are exempt.",
"waived": {
"from": "2026-09-16T00:00:00+02:00",
"until": "2027-01-01T00:00:00+01:00"
}
},
"planTerms": {
"validityStarts": "first connection to a supported network at the destination",
"delivery": "QR code by e-mail right after payment",
"hotspot": true,
"topUps": true,
"refund": "full refund within 15 days if the eSIM was not installed and no data was used"
},
"linkParameters": {
"cur": "ISO currency code to open the page in, e.g. ?cur=EUR",
"ref": "partner code for attribution, e.g. ?ref=CODE (ask us for one)",
"utm_*": "utm_source / utm_medium / utm_campaign / utm_content are recorded"
},
"destinations": [
{
"id": "torokorszag",
"name": "Turkey",
"type": "country",
"countries": [
{
"iso2": "TR",
"name": "Turkey",
"networks": [
"Turk Telekom Turkey",
"Vodafone Turkey"
]
}
],
"url": "https://www.esimpark.com/esim-turkey.html",
"localizedUrls": {
"en": "https://www.esimpark.com/esim-turkey.html",
"pl": "https://www.esimpark.com/pl/esim-turcja.html"
}
}
],
"plans": [
{
"id": "torokorszag-m-5gb-15d",
"destinationId": "torokorszag",
"name": "Turkey 5 GB / 15 days",
"countries": [
"TR"
],
"dataType": "fixed",
"dataGb": 5,
"dailyDataGb": null,
"validityDays": 15,
"throttling": null,
"prices": {
"USD": 5.9,
"EUR": 4.9,
"GBP": 4.9,
"PLN": 22.9,
"RON": 27.9,
"HUF": 1790
},
"url": "https://www.esimpark.com/esim-turkey.html"
},
{
"id": "torokorszag-xl-3gbday-5d",
"destinationId": "torokorszag",
"name": "Turkey 3 GB/day / 5 days",
"countries": [
"TR"
],
"dataType": "daily",
"dataGb": null,
"dailyDataGb": 3,
"validityDays": 5,
"throttling": {
"afterPercentOfDailyData": 80,
"speedKbps": 128,
"dailyDataCarriesOver": false
},
"prices": {
"USD": 13.9,
"EUR": 11.9,
"GBP": 9.9,
"PLN": 50.9,
"RON": 60.9,
"HUF": 3990
},
"url": "https://www.esimpark.com/esim-turkey.html"
}
]
}The values come from the live document at the time this page was built.
New optional fields may appear at any time — ignore the ones you don't know. Amounts are in major units (22.9 = 22.90); HUF has no decimals.
Top level
| Field | Type | Meaning |
|---|---|---|
apiVersion | integer | Always 1 on this version. |
updatedAt | string (date-time) | When the content last changed — not when the file was rebuilt. |
dataVersion | string | Fingerprint of the content; the same value means nothing changed. Also sent as the ETag. |
schema | string | Path of the JSON Schema on this API (/v1/schema). |
provider | object | name, website and contact e-mail. |
currencies | string[] | ISO 4217 codes; every prices object has exactly these keys. |
pricesIncludeVat | boolean | true: the prices are final consumer prices including VAT. |
esimFee | object | One-time fee for a new eSIM profile, on top of the plan price. |
esimFee.amount | object | The fee per currency. |
esimFee.appliesTo | string | When it is charged: purchases that need a new eSIM profile (normally the first one). Top-ups are exempt. |
esimFee.waived | object | null | from / until (exclusive): while now is inside this window the fee is not charged. |
planTerms | object | Terms true for every plan: when validity starts, delivery, hotspot, top-ups, refund. |
linkParameters | object | Query parameters the product pages understand (cur, ref, utm_*). |
destinations | object[] | One entry per destination. |
plans | object[] | One entry per plan, flat. |
destinations[]
| Field | Type | Meaning |
|---|---|---|
id | string | Opaque, stable identifier — don't parse it. |
name | string | English name, as on the product page. |
type | string | country, region or global. |
countries | object[] | Every covered country. |
countries[].iso2 | string | ISO 3166-1 alpha-2, upper case. |
countries[].name | string | English country name. |
countries[].networks | string[] | Partner networks in that country. |
url | string | English product page. |
localizedUrls | object | The product page in our other languages, keyed by language code. |
plans[]
| Field | Type | Meaning |
|---|---|---|
id | string | Stable while the plan exists; a different allowance or validity gives a new id. |
destinationId | string | Points to destinations[].id. |
name | string | e.g. Turkey 5 GB / 15 days. |
countries | string[] | ISO alpha-2 codes covered (same as the destination's). |
dataType | string | fixed: dataGb for the whole validity. daily: dailyDataGb every day. |
dataGb | number | null | Total data in GB (fixed plans). |
dailyDataGb | number | null | Data per day in GB (daily plans). |
validityDays | integer | Days from the first connection at the destination. |
throttling | object | null | null: full speed until the data is used up. |
throttling.afterPercentOfDailyData | number | Speed drops after this share of the day's data. |
throttling.speedKbps | number | Speed after the drop, until the next day. |
throttling.dailyDataCarriesOver | boolean | Unused daily data does not carry over (false). |
prices | object | Final price per currency. |
url | string | Product page to send the traveller to. |
Limits apply per key: 5 requests per second (short bursts up to 10) and 1 000 requests per day. The daily count resets at 00:00 UTC. Error bodies are JSON: {"message": "…"}.
| Status | When | Response |
|---|---|---|
200 | OK | The document. |
304 | You sent the current ETag in If-None-Match | No body — keep your copy. |
403 | Missing, wrong or disabled x-api-key | Missing or invalid x-api-key header. Request a key at partner@esimpark.com. |
403 | Unknown path or method | Forbidden. Endpoints: GET /v1/plans, GET /v1/schema with an x-api-key header. |
429 | More than 5 requests per second | Too many requests (limit: 5 per second). Retry after a short pause. Retry-After: 1 |
429 | Daily quota of 1 000 requests used up | Daily quota (1000 requests) exceeded; it resets at 00:00 UTC. |
5xx | Temporary error on our side | Retry later with exponential backoff. |
ETag, Last-Modified and Cache-Control: private, max-age=3600.If-None-Match: if nothing changed you get 304 with no body.dataVersion tells you whether anything moved./v1/./v2/).By using a key you agree to the following:
Tell us who you are and how you'd use the data. We usually reply within two working days from partner@esimpark.com.