파트너 API (B2B)
상품 검색
GET /b2b/v1/products — 국가·키워드·기간·데이터량 등으로 이심모아 상품을 검색해요.
요청#
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"]쿼리 파라미터#
모든 파라미터는 선택이에요. 값이 범위를 벗어나면 400 이고, 알 수 없는 파라미터는 무시돼요.
| 파라미터 | 타입 | 설명 |
|---|---|---|
country | string | ISO 3166-1 alpha-2 국가 코드 (예: JP). 다른 형식은 400 |
q | string | 키워드 (최대 60자) |
isUnlimited | boolean | true 면 무제한만, false 면 무제한 제외 — true | false (1 | 0 도 가능) |
minDays · maxDays | integer | 사용 기간(일) 범위, 1–365 |
minDataGB | number | 최소 데이터량(GB), 0–1000 |
hasLocalNumber | boolean | 현지 전화번호 제공 여부 — true | false (1 | 0 도 가능) |
isMultiCountry | boolean | 다국가 상품 여부 — true | false (1 | 0 도 가능) |
sortBy | string | recommended(기본) | price | validity | data |
sortOrder | string | asc | desc — 생략하면 정렬별 기본값 |
page | integer | 1부터 시작, 기본 1 |
limit | integer | 1–50, 기본 20 |
정렬#
| sortBy | 기본 sortOrder | 의미 |
|---|---|---|
| recommended | desc | 이심모아 추천순 (판매량 반영) — 웹과 같은 순서 |
| price | asc | 가격 낮은 순 |
| validity | asc | 사용 기간 짧은 순 |
| data | desc | 데이터 많은 순 |
페이지 나누기#
page 는 1부터 시작해요. 응답에 page·limit·total 이 함께 오니 마지막 페이지는 ceil(total / limit) 로 계산하세요.
응답#
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
}PartnerProduct 객체#
| 필드 | 타입 | 설명 |
|---|---|---|
id | string | 'partner_<packageCode>' — 이심모아 웹의 상품 id 와 같아요 |
name | string | "<지역> <데이터> <N>일" 형식의 표시 이름. 다른 언어로 보여 줄 때는 구조화 필드로 직접 만드세요 |
country | string | 적용 지역 표시 문구 (다국가 상품은 국가 나열) |
countryCode | string? | ISO 국가 코드 — 없으면 생략 |
coverageCountries | string[] | 사용 가능한 국가 코드 목록 |
region | string? | 권역 — 없으면 생략 |
isMultiCountry | boolean | 다국가 상품 여부 |
dataAmount | string | 카탈로그 표시 문자열 ('10GB', 'Unlimited', '1GB/Day + Unlimited' …) |
dataAmountGB | number? | GB 숫자 — 완전 무제한이면 생략 |
isUnlimited | boolean | 무제한 요금제 여부 |
validityDays | integer | 사용 기간(일) |
priceKRW / currency | integer / 'KRW' | 이심모아 소비자가 (원화) — v1 에는 파트너가가 없어요 |
networkType | string | 네트워크 (예: 5G) — 모르면 '' |
localNetworks | string[] | 현지 통신사 목록 |
isLocalNetwork | boolean | 로밍이 아닌 현지망 사용 여부 |
fupPolicy | string | null | 공정 사용 정책(FUP) 문구 |
hotspotEnabled | boolean | null | 테더링 가능 여부 — null 은 모름 |
hasLocalNumber | boolean | 현지 전화번호 제공 여부 |
voiceMinutes | integer | null | 통화 분 — -1 은 무제한, null 은 미제공 |
smsCount | integer | null | 문자 건수 — null 은 미제공 |
supportTopUp | boolean | null | 충전 가능 여부 — null 은 모름 |
supportsUsim | boolean | 실물 USIM 으로도 판매되는지 |
activationType | string | 개통 방식 (예: 'instant') |
참고
공급사·원가 필드는 응답에 없어요. 필드는 추가만 되고 이름·의미는 바뀌지 않으니, 모르는 필드는 무시하도록 파싱하세요.
