Partner-API (B2B)
Produkte
GET /b2b/v1/products — search esimoa products by country, keyword, duration, data and more.
Request#
GET
/b2b/v1/productscurl "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#
Alle Parameter sind optional. Werte außerhalb des Bereichs liefern 400; unbekannte Parameter werden ignoriert.
| Parameter | Typ | Beschreibung |
|---|---|---|
country | string | Ländercode nach ISO 3166-1 Alpha-2 (z. B. JP). Andere Formate liefern 400 |
q | string | Suchbegriff (bis zu 60 Zeichen) |
isUnlimited | boolean | true = nur unbegrenzt, false = unbegrenzte ausschließen — true | false (1 | 0 werden auch akzeptiert) |
minDays · maxDays | integer | Gültigkeitsbereich in Tagen, 1–365 |
minDataGB | number | Mindestdatenvolumen in GB, 0–1000 |
hasLocalNumber | boolean | Inklusive lokaler Telefonnummer –true | false (1 | 0 werden auch akzeptiert) |
isMultiCountry | boolean | Produkt für mehrere Länder –true | false (1 | 0 werden auch akzeptiert) |
sortBy | string | recommended (Standard) | price | validity | data |
sortOrder | string | asc | desc — ohne Angabe gilt der Standard je sortBy |
page | integer | Beginnt bei 1, Standard 1 |
limit | integer | 1–50, Standard 20 |
Sorting#
| sortBy | Standard-sortOrder | Bedeutung |
|---|---|---|
| recommended | desc | Von esimoa empfohlene Rangfolge (inkl. Verkäufe) — gleiche Reihenfolge wie auf der Website |
| price | asc | Günstigste zuerst |
| validity | asc | Kürzeste Gültigkeit zuerst |
| data | desc | Meiste Daten zuerst |
Seitennavigation#
page beginnt bei 1. Die Antwort gibt page und limit zusammen mit total zurück, die letzte Seite ist also ceil(total / limit).
Antwort#
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#
| Feld | Typ | Beschreibung |
|---|---|---|
id | string | 'partner_<packageCode>' — dieselbe Produkt-ID wie auf esimoa.com |
name | string | Anzeigename im Format "<area> <data> <N>일" (koreanisches Tagessuffix). Für andere Sprachen erstelle dein eigenes Label aus den strukturierten Feldern |
country | string | Label für das Abdeckungsgebiet (Mehrländerprodukte listen ihre Länder auf) |
countryCode | string? | ISO-Ländercode – entfällt, wenn nicht verfügbar |
coverageCountries | string[] | Ländercodes, in denen das Produkt funktioniert |
region | string? | Region – entfällt, wenn nicht verfügbar |
isMultiCountry | boolean | Produkt für mehrere Länder |
dataAmount | string | Katalog-Label ('10GB', 'Unlimited', '1GB/Day + Unlimited' …) |
dataAmountGB | number? | Daten in GB — entfällt bei vollständig unbegrenzten Produkten |
isUnlimited | boolean | Unbegrenzter Tarif |
validityDays | integer | Gültigkeit in Tagen |
priceKRW / currency | integer / 'KRW' | esimoa-Verkaufspreis in KRW — in v1 gibt es keinen Partnerpreis |
networkType | string | Netz (z. B. 5G) – '' wenn unbekannt |
localNetworks | string[] | Lokale Anbieter |
isLocalNetwork | boolean | Nutzt ein lokales Netz statt Roaming |
fupPolicy | string | null | Text der Fair-Use-Richtlinie (FUP) |
hotspotEnabled | boolean | null | Tethering erlaubt — null = unbekannt |
hasLocalNumber | boolean | Inklusive lokaler Telefonnummer |
voiceMinutes | integer | null | Sprachminuten — -1 = unbegrenzt, null = nicht angegeben |
smsCount | integer | null | SMS-Anzahl – null = nicht angegeben |
supportTopUp | boolean | null | Aufladbar — null = unbekannt |
supportsUsim | boolean | Auch als physische USIM erhältlich |
activationType | string | Aktivierungsart (z. B. 'instant') |
Hinweis
Lieferanten- und Kostenfelder sind nie Teil der Antwort. Felder kommen nur hinzu, Namen und Bedeutungen ändern sich nicht – parse so, dass unbekannte Felder ignoriert werden.
