API Reference
Qualit.ly API
Product data, QC images, and metadata from Weidian, Taobao, and 1688. Bearer token auth, generous rate limits, tiered plans.
Getting Started
All requests go to https://backend.qualit.ly/api/v1. Three steps:
Get a key
Sign in and create an API key from the developer dashboard.
Make a request
Send your key as a Bearer token in the Authorization header.
Get data
Receive JSON responses with product data and QC images.
Quick example
curl -H "Authorization: Bearer qc_live_YOUR_KEY" \
https://backend.qualit.ly/api/v1/products/weidian/1234567890Authentication
Include a valid API key in the Authorization header using the Bearer scheme.
Authorization: Bearer qc_live_xxxxxxxxxxxxxxxxxxxxxxxxKey format
Keys follow qc_{mode}_{random} where mode is live or test, and random is 32 cryptographically random characters.
Keys are shown once at creation. We store only the SHA-256 hash — lost keys cannot be recovered.
IP allowlisting
Optionally restrict keys to specific IPs or CIDR ranges via the developer dashboard. Requests from unlisted IPs get a 403. An empty allowlist allows all IPs.
Rate Limits
Two buckets: per-minute and per-month. Limits are tied to your account tier and apply across all keys.
When rate limited
The API returns 429 with a Retry-After header.
{
"error": {
"code": "RATE_LIMITED",
"message": "Per-minute limit exceeded",
"retry_after": 12
}
}Errors
All errors return a top-level error object with code and message.
{
"error": {
"code": "NOT_FOUND",
"message": "Product not found"
}
}UNAUTHORIZEDMissing or invalid API key.FORBIDDENYour tier lacks access, or IP is blocked.NOT_FOUNDThe requested resource does not exist.RATE_LIMITEDQuota exceeded — check Retry-After header.BAD_REQUESTInvalid request body or parameters.INTERNALServer error. Retry or contact support.Endpoints
Base: https://backend.qualit.ly/api/v1. Storefronts: weidian, taobao, 1688.
/products/:storefront/:listingIdBasicLook up a single product by storefront and listing ID. Returns metadata and up to 5 QC preview thumbnails.
Parameters
storefrontrequiredOne of: weidian, taobao, 1688
listingIdrequiredThe product listing ID from the storefront
Example
curl -H "Authorization: Bearer qc_live_YOUR_KEY" \
https://backend.qualit.ly/api/v1/products/weidian/7231368393Response
{
"data": {
"id": 482910,
"storefront": "weidian",
"listing_id": "7231368393",
"name": "AJ1 Retro High OG",
"price": "¥470.00",
"pic_url": "https://cdn.qualit.ly/covers/...",
"product_url": "https://weidian.com/item.html?itemID=7231368393",
"qc_count": 12,
"qc_preview": [
"https://cdn.qualit.ly/qc/...",
"https://cdn.qualit.ly/qc/..."
]
}
}/products/batchPro+Look up multiple products in a single request (up to 100). Each result is independent — a missing product won't fail the batch.
Request body
{
"items": [
{ "storefront": "weidian", "listing_id": "7231368393" },
{ "storefront": "taobao", "listing_id": "123456789" }
]
}Example
curl -X POST \
-H "Authorization: Bearer qc_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"items":[{"storefront":"weidian","listing_id":"7231368393"}]}' \
https://backend.qualit.ly/api/v1/products/batchResponse
{
"results": [
{
"data": {
"id": 482910,
"storefront": "weidian",
"listing_id": "7231368393",
"name": "AJ1 Retro High OG",
"price": "¥470.00",
"qc_count": 12,
"qc_preview": ["..."]
}
},
{ "error": { "code": "NOT_FOUND" } }
]
}/qc/:storefront/:listingIdBasicGet QC metadata and the first 3 thumbnail image URLs for a product.
Example
curl -H "Authorization: Bearer qc_live_YOUR_KEY" \
https://backend.qualit.ly/api/v1/qc/weidian/7231368393{
"data": {
"storefront": "weidian",
"listing_id": "7231368393",
"qc_count": 12,
"thumbnails": ["..."]
}
}/qc/:id/imagesPro+Full list of QC images. Accepts a numeric product ID or a ?url= query parameter for URL-based lookups.
By product ID
curl -H "Authorization: Bearer qc_live_YOUR_KEY" \
https://backend.qualit.ly/api/v1/qc/482910/imagesBy URL
curl -H "Authorization: Bearer qc_live_YOUR_KEY" \
"https://backend.qualit.ly/api/v1/qc/0/images?url=https://weidian.com/item.html?itemID=7231368393"Response
{
"data": {
"id": 482910,
"storefront": "weidian",
"listing_id": "7231368393",
"qc_count": 12,
"images": [
"https://cdn.qualit.ly/qc/img1.jpg",
"https://cdn.qualit.ly/qc/img2.jpg",
"..."
]
}
}?url= param accepts full product URLs from Weidian, Taobao, 1688, and supported agents./meBasicReturns your account info, the key used for the request, and your current tier.
Example
curl -H "Authorization: Bearer qc_live_YOUR_KEY" \
https://backend.qualit.ly/api/v1/me{
"user": { "id": 12345, "username": "you" },
"key": { "id": 1, "mode": "live" },
"tier": "basic"
}/usageBasicCheck your current rate-limit and quota usage. Returns per-minute and per-month counters with reset timestamps. The call itself consumes 1 request from both counters.
Example
curl -H "Authorization: Bearer qc_live_YOUR_KEY" \
https://backend.qualit.ly/api/v1/usageResponse
{
"tier": "pro_plus",
"key": { "id": 7, "mode": "live" },
"minute": {
"limit": 1000,
"used": 12,
"remaining": 988,
"reset_in_seconds": 37,
"reset_at": "2026-04-17T18:42:00.000Z"
},
"month": {
"limit": 500000,
"used": 1843,
"remaining": 498157,
"reset_in_seconds": 1159200,
"reset_at": "2026-05-01T00:00:00.000Z",
"bucket": 202604
}
}Fields
tierOne of: basic, early_adopter, pro, pro_plus, custom
limit / remainingnull on the custom tier (unlimited)
usedRequests counted in the current window. Minute counter resets every 60s; month counter resets at UTC month rollover.
reset_atISO 8601 UTC timestamp
bucketInternal YYYYMM key for the month counter
Errors
Same as other /api/v1/* routes:401 INVALID_KEY /REVOKED_KEY,403 IP_NOT_AUTHORIZED,429 RATE_LIMITED /QUOTA_EXCEEDED.
Code Samples
Quick-start snippets in popular languages.
const res = await fetch(
'https://backend.qualit.ly/api/v1/products/weidian/7231368393',
{ headers: { Authorization: 'Bearer ' + process.env.QUALITLY_KEY } }
);
const { data } = await res.json();
console.log(data.name, data.qc_count, 'QC images');Plans & Tiers
Your tier is resolved on every request — upgrades take effect immediately. Batch and full-image endpoints require Pro+.
Need higher limits? [email protected]