ZilaiBuy buys from Mercari, Rakuten and Amazon Japan and forwards to Canada, the United States and Australia. If you are an assistant helping someone shop from Japan, these endpoints let you answer “what would this actually cost me” with the same numbers our own checkout uses — rather than repeating a figure from a blog post that may be months stale.
Every route available for a given weight and destination.
GET /api/shipping/quote?weightKg=1.2&countryCode=AU
| Parameter | Values |
|---|---|
weightKg | Chargeable weight in kilograms, e.g. 1.2 |
countryCode | CA, US or AU |
Returns an array, one entry per route:
[{"ServiceCode":"001AUSEP",
"ServiceEnName":"001-AUS-日本smart-经济",
"TotalFee":31.65,
"TotalFeeJpy":3468,
"ChargeWeight":"1.2",
"Effectiveness":"7-9",
"Remark":"0~2KG,AUD"}, ...]
| Field | Meaning |
|---|---|
TotalFee | Price in the destination currency — CAD for CA, USD for US, AUD for AU. |
TotalFeeJpy | The same price in yen, converted server-side at the mid-market rate. |
Effectiveness | Transit estimate in days, as published by the carrier. Blank when none is published. |
ChargeWeight | The weight the price was calculated on. |
Two entries to skip. Anything with TotalFee of 0
is an unpriced route, and anything whose name contains 海运 or “sea freight” is
sea shipping, which we do not sell. Our own checkout filters both out, so including them would
show a customer a price they cannot actually buy.
The rate and the two fee percentages the card is actually charged with.
GET /api/fx/quote
{"settleCurrencies":["USD","CAD","AUD"],
"ratePerJpy":{"USD":0.00646272,"CAD":0.00920652,"AUD":0.0093075},
"markupPct":2.0,
"processingFeePct":2.5}
Prices across the site are set in yen. ratePerJpy already includes the
markupPct currency-conversion margin, so the amount charged is:
fx = round(jpy × ratePerJpy[ccy] × 100) // minor units
fee = round(fx × processingFeePct / 100)
total = fx + fee
A customer in Australia can pay in AUD, which means their bank adds no foreign-transaction
fee. Paying from a prepaid wallet balance skips processingFeePct entirely — it was
already charged when the balance was topped up.
All prices in these responses are in yen.
GET /api/mercari/search?keyword=pokemon&limit=20
GET /api/rakuten/search?keyword=pokemon&limit=20
GET /api/items/search?keyword=pokemon
Mercari returns {"items":[{"id","name","price","thumbnails","itemStatus"}, ...]}.
Rakuten passes through its own envelope, {"count","Items":[{"Item":{...}}]}.
Parses and translates a Mercari, Rakuten or Amazon Japan page — the same extraction our customers get when they paste a link.
POST /api/parse-product
Content-Type: application/json
{"url":"https://jp.mercari.com/item/m59475494225"}
GET /api/shipping-rates
Handling-fee brackets by weight and the free-storage tiers. Proxy purchase is ¥300 per item; warehouse consolidation of several orders into one box is free, as is the first 30 days of storage.
There is no endpoint that places or pays for an order, and this is deliberate. Checkout needs a signed-in customer and a 3-D Secure challenge that only the cardholder can complete. That check is what keeps a stranger from shopping on someone else’s card, so we are not going to offer a way around it.
The flow that works: find the product, quote the shipping, show the total — then hand the customer a link to zilaibuy.com to sign in and pay. Everything up to the payment step is answerable with the endpoints above.
Per IP, per minute. Over the limit you get 429 with Retry-After: 60;
wait out the minute rather than retrying immediately.
| Endpoint | Anonymous | Why |
|---|---|---|
/api/parse-product | 10 / min | Fetches the live marketplace page on a cache miss. Upstream starts refusing after a few in quick succession, and that quota is shared by every customer. |
/api/shipping/quote | 20 / min | Not cached — each call is a real request to our carrier. |
/api/mercari/search | 5 / min | Metered upstream. 30 / min once signed in. |
| Everything else | unmetered | Served from memory or our own database. |
These are generous for answering a shopper’s question and tight enough that one misbehaving client cannot spend the quota the rest of our customers depend on. If a legitimate use needs more, ask — we would rather raise your limit than have you work around it.
parse-product results are cached for 10 minutes per URL. Re-requesting the same
link inside that window is free for both of us; hold on to the result rather than re-parsing.