Docs
Developer CenterDashboardesimoa.com
    • Introduction
    • Quickstart
    • Authentication
    • Overview
    • List eSIMs
    • Get an eSIM
    • Countries
    • OpenAPI
    • Tracking & commission
    • Rate limits & errors
    • Overview
    • Claude
    • ChatGPT
    • Gemini
    • Other MCP clients
    • Overview
    • Authentication
    • Products
    • Product detail
    • Countries
    • Errors & rate limits
  1. Docs
  2. Partner API (B2B)
  3. Products

Partner API (B2B)

Products

GET /b2b/v1/products — search esimoa products by country, keyword, duration, data and more.

On this page
  • Request
  • Query parameters
  • Sorting
  • Pagination
  • Response
  • The PartnerProduct object

Request#

GET/b2b/v1/products
curl "https://api.esimoa.com/b2b/v1/products?country=JP&isUnlimited=true&minDays=5&sortBy=price&limit=20" \
  -H "X-API-Key: $ESIMOA_PARTNER_KEY"
const params = new URLSearchParams({
  country: 'JP',
  isUnlimited: 'true',
  minDays: '5',
  sortBy: 'price',
  limit: '20',
  page: '1',
});
const res = await fetch(`https://api.esimoa.com/b2b/v1/products?${params}`, {
  headers: { 'X-API-Key': process.env.ESIMOA_PARTNER_KEY },
});
const body = await res.json();
if (!res.ok) throw new Error(`${body.code}: ${body.message}`);

const { data: products, total, page, limit } = body;
import os
import requests

res = requests.get(
    "https://api.esimoa.com/b2b/v1/products",
    params={"country": "JP", "isUnlimited": "true", "minDays": 5, "sortBy": "price", "limit": 20, "page": 1},
    headers={"X-API-Key": os.environ["ESIMOA_PARTNER_KEY"]},
    timeout=10,
)
body = res.json()
if not res.ok:
    raise RuntimeError(f"{body['code']}: {body['message']}")

products = body["data"]

Query parameters#

All parameters are optional. Out-of-range values return 400; unknown parameters are ignored.

ParameterTypeDescription
countrystringISO 3166-1 alpha-2 country code (e.g. JP). Other formats return 400
qstringKeyword (up to 60 characters)
isUnlimitedbooleantrue = unlimited only, false = exclude unlimited — true | false (1 | 0 also accepted)
minDays · maxDaysintegerValidity range in days, 1–365
minDataGBnumberMinimum data in GB, 0–1000
hasLocalNumberbooleanIncludes a local phone number — true | false (1 | 0 also accepted)
isMultiCountrybooleanMulti-country product — true | false (1 | 0 also accepted)
sortBystringrecommended (default) | price | validity | data
sortOrderstringasc | desc — defaults per sortBy when omitted
pageintegerStarts at 1, default 1
limitinteger1–50, default 20

Sorting#

sortByDefault sortOrderMeaning
recommendeddescesimoa recommended ranking (includes sales) — same order as the website
priceascLowest price first
validityascShortest validity first
datadescMost data first

Pagination#

page starts at 1. The response echoes page and limit along with total, so the last page is ceil(total / limit).

Response#

200 OKjson
{
  "success": true,
  "data": [
    {
      "id": "partner_9VKPYQ3JRYVK5797",
      "name": "Japan Unlimited 5일",
      "country": "Japan",
      "countryCode": "JP",
      "coverageCountries": ["JP"],
      "isMultiCountry": false,
      "dataAmount": "Unlimited",
      "isUnlimited": true,
      "validityDays": 5,
      "priceKRW": 12000,
      "currency": "KRW",
      "networkType": "5G",
      "localNetworks": ["SoftBank"],
      "isLocalNetwork": true,
      "fupPolicy": null,
      "hotspotEnabled": true,
      "hasLocalNumber": false,
      "voiceMinutes": null,
      "smsCount": null,
      "supportTopUp": false,
      "supportsUsim": false,
      "activationType": "instant"
    }
  ],
  "total": 128,
  "page": 1,
  "limit": 20
}

The PartnerProduct object#

FieldTypeDescription
idstring'partner_<packageCode>' — the same product id used on esimoa.com
namestringDisplay name in the form "<area> <data> <N>일" (Korean day suffix). Build your own label from the structured fields for other languages
countrystringCoverage area label (multi-country products list their countries)
countryCodestring?ISO country code — omitted when not available
coverageCountriesstring[]Country codes the product works in
regionstring?Region — omitted when not available
isMultiCountrybooleanMulti-country product
dataAmountstringCatalog label ('10GB', 'Unlimited', '1GB/Day + Unlimited' …)
dataAmountGBnumber?Data in GB — omitted for fully unlimited products
isUnlimitedbooleanUnlimited plan
validityDaysintegerValidity in days
priceKRW / currencyinteger / 'KRW'esimoa retail price in KRW — there is no partner price in v1
networkTypestringNetwork (e.g. 5G) — '' when unknown
localNetworksstring[]Local carriers
isLocalNetworkbooleanUses a local network rather than roaming
fupPolicystring | nullFair-use policy (FUP) text
hotspotEnabledboolean | nullTethering allowed — null = unknown
hasLocalNumberbooleanIncludes a local phone number
voiceMinutesinteger | nullVoice minutes — -1 = unlimited, null = not provided
smsCountinteger | nullSMS count — null = not provided
supportTopUpboolean | nullCan be topped up — null = unknown
supportsUsimbooleanAlso sold as a physical USIM
activationTypestringActivation type (e.g. 'instant')

Note

Supplier and cost fields are never part of the response. Fields are only ever added and names and meanings do not change — parse so unknown fields are ignored.

Last updated: October 1, 2026

PreviousAuthenticationNextProduct detail

On this page

  • Request
  • Query parameters
  • Sorting
  • Pagination
  • Response
  • The PartnerProduct object

APIs and MCP for bringing esimoa eSIMs to your product

Resources

  • Docs
  • API reference
  • Partner API (B2B)
  • MCP server
  • OpenAPI spec

esimoa

  • Home
  • eSIM plans
  • Developer Center
  • Dashboard
  • Partner portal

Company

  • About Us
  • Partnership
  • Terms of Service
  • Privacy Policy
  • Delivery & Refunds Policy

Support

  • support@esimoa.com
  • Support chat

NBase Korea Co., Ltd.

902, Bldg A, 767 Sinsu-ro, Suji-gu, Yongin-si, Gyeonggi-do (Dongcheon-dong, Bundang Suji U-TOWER)

US Headquarters: NBASE CORP. · Corporate Park, Irvine, CA 92606, USA

© 2026 esimoa. All rights reserved.