curl --request GET \
--url https://api.growi.io/api/public/v1/tik_tok_shop/products \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.growi.io/api/public/v1/tik_tok_shop/products"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.growi.io/api/public/v1/tik_tok_shop/products', 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://api.growi.io/api/public/v1/tik_tok_shop/products",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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://api.growi.io/api/public/v1/tik_tok_shop/products"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.growi.io/api/public/v1/tik_tok_shop/products")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.growi.io/api/public/v1/tik_tok_shop/products")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"id": "<string>",
"external_product_id": "<string>",
"product_name": "<string>",
"product_image_url": "<string>",
"latest_date": "<string>",
"total_gmv": 123,
"total_gmv_formatted": "<string>",
"total_commission": 123,
"total_commission_formatted": "<string>",
"total_refunded_amount": 123,
"total_refunded_amount_formatted": "<string>",
"total_estimated_flat_fee": 123,
"total_estimated_flat_fee_formatted": "<string>",
"total_units_sold": 123,
"total_units_sold_formatted": "<string>",
"total_sku_orders": 123,
"total_sku_orders_formatted": "<string>",
"total_items_refunded": 123,
"total_items_refunded_formatted": "<string>",
"total_videos": 123,
"total_videos_formatted": "<string>",
"total_lives": 123,
"total_lives_formatted": "<string>",
"total_samples_shipped": 123,
"total_samples_shipped_formatted": "<string>",
"sales_creator_count": 123,
"sales_creator_count_formatted": "<string>"
}
],
"meta": {
"row_count": 123,
"total_pages": 123,
"current_page": 123,
"next_page": 123,
"prev_page": 123,
"page_size": 123
},
"additional_data": {
"total_gmv": 123,
"total_units_sold": 123,
"total_sku_orders": 123,
"total_commission": 123,
"total_items_refunded": 123,
"total_refunded_amount": 123,
"currency_symbol": "<string>",
"currency": "<string>"
}
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}TikTok Shop Products
One row per product, summed across your tracked creators for the date range. Ordered by total GMV descending (no sort parameter).
curl --request GET \
--url https://api.growi.io/api/public/v1/tik_tok_shop/products \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.growi.io/api/public/v1/tik_tok_shop/products"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.growi.io/api/public/v1/tik_tok_shop/products', 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://api.growi.io/api/public/v1/tik_tok_shop/products",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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://api.growi.io/api/public/v1/tik_tok_shop/products"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.growi.io/api/public/v1/tik_tok_shop/products")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.growi.io/api/public/v1/tik_tok_shop/products")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"id": "<string>",
"external_product_id": "<string>",
"product_name": "<string>",
"product_image_url": "<string>",
"latest_date": "<string>",
"total_gmv": 123,
"total_gmv_formatted": "<string>",
"total_commission": 123,
"total_commission_formatted": "<string>",
"total_refunded_amount": 123,
"total_refunded_amount_formatted": "<string>",
"total_estimated_flat_fee": 123,
"total_estimated_flat_fee_formatted": "<string>",
"total_units_sold": 123,
"total_units_sold_formatted": "<string>",
"total_sku_orders": 123,
"total_sku_orders_formatted": "<string>",
"total_items_refunded": 123,
"total_items_refunded_formatted": "<string>",
"total_videos": 123,
"total_videos_formatted": "<string>",
"total_lives": 123,
"total_lives_formatted": "<string>",
"total_samples_shipped": 123,
"total_samples_shipped_formatted": "<string>",
"sales_creator_count": 123,
"sales_creator_count_formatted": "<string>"
}
],
"meta": {
"row_count": 123,
"total_pages": 123,
"current_page": 123,
"next_page": 123,
"prev_page": 123,
"page_size": 123
},
"additional_data": {
"total_gmv": 123,
"total_units_sold": 123,
"total_sku_orders": 123,
"total_commission": 123,
"total_items_refunded": 123,
"total_refunded_amount": 123,
"currency_symbol": "<string>",
"currency": "<string>"
}
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}Response Fields
Each product row contains:| Field | Type | Description |
|---|---|---|
id | String | Same as external_product_id |
external_product_id | String | TikTok Shop product id |
product_name | String | Product name |
product_image_url | String | null | Product image URL |
latest_date | String | null | Most recent date with sales (YYYY-MM-DD) |
total_gmv | Number | GMV in display currency units |
total_units_sold | Integer | Items sold |
total_sku_orders | Integer | SKU orders |
total_commission | Number | Estimated commission |
total_refunded_amount | Number | Refunded amount |
total_items_refunded | Integer | Items refunded |
total_estimated_flat_fee | Number | Estimated flat fees |
total_videos / total_lives | Integer | Content counts featuring this product |
total_samples_shipped | Integer | Samples shipped |
sales_creator_count | Integer | Distinct creators who sold this product |
*_formatted | String | Display-string variant of every metric above |
{ data, meta, additional_data }; meta additionally includes page_size (rows on this page) and additional_data includes product_count.
Request Parameters
| Parameter | Type | Description | Required | Default |
|---|---|---|---|---|
start_date | String | Start of the GMV date range (ISO 8601, YYYY-MM-DD) | Yes | — |
end_date | String | End of the GMV date range (ISO 8601, YYYY-MM-DD) | Yes | — |
page | Integer | Page number | No | 1 |
per_page | Integer | Results per page (max 100) | No | 20 |
search | String | Free-text search | No | — |
campaign_id | Integer | Filter to a campaign or contract in your organization | No | — |
creator_id | Integer | Only count sales from a single Growi creator (user id) | No | — |
platform | String | growi, all, or non_growi | No | growi |
all_contracts | String | 'true' to include creators from all contracts | No | — |
exclude_contests | String | 'true' to exclude TikTok Shop contest campaigns | No | — |
organization_id | Integer | Narrow to a child organization | No | — |
Request Example
curl -X GET "https://api.growi.io/api/public/v1/tik_tok_shop/products?start_date=2026-07-01&end_date=2026-07-31" \
-H "Authorization: Bearer YOUR_PUBLIC_API_KEY" \
-H "Content-Type: application/json"
Response Example
{
"data": [
{
"id": "1729548090545311965",
"external_product_id": "1729548090545311965",
"product_name": "Peach Perfect Multivitamin",
"product_image_url": "https://...",
"latest_date": "2026-07-30",
"total_gmv": 127054.59,
"total_gmv_formatted": "$127,054.59",
"total_units_sold": 4086,
"total_units_sold_formatted": "4,086",
"total_sku_orders": 3900,
"total_sku_orders_formatted": "3,900",
"total_commission": 19058.19,
"total_commission_formatted": "$19,058.19",
"total_videos": 456,
"total_videos_formatted": "456",
"total_lives": 12,
"total_lives_formatted": "12",
"sales_creator_count": 210,
"sales_creator_count_formatted": "210"
}
],
"meta": {
"row_count": 58,
"total_pages": 3,
"current_page": 1,
"next_page": 2,
"prev_page": null,
"page_size": 20
},
"additional_data": {
"total_gmv": 250000.5,
"total_units_sold": 10400,
"total_sku_orders": 9020,
"total_commission": 37500.25,
"total_items_refunded": 310,
"total_refunded_amount": 6100.0,
"currency_symbol": "$",
"currency": "usd"
}
}
Use Cases
- Ranking products by creator-driven GMV
- Tracking how many creators and how much content each product has
- Monitoring refunds and sample shipments per product
- Feeding product performance into inventory and campaign planning
Notes
- Results are always ordered by total GMV descending; there is no sort parameter.
- Totals are summed across your organization’s tracked creators (creators with tracked content), matching the dashboard’s Products tab.
- Requests are rate limited (minimum 2 seconds between requests plus an hourly quota); see the
X-RateLimit-*response headers.
Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Query Parameters
Start of the GMV date range (ISO 8601, YYYY-MM-DD)
End of the GMV date range (ISO 8601, YYYY-MM-DD)
Page number (default 1)
Results per page: 1-100, default 20
x <= 100Free-text search
Filter to a campaign or contract belonging to your organization
Filter to a single Growi creator (user id)
Data scope: growi (only creators on Growi, default), all (all TikTok Shop data), non_growi (creators not on Growi)
growi, all, non_growi Narrow results to a child organization (id) of the API key organization
Set to 'true' to include creators from all contracts
true Set to 'true' to exclude TikTok Shop contest campaigns
true