e-eSIM Catalog API

MCP JSON-RPC API for e‑SIM travel data plans

Operations 1

POST /mcp MCP JSON-RPC 2.0 endpoint — handshake, tools/list, tools/call, resources, prompts #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/e-esim-com:e-esim-catalog-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

e-esim-com-openapi.json Raw ↑
{
  "openapi": "3.1.0",
  "info": {
    "title": "e-eSIM eSIM Catalog",
    "version": "2.0.6",
    "summary": "Prepaid travel eSIM data plans for over 160 countries and regions.",
    "description": "Prepaid travel eSIM data plans for over 160 countries and regions from e-eSIM. Search by destination (any language, one country or several, or a region), get every plan fact the catalogue holds — coverage list, daily or total data, full-speed allowance and reduced speed, carrier and network generation, validity and the clock it runs on, fixed expiry dates, daily reset, vendor notices, price — let the server recommend plans for a whole trip, read the shop's own facts (delivery, payment, refund policy, apps, devices) and hand the customer a direct buy link. Three plan shapes: Daily Surf (a fresh high-speed allowance every day, then reduced speed for the rest of that day), Trip Surf (one data pool for the whole validity) and All You Can Surf (a daily full-speed allowance, then unlimited in volume at a reduced speed — every grade, including titanium). The eSIM is delivered on screen and by email immediately after payment — no account, no app, no top-ups.\n\n## This is an MCP server, not a REST API\n\nEvery call is `POST /mcp` with a JSON-RPC 2.0 body. The path never changes — only the body does. Transport is MCP streamable-HTTP, protocol version `2025-06-18`. Server version 2.0.6.\n\n### Call order\n\n1. `POST /mcp` with `method: \"initialize\"`. The response carries an **`Mcp-Session-Id`** response header and the server instructions (read them — they carry the pricing and presentation rules).\n2. `POST /mcp` with `method: \"notifications/initialized\"` and that header. Returns 202 with an empty body — it is a notification, so no JSON-RPC result comes back.\n3. Every later request repeats the `Mcp-Session-Id` header.\n\nThe server also answers a `tools/call` without the handshake (the session id is advisory, never enforced) — the handshake is still the correct order because it delivers the instructions.\n\n### Reading errors correctly\n\nJSON-RPC errors are returned with **HTTP 200** and an `error` object in the body. This is what the JSON-RPC 2.0 and MCP specifications require, and it is deliberate. Do not treat a 200 as success without checking that `result` is present and `error` is absent. A tool that cannot fulfil a request (unknown plan, unknown destination, missing argument) answers with `result.isError: true` and a `structuredContent.code` such as `not_found`, `unknown_destination` or `invalid_argument`. A body that is not valid JSON at all returns HTTP 400. `GET /mcp` returns 405: this server implements streamable-HTTP without an SSE stream, so refusing GET is correct.\n\n### Results\n\nEvery tool result carries `structuredContent` (the JSON object) and the same JSON as text in `content[0].text`. Plans carry only the facts the catalogue holds — an absent field is unknown, never to be inferred. `coverage_countries` lists every country a plan works in (ISO code, name), `covers_via` marks a multi-country plan returned for a single-country search. A regional plan without coverage_countries lists its countries only on its product page.\n\n### Prices\n\n`price` is always the full fixed price of the plan (`price_basis` is always `total`) — never a per-day or per-GB rate, and there is no discount-code field; `recommend_plan` returns `total_for_trip` (price × plans_needed). Prices are quoted in `pricing_bucket` (language-region, default en-us / USD); pass `bucket` or `currency` to quote in the customer's own.\n\n### Limits and safety\n\nRate limit: 60 requests per minute per session and 120 per IP for unrecognised clients (recognised assistants: 120 per session, 480 per IP); exceeding it returns 429 by design. No authentication, no API key, no account — the endpoint is public and read-only. `start_checkout` only returns a `buy_url`; it takes no payment and creates no order, so every tool here is safe to call in a test run. Prices and availability are live, so exact values change between calls — assert on shape, not on specific prices.\n",
    "contact": {
      "name": "IbiPoint Ltd",
      "url": "https://e-esim.com/en-us/",
      "email": "contact@e-esim.com"
    },
    "x-mcp": {
      "endpoint": "https://e-esim.com/wp-json/e-esim/mcp",
      "transport": "streamable-http",
      "protocolVersion": "2025-06-18",
      "serverCard": "https://e-esim.com/.well-known/mcp/server-card.json",
      "llms": "https://e-esim.com/llms.txt"
    }
  },
  "servers": [
    {
      "url": "https://e-esim.com/wp-json/e-esim",
      "description": "e-eSIM MCP server (public, no auth)"
    }
  ],
  "externalDocs": {
    "description": "Plain-language guide for LLM agents",
    "url": "https://e-esim.com/llms.txt"
  },
  "paths": {
    "/mcp": {
      "post": {
        "operationId": "mcpCall",
        "summary": "MCP JSON-RPC 2.0 endpoint — handshake, tools/list, tools/call, resources, prompts",
        "description": "All MCP traffic goes here. Pick the request body from the examples; they are in call order. Send Mcp-Session-Id on every call after initialize.",
        "parameters": [
          {
            "name": "Mcp-Session-Id",
            "in": "header",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Returned by initialize as a response header. Repeat it on every subsequent request. Omit it only on the initialize call itself."
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/JsonRpcRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful JSON-RPC response"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "JsonRpcRequest": {
        "type": "object",
        "properties": {
          "jsonrpc": {"type": "string"},
          "id": {"type": "integer"},
          "method": {"type": "string"},
          "params": {"type": "object"}
        },
        "required": ["jsonrpc", "id", "method"]
      }
    }
  },
  "security": []
}