API partenaire (B2B)
Produits
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#
Tous les paramètres sont facultatifs. Les valeurs hors limites renvoient 400 ; les paramètres inconnus sont ignorés.
| Paramètre | Type | Description |
|---|---|---|
country | string | Code pays ISO 3166-1 alpha-2 (ex. : JP). Les autres formats renvoient 400 |
q | string | Mot-clé (60 caractères max.) |
isUnlimited | boolean | true = illimités uniquement, false = exclure les illimités — true | false (1 | 0 également acceptés) |
minDays · maxDays | integer | Plage de validité en jours, 1–365 |
minDataGB | number | Données minimales en GB, 0–1000 |
hasLocalNumber | boolean | Inclut un numéro de téléphone local — true | false (1 | 0 également acceptés) |
isMultiCountry | boolean | Produit multi-pays — true | false (1 | 0 également acceptés) |
sortBy | string | recommended (par défaut) | price | validity | data |
sortOrder | string | asc | desc — valeur par défaut selon sortBy si omis |
page | integer | Commence à 1, 1 par défaut |
limit | integer | 1–50, 20 par défaut |
Sorting#
| sortBy | sortOrder par défaut | Signification |
|---|---|---|
| recommended | desc | Classement recommandé esimoa (ventes incluses) — même ordre que le site web |
| price | asc | Prix croissant |
| validity | asc | Validité la plus courte d’abord |
| data | desc | Plus de données d’abord |
Pagination#
page commence à 1. La réponse renvoie page et limit ainsi que total : la dernière page est donc ceil(total / limit).
Réponse#
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#
| Champ | Type | Description |
|---|---|---|
id | string | 'partner_<packageCode>' — le même id produit que sur esimoa.com |
name | string | Nom affiché au format "<area> <data> <N>일" (suffixe coréen des jours). Pour les autres langues, construisez votre propre libellé à partir des champs structurés |
country | string | Libellé de la zone de couverture (les produits multi-pays listent leurs pays) |
countryCode | string? | Code pays ISO — omis s’il n’est pas disponible |
coverageCountries | string[] | Codes des pays où le produit fonctionne |
region | string? | Région — omise si indisponible |
isMultiCountry | boolean | Produit multi-pays |
dataAmount | string | Libellé du catalogue ('10GB', 'Unlimited', '1GB/Day + Unlimited' …) |
dataAmountGB | number? | Données en GB — omis pour les produits entièrement illimités |
isUnlimited | boolean | Forfait illimité |
validityDays | integer | Validité en jours |
priceKRW / currency | integer / 'KRW' | Prix de vente esimoa en KRW — pas de prix partenaire dans la v1 |
networkType | string | Réseau (ex. : 5G) — '' si inconnu |
localNetworks | string[] | Opérateurs locaux |
isLocalNetwork | boolean | Utilise un réseau local plutôt que l’itinérance |
fupPolicy | string | null | Texte de la politique d’utilisation raisonnable (FUP) |
hotspotEnabled | boolean | null | Partage de connexion autorisé — null = inconnu |
hasLocalNumber | boolean | Inclut un numéro de téléphone local |
voiceMinutes | integer | null | Minutes de voix — -1 = illimité, null = non fourni |
smsCount | integer | null | Nombre de SMS — null = non fourni |
supportTopUp | boolean | null | Rechargeable — null = inconnu |
supportsUsim | boolean | Également vendue en USIM physique |
activationType | string | Type d’activation (ex. : 'instant') |
Remarque
Les champs fournisseur et coût ne figurent jamais dans la réponse. Des champs peuvent seulement être ajoutés, sans changement de nom ni de signification : ignorez les champs inconnus lors de l’analyse.
