Shop Category Products
curl --request GET \
--url https://scrapebadger.com/v1/tiktok/shop/categories/{category_id} \
--header 'x-api-key: <api-key>'import requests
url = "https://scrapebadger.com/v1/tiktok/shop/categories/{category_id}"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://scrapebadger.com/v1/tiktok/shop/categories/{category_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://scrapebadger.com/v1/tiktok/shop/categories/{category_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://scrapebadger.com/v1/tiktok/shop/categories/{category_id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://scrapebadger.com/v1/tiktok/shop/categories/{category_id}")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://scrapebadger.com/v1/tiktok/shop/categories/{category_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"category": {
"id": "601534",
"name": "Lipstick & Lip Gloss",
"slug": "lipstick-lip-gloss",
"level": 3,
"is_leaf": true,
"parent_id": "848648",
"image": "https://p16-oec-ttp.tiktokcdn-us.com/tos-useast5-i-omjb5zjo8w-tx/1943e1962b4540d1a1613ed2c6ea9658~tplv-omjb5zjo8w-resize-jpeg:200:200.image?",
"url": "https://shop.tiktok.com/us/c/lipstick-lip-gloss/601534"
},
"children": [],
"products": [
{
"product_id": "1731944294735319801",
"title": "Glamlite Horror Lip Kits",
"url": "https://shop.tiktok.com/us/pdp/saw-x-glamlite-lip-duo-stylish-makeup-accessory-perfect-gift/1731944294735319801",
"image": "https://p16-oec-general-useast5.ttcdn-us.com/tos-useast5-i-omjb5zjo8w-tx/24558a187a9544adb...",
"price": {
"amount": 26.96,
"original": null,
"discount": null,
"currency": "USD",
"symbol": "$"
},
"rating": 4.8,
"review_count": 734,
"sold_count": 5974,
"seller": {
"id": "7495142756016753401",
"name": "Glamlite",
"logo": "https://p19-oec-general-useast5.ttcdn-us.com/tos-useast5-i-o..."
},
"brand": "Glamlite Cosmetics",
"labels": [],
"promo": null,
"video": null,
"rank": null
},
{
"product_id": "1729385968334181331",
"title": "6 Shades Velvet Matte Lip Gloss Set, Lip Products Makeup, Waterproof Sweatproof Long Lasting Liquid Lipstick, Easy to Apply Non-Drying Lip Makeup Gift Kit for All Occasions #GLOBAL PICKS",
"url": "https://shop.tiktok.com/us/pdp/matte-lipstick-set-by-velvet-6pcs-waterproof-long-lasting-balm-kit/1729385968334181331",
"image": "https://p16-oec-general-useast5.ttcdn-us.com/tos-useast5-i-omjb5zjo8w-tx/61fe9f440c814128b...",
"price": {
"amount": 4.47,
"original": 8.59,
"discount": "48%",
"currency": "USD",
"symbol": "$"
},
"rating": 4.4,
"review_count": 52,
"sold_count": 578,
"seller": {
"id": "8646928167584175059",
"name": "YOUNGVISION Beauty",
"logo": "https://p16-oec-general.ttcdn-us.com/tos-alisg-i-aphluv4xwc-..."
},
"brand": "young vision",
"labels": [],
"promo": null,
"video": null,
"rank": null
}
],
"region": "US"
}Shop
Shop Category Products
A TikTok Shop category’s subcategories and the top products the storefront shows for it.
GET
/
v1
/
tiktok
/
shop
/
categories
/
{category_id}
Shop Category Products
curl --request GET \
--url https://scrapebadger.com/v1/tiktok/shop/categories/{category_id} \
--header 'x-api-key: <api-key>'import requests
url = "https://scrapebadger.com/v1/tiktok/shop/categories/{category_id}"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://scrapebadger.com/v1/tiktok/shop/categories/{category_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://scrapebadger.com/v1/tiktok/shop/categories/{category_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://scrapebadger.com/v1/tiktok/shop/categories/{category_id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://scrapebadger.com/v1/tiktok/shop/categories/{category_id}")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://scrapebadger.com/v1/tiktok/shop/categories/{category_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"category": {
"id": "601534",
"name": "Lipstick & Lip Gloss",
"slug": "lipstick-lip-gloss",
"level": 3,
"is_leaf": true,
"parent_id": "848648",
"image": "https://p16-oec-ttp.tiktokcdn-us.com/tos-useast5-i-omjb5zjo8w-tx/1943e1962b4540d1a1613ed2c6ea9658~tplv-omjb5zjo8w-resize-jpeg:200:200.image?",
"url": "https://shop.tiktok.com/us/c/lipstick-lip-gloss/601534"
},
"children": [],
"products": [
{
"product_id": "1731944294735319801",
"title": "Glamlite Horror Lip Kits",
"url": "https://shop.tiktok.com/us/pdp/saw-x-glamlite-lip-duo-stylish-makeup-accessory-perfect-gift/1731944294735319801",
"image": "https://p16-oec-general-useast5.ttcdn-us.com/tos-useast5-i-omjb5zjo8w-tx/24558a187a9544adb...",
"price": {
"amount": 26.96,
"original": null,
"discount": null,
"currency": "USD",
"symbol": "$"
},
"rating": 4.8,
"review_count": 734,
"sold_count": 5974,
"seller": {
"id": "7495142756016753401",
"name": "Glamlite",
"logo": "https://p19-oec-general-useast5.ttcdn-us.com/tos-useast5-i-o..."
},
"brand": "Glamlite Cosmetics",
"labels": [],
"promo": null,
"video": null,
"rank": null
},
{
"product_id": "1729385968334181331",
"title": "6 Shades Velvet Matte Lip Gloss Set, Lip Products Makeup, Waterproof Sweatproof Long Lasting Liquid Lipstick, Easy to Apply Non-Drying Lip Makeup Gift Kit for All Occasions #GLOBAL PICKS",
"url": "https://shop.tiktok.com/us/pdp/matte-lipstick-set-by-velvet-6pcs-waterproof-long-lasting-balm-kit/1729385968334181331",
"image": "https://p16-oec-general-useast5.ttcdn-us.com/tos-useast5-i-omjb5zjo8w-tx/61fe9f440c814128b...",
"price": {
"amount": 4.47,
"original": 8.59,
"discount": "48%",
"currency": "USD",
"symbol": "$"
},
"rating": 4.4,
"review_count": 52,
"sold_count": 578,
"seller": {
"id": "8646928167584175059",
"name": "YOUNGVISION Beauty",
"logo": "https://p16-oec-general.ttcdn-us.com/tos-alisg-i-aphluv4xwc-..."
},
"brand": "young vision",
"labels": [],
"promo": null,
"video": null,
"rank": null
}
],
"region": "US"
}children are the direct subcategories (empty on a leaf), products the top products the storefront renders for the category (about 15–25).US market only — TikTok Shop resolves the market from the visitor’s location and these endpoints read the US storefront (prices in USD). Lists return what the storefront page renders; there is no further pagination.
Each request costs 5 credits. Failed requests are not charged.
Authorizations
Path Parameters
Category id from a previous response (e.g. 700645 = Health).

