Catalog API2026-11Preview
Imports
Paste a listing link, get back its variants and what each one costs you to sell: the goods, our CN¥12.00 intake fee for the seller's parcel to us, the 14% flat tax, then the shipping lane, the CN¥50.00 handling fee per parcel and the tax on those, the marketplace's fee, and the price that keeps your margin.
- Importing is free, with no product limit. You pay only for what you order.
- Every figure is one unit, bought in its own order and shipped in its own parcel: one dropshipped sale. Several units in one order or one parcel cost less than this says.
- Marketplace fees default to each marketplace's public headline rate. Send your own when your category or plan differs.
The Import object
A listing as we read it, with what one sale costs landed at your buyer's door: the goods, our CN¥12.00 intake fee for the seller's parcel to us, the 14% flat tax, then the shipping lane, the CN¥50.00 handling fee per parcel and the tax on those. In US$, it is what a US$ card is charged, currency conversion included.
idstring- Starts imp_.
statusstring- running (a finds sheet still being read), ready, or failed.
urlstring- The link you sent.
marketplacestring- taobao, tmall, weidian or 1688.
title, seller, images[]string- As the seller wrote them, in Chinese more often than not.
read_atstring- When we last read the listing from the marketplace.
analysis.ship_to, lane, weight_g- The inputs it was priced for.
analysis.coveredboolean- False when no published rate ships to that country on that lane; then no variant has a landed cost.
analysis.marketplace_feeobject- percent and fixed: what the marketplace keeps of a sale. default is true when you sent none and we used its public headline rate, an estimate, never your real bill.
analysis.margin_reachableboolean- False when the fee and the margin together take the whole price: no price can reach it.
analysis.brand_hintobject|null- Brand or replica words found in the title, in English or Chinese. A hint, never a verdict: it cannot see a logo in a photo, and a clean result proves nothing.
analysis.variants[].procurementobject- goods, intake_fee, tax and total of the order that buys one unit.
analysis.variants[].seller_shippingobject|null- The seller's shipping to our warehouse. No listing carries it, so it is null: unknown, not free.
analysis.variants[].parcelobject|null- lane, shipping, handling_fee, tax and total of the parcel that ships it.
analysis.variants[].landedobject- Item and parcel together: in CN¥, in US$, and the conversion fee included in the US$.
analysis.variants[].minimum_priceobject|null- The lowest price that keeps your margin after the marketplace fee.
analysis.variants[].suggestedobject|null- The lowest x.99 price at or above the minimum, with the fee, profit and margin it leaves.
productstring|null- The product it became once saved.
{
"id": "imp_2c9d",
"status": "ready",
"url": "https://weidian.com/item.html?itemID=7750970856",
"marketplace": "weidian",
"title": "Heavyweight washed hoodie",
"seller": "Ruoyi Studio",
"images": [
"https://media.ninjabuy.com/listings/weidian-7750970856/1.webp"
],
"read_at": "2026-11-04T09:12:40Z",
"analysis": {
"ship_to": "US",
"lane": "saver",
"weight_g": 180,
"covered": true,
"marketplace": "ebay",
"marketplace_fee": {
"percent": "13.6",
"fixed": { "amount": "0.40", "currency": "USD" },
"default": true
},
"margin_percent": "30",
"margin_reachable": true,
"brand_hint": null,
"variants": [
{
"sku": "5187209554",
"label": "Black / M",
"in_stock": true,
"procurement": {
"goods": { "amount": "38.00", "currency": "CNY" },
"intake_fee": { "amount": "12.00", "currency": "CNY" },
"tax": { "amount": "7.00", "currency": "CNY" },
"total": { "amount": "57.00", "currency": "CNY" }
},
"seller_shipping": null,
"parcel": {
"lane": "saver",
"shipping": { "amount": "68.00", "currency": "CNY" },
"handling_fee": { "amount": "50.00", "currency": "CNY" },
"tax": { "amount": "16.52", "currency": "CNY" },
"total": { "amount": "134.52", "currency": "CNY" }
},
"landed": {
"cny": { "amount": "191.52", "currency": "CNY" },
"usd": { "amount": "27.71", "currency": "USD" },
"fx_fee": { "amount": "5.75", "currency": "CNY" }
},
"minimum_price": { "amount": "49.84", "currency": "USD" },
"suggested": {
"price": { "amount": "49.99", "currency": "USD" },
"marketplace_fee": { "amount": "7.20", "currency": "USD" },
"profit": { "amount": "15.08", "currency": "USD" },
"margin_percent": "30.16"
}
},
{
"sku": "5187209555",
"label": "Black / L",
"in_stock": false,
"procurement": {
"goods": { "amount": "38.00", "currency": "CNY" },
"intake_fee": { "amount": "12.00", "currency": "CNY" },
"tax": { "amount": "7.00", "currency": "CNY" },
"total": { "amount": "57.00", "currency": "CNY" }
},
"seller_shipping": null,
"parcel": {
"lane": "saver",
"shipping": { "amount": "68.00", "currency": "CNY" },
"handling_fee": { "amount": "50.00", "currency": "CNY" },
"tax": { "amount": "16.52", "currency": "CNY" },
"total": { "amount": "134.52", "currency": "CNY" }
},
"landed": {
"cny": { "amount": "191.52", "currency": "CNY" },
"usd": { "amount": "27.71", "currency": "USD" },
"fx_fee": { "amount": "5.75", "currency": "CNY" }
},
"minimum_price": { "amount": "49.84", "currency": "USD" },
"suggested": {
"price": { "amount": "49.99", "currency": "USD" },
"marketplace_fee": { "amount": "7.20", "currency": "USD" },
"profit": { "amount": "15.08", "currency": "USD" },
"margin_percent": "30.16"
}
}
]
},
"product": null,
"created_at": "2026-11-04T09:12:41Z"
}Import from a link
POST/v1/imports
Reads a Taobao, Tmall, Weidian or 1688 listing (a short link, or another shopping agent's link to it, works too) and answers it analysed, in the same call. A listing we read in the last five minutes is not fetched again.
A finds sheet link (https://www.ninjabuy.com/spreadsheets/d/…) imports every product on it: 202 with status: running, then poll the import.
Scopeproducts:write
Body
urlstringrequired- A product link, or a finds sheet.
ship_tostring- Two-letter country to price the parcel for. US when left out.
lanestring- saver or fast. saver when left out.
weight_gintegerrequired- The packed weight of one unit, in grams. Listings carry no weight, so the parcel is priced on yours.
marketplacestring- Where you sell it: ebay, shopify, amazon or tiktok. shopify when left out.
marketplace_feeobject- Optional. percent and fixed (US$) to use instead of the marketplace's headline rate, for your category or plan.
margin_percentstring- The margin to price for, of the sale price. 30 when left out.
Errors
| Status | Type | When |
|---|---|---|
| 400 | bad-body | weight_g is missing, or a field is out of range. |
| 422 | unprocessable | Not a link we can read, or the listing is gone. |
| 429 | rate-limited | The marketplace window is spent; see Rate limits. |
curl -X POST "https://www.ninjabuy.com/api/v1/imports" \
-H "Authorization: Bearer $NINJABUY_API_KEY" \
-H "NinjaBuy-Version: 2026-11" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"url": "https://weidian.com/item.html?itemID=7750970856",
"ship_to": "US",
"weight_g": 180,
"marketplace": "ebay",
"margin_percent": "30"
}'HTTP/2 201 Created
{
"id": "imp_2c9d",
"status": "ready",
"url": "https://weidian.com/item.html?itemID=7750970856",
"marketplace": "weidian",
"title": "Heavyweight washed hoodie",
"seller": "Ruoyi Studio",
"images": [
"https://media.ninjabuy.com/listings/weidian-7750970856/1.webp"
],
"read_at": "2026-11-04T09:12:40Z",
"analysis": {
"ship_to": "US",
"lane": "saver",
"weight_g": 180,
"covered": true,
"marketplace": "ebay",
"marketplace_fee": {
"percent": "13.6",
"fixed": { "amount": "0.40", "currency": "USD" },
"default": true
},
"margin_percent": "30",
"margin_reachable": true,
"brand_hint": null,
"variants": [
{
"sku": "5187209554",
"label": "Black / M",
"in_stock": true,
"procurement": {
"goods": { "amount": "38.00", "currency": "CNY" },
"intake_fee": { "amount": "12.00", "currency": "CNY" },
"tax": { "amount": "7.00", "currency": "CNY" },
"total": { "amount": "57.00", "currency": "CNY" }
},
"seller_shipping": null,
"parcel": {
"lane": "saver",
"shipping": { "amount": "68.00", "currency": "CNY" },
"handling_fee": { "amount": "50.00", "currency": "CNY" },
"tax": { "amount": "16.52", "currency": "CNY" },
"total": { "amount": "134.52", "currency": "CNY" }
},
"landed": {
"cny": { "amount": "191.52", "currency": "CNY" },
"usd": { "amount": "27.71", "currency": "USD" },
"fx_fee": { "amount": "5.75", "currency": "CNY" }
},
"minimum_price": { "amount": "49.84", "currency": "USD" },
"suggested": {
"price": { "amount": "49.99", "currency": "USD" },
"marketplace_fee": { "amount": "7.20", "currency": "USD" },
"profit": { "amount": "15.08", "currency": "USD" },
"margin_percent": "30.16"
}
},
{
"sku": "5187209555",
"label": "Black / L",
"in_stock": false,
"procurement": {
"goods": { "amount": "38.00", "currency": "CNY" },
"intake_fee": { "amount": "12.00", "currency": "CNY" },
"tax": { "amount": "7.00", "currency": "CNY" },
"total": { "amount": "57.00", "currency": "CNY" }
},
"seller_shipping": null,
"parcel": {
"lane": "saver",
"shipping": { "amount": "68.00", "currency": "CNY" },
"handling_fee": { "amount": "50.00", "currency": "CNY" },
"tax": { "amount": "16.52", "currency": "CNY" },
"total": { "amount": "134.52", "currency": "CNY" }
},
"landed": {
"cny": { "amount": "191.52", "currency": "CNY" },
"usd": { "amount": "27.71", "currency": "USD" },
"fx_fee": { "amount": "5.75", "currency": "CNY" }
},
"minimum_price": { "amount": "49.84", "currency": "USD" },
"suggested": {
"price": { "amount": "49.99", "currency": "USD" },
"marketplace_fee": { "amount": "7.20", "currency": "USD" },
"profit": { "amount": "15.08", "currency": "USD" },
"margin_percent": "30.16"
}
}
]
},
"product": null,
"created_at": "2026-11-04T09:12:41Z"
}Price it again
POST/v1/imports/{id}/analysis
The same listing for another country, lane, weight, marketplace or margin. Priced from what we already read, so it spends no marketplace call. Answers the new analysis and keeps it on the import.
Scopeproducts:write
Path parameters
idstringrequired- The import's id.
Body
ship_tostring- Two-letter country to price the parcel for. US when left out.
lanestring- saver or fast. saver when left out.
weight_gintegerrequired- The packed weight of one unit, in grams. Listings carry no weight, so the parcel is priced on yours.
marketplacestring- Where you sell it: ebay, shopify, amazon or tiktok. shopify when left out.
marketplace_feeobject- Optional. percent and fixed (US$) to use instead of the marketplace's headline rate, for your category or plan.
margin_percentstring- The margin to price for, of the sale price. 30 when left out.
Errors
| Status | Type | When |
|---|---|---|
| 404 | not-found | No such import on this account. |
curl -X POST "https://www.ninjabuy.com/api/v1/imports/imp_2c9d/analysis" \
-H "Authorization: Bearer $NINJABUY_API_KEY" \
-H "NinjaBuy-Version: 2026-11" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"ship_to": "GB",
"lane": "fast",
"weight_g": 180,
"marketplace": "tiktok",
"margin_percent": "35"
}'HTTP/2 200 OK
{
"ship_to": "GB",
"lane": "fast",
"weight_g": 180,
"covered": true,
"marketplace": "tiktok",
"marketplace_fee": {
"percent": "6",
"fixed": { "amount": "0.00", "currency": "USD" },
"default": true
},
"margin_percent": "35",
"margin_reachable": true,
"brand_hint": null,
"variants": [
{
"sku": "5187209554",
"label": "Black / M",
"in_stock": true,
"procurement": {
"goods": { "amount": "38.00", "currency": "CNY" },
"intake_fee": { "amount": "12.00", "currency": "CNY" },
"tax": { "amount": "7.00", "currency": "CNY" },
"total": { "amount": "57.00", "currency": "CNY" }
},
"seller_shipping": null,
"parcel": {
"lane": "saver",
"shipping": { "amount": "68.00", "currency": "CNY" },
"handling_fee": { "amount": "50.00", "currency": "CNY" },
"tax": { "amount": "16.52", "currency": "CNY" },
"total": { "amount": "134.52", "currency": "CNY" }
},
"landed": {
"cny": { "amount": "191.52", "currency": "CNY" },
"usd": { "amount": "27.71", "currency": "USD" },
"fx_fee": { "amount": "5.75", "currency": "CNY" }
},
"minimum_price": { "amount": "49.84", "currency": "USD" },
"suggested": {
"price": { "amount": "49.99", "currency": "USD" },
"marketplace_fee": { "amount": "7.20", "currency": "USD" },
"profit": { "amount": "15.08", "currency": "USD" },
"margin_percent": "30.16"
}
},
{
"sku": "5187209555",
"label": "Black / L",
"in_stock": false,
"procurement": {
"goods": { "amount": "38.00", "currency": "CNY" },
"intake_fee": { "amount": "12.00", "currency": "CNY" },
"tax": { "amount": "7.00", "currency": "CNY" },
"total": { "amount": "57.00", "currency": "CNY" }
},
"seller_shipping": null,
"parcel": {
"lane": "saver",
"shipping": { "amount": "68.00", "currency": "CNY" },
"handling_fee": { "amount": "50.00", "currency": "CNY" },
"tax": { "amount": "16.52", "currency": "CNY" },
"total": { "amount": "134.52", "currency": "CNY" }
},
"landed": {
"cny": { "amount": "191.52", "currency": "CNY" },
"usd": { "amount": "27.71", "currency": "USD" },
"fx_fee": { "amount": "5.75", "currency": "CNY" }
},
"minimum_price": { "amount": "49.84", "currency": "USD" },
"suggested": {
"price": { "amount": "49.99", "currency": "USD" },
"marketplace_fee": { "amount": "7.20", "currency": "USD" },
"profit": { "amount": "15.08", "currency": "USD" },
"margin_percent": "30.16"
}
}
]
}Retrieve an import
GET/v1/imports/{id}
Read an import again, or poll a finds sheet while it is running.
Scopeproducts:read
Path parameters
idstringrequired- The import's id.
Errors
| Status | Type | When |
|---|---|---|
| 404 | not-found | No such import on this account. |
curl "https://www.ninjabuy.com/api/v1/imports/imp_6t1b" \
-H "Authorization: Bearer $NINJABUY_API_KEY" \
-H "NinjaBuy-Version: 2026-11"HTTP/2 200 OK
{
"id": "imp_6t1b",
"status": "running",
"url": "https://www.ninjabuy.com/spreadsheets/d/1aBcD3fGh",
"progress": { "done": 41, "total": 120 },
"poll_after_seconds": 10
}List imports
GET/v1/imports
Newest first. Imports you never saved stay here for you to come back to.
Scopeproducts:read
Query parameters
statusstring- Optional. running, ready or failed.
savedboolean- Optional. true for the ones that became products.
limit, cursor- Pagination
curl "https://www.ninjabuy.com/api/v1/imports?saved=false&limit=2" \
-H "Authorization: Bearer $NINJABUY_API_KEY" \
-H "NinjaBuy-Version: 2026-11"HTTP/2 200 OK
{
"data": [
{
"id": "imp_2c9d",
"status": "ready",
"title": "Heavyweight washed hoodie",
"product": null
},
{
"id": "imp_2c7a",
"status": "ready",
"title": "Canvas tote, 3 colours",
"product": null
}
],
"has_more": true,
"cursor": "c_2c7a"
}Save as a product
POST/v1/imports/{id}/save
Keeps the variants you choose as a product, at the prices you set or the suggested ones. Add
push_to: shopify to list it on your store in the same call (Push to Shopify).Scopeproducts:write
Path parameters
idstringrequired- The import's id.
Body
variants[]array- Optional. sku and price of each variant to keep. Every in-stock variant at its suggested price when left out.
titlestring- Optional. Your own title; the seller's is in Chinese more often than not.
push_tostring- Optional. shopify.
Errors
| Status | Type | When |
|---|---|---|
| 409 | invalid-state | Already saved; product names it. |
| 422 | unprocessable | Every variant you kept is sold out. |
curl -X POST "https://www.ninjabuy.com/api/v1/imports/imp_2c9d/save" \
-H "Authorization: Bearer $NINJABUY_API_KEY" \
-H "NinjaBuy-Version: 2026-11" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"title": "Heavyweight Washed Hoodie",
"variants": [
{
"sku": "5187209554",
"price": { "amount": "49.99", "currency": "USD" }
}
],
"push_to": "shopify"
}'HTTP/2 201 Created
{
"import": "imp_2c9d",
"product": "prd_8f2k",
"status": "draft",
"channels": [{ "channel": "shopify", "status": "draft" }]
}